Когда хэш-индексы становятся разумными?


4

MySQL изначально не поддерживает индексы хэша. Таким образом, создание псевдо-хэш-столбца и создание индекса в хэш-столбце требует некоторого мышления.

И, кажется, широко известно, что если текстовое поле длинное, то хэши стоят накладных расходов, которые им требуются. Но как долго текст должен начинать думать о хеше?

Если я намереваюсь использовать 128-битный хэш, то сколько порогов символов будет достаточным минимумом для текстового столбца?

Редактировать подробности, перечисленные в моей другой вопрос может быть полезной https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram

  0

Какое у вас? Индекс входит в игру только тогда, когда в форме будут использоваться запросы, которые оптимизатор запросов будет использовать. Какова природа данных? Какие типы запросов вы будете делать, включая эти данные? 14 сен. 112011-09-14 18:18:53

  0

Вот описание проекта http://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram 14 сен. 112011-09-14 18:49:42

3

Его начало становиться разумным, когда оно начинает сохранять ваш диск. Но в то же время он начинает принимать вашу вычислительную силу.

В настоящее время дисковое пространство считается дешевым, но если вы используете SSD, то это не так дешево. Поскольку вам нужно точное совпадение, это не займет слишком много процессора, поэтому это может быть лучшим вариантом.

И точный ответ на ваш вопрос о длине текстового столбца для удовлетворения использования хешей может варьироваться в зависимости от множества факторов, начиная с навыка DBA для загрузки на систему.

Но если вы сохраняете более 50% ОЗУ с использованием хэшей, а общая оперативная память составляет не менее 2 ГБ, я думаю, что, возможно, стоит пройти этот маршрут, иначе это может быть ненужная репетиция.


3

Я не уверен, каковы ваши причины для желающих индекса хэш.

Но если вы ищете индексирование столбцов text/varchar, вы можете перейти с помощью MyISAM/full-text или использовать что-то внешнее, например Sphinx или Lucene.

Вы также можете создать дополнительный столбец с хешированной версией другого и до тех пор, пока его 1000 байтов или меньше, тогда он может быть проиндексирован MySQL.

Надеюсь, я ответил на ваш вопрос.

  0

Моя причина для поиска индекса псевдо хэша потому, что моя таблица содержит более 150 миллионов записи, и у меня ограниченная память (8 ГБ), поэтому я хочу оптимизировать свои индексы и не хочу помещать индекс в текстовый столбец, потому что он будет потреблять слишком много ОЗУ. 14 сен. 112011-09-14 17:55:51

  0

Вы можете (и должны) указать, сколько символов столбца текстового столбца вы хотите индексировать.Как и в mytextcolumn (1000) - 1000 - предел. Я бы позволил MySQL обрабатывать часть памяти, поскольку она очень хороша с этой стороны. Альтернативно, использование Sphinx для этих вещей, вероятно, было бы самым подходящим инструментом для работы. 15 сен. 112011-09-15 06:58:59

  0

Почему я должен помещать индексный столбец текста, когда он имеет переменную длину вместо создания столбца хеша и помещает уникальное ограничение в хэш-столбец. Единственная проблема при индексировании столбца хэша сводится к минимуму столкновения как можно ниже. 15 сен. 112011-09-15 16:42:11

  0

Вы можете создать еще один хеш-столбец и проиндексировать его, а также добавить свой собственный код в свое приложение, чтобы искать его таким образом. Я бы просто сказал, что это проблема, которая уже решена с использованием других инструментов и которая в значительной степени была проверена другими людьми. Если вы хотите увидеть, работает ли ваш путь и он менее сложный, тогда все мои средства, попробуйте. 16 сен. 112011-09-16 10:41:14

  0

На самом деле эти инструменты предназначены для полнотекстового поиска, такого как сфинкс. Но я больше заинтересован здесь знать, когда становится возможным взять 16 байтов хэшей. Например, вместо хранения 100 байт текстового столбца (при добавлении индекса) стоит использовать 16 байтов. И самое главное, требуется только точное совпадение, а не сканирование диапазона. 16 сен. 112011-09-16 18:45:01


0

Прочитав ваше описание, я увидел, как будет иметь смысл хэш. Однако, когда вы говорите об использовании памяти, размер столбца индекса не делает невозможным поиск большого набора данных. Основной технологией индекса mysql является btree. Бритвы делятся и побеждают.

Конкретный совет, который я могу дать, заключается в следующем: предположим, вы собираетесь использовать хеш-память md5(). Для максимальной эффективности вы должны сделать хеш основным ключом таблиц двигателей innodb, где хэш - это символ (32). Поскольку innodb имеет кластеризованные индексы, извлечение данных будет сохраняться на чтениях на диске, а также уменьшена работа, которую необходимо выполнить при использовании символа, поскольку вы сможете это сделать, так как результат хеша md5() никогда не изменяется ,

  0

Когда цель состоит в том, чтобы сохранить ОЗУ, то использование InnoDB было бы разумным решением? 15 сен. 112011-09-15 16:44:51