Псевдо-хэш индексы для слизняков - PullRequest
2 голосов
/ 24 февраля 2012

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

... WHERE `slug` = '$slug'

Мы можем добавить поле sulg_hashв БД и индексировать его.

После этого сделать

UPDATE `table` SET `slug_hash` = CRC32(`slug`)

Тогда нам просто нужно заменить

... WHERE `slug` = '$slug'

на

... WHERE `slug_hash` = CRC32('$slug') AND `slug` = '$slug'

Потому чтоslug_hash поле индексируется, системе нужно меньше времени, чтобы найти нужную нам строку, но это поле не uniq, поэтому мы оставляем в запросе `slug` = '$ slug'.

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

Также мы можем заменить встроенную функцию mysql CRC32 на php CRC32 function.

Проблемы:

  • Для небольших таблиц это будет работать медленнее, чем простой запрос `slug` = '$ slug'.
  • В слишком больших таблицах мы можем иметь много коллизий, поэтому он будет работать медленнее.

Есть ли проблемы, которые делают это изменениене интересно увеличение производительности?

PS $slug экранируется в начале кода.

UPDATE: $slug содержит не латинские символы в моем случае.Я думаю, что это сделает поиск медленнее, верно?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2012

Для небольших таблиц он будет работать медленнее, чем простой slug = '$ slug' запрос.

Это не будет проблемой, поскольку маленькие таблицы в любом случае означают очень быстрый запрос.

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

Так оно и есть. Если вы хотите проверить полное совпадение, вам нужно просмотреть все символы.

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

CREATE INDEX part_of_name ON customer (name(10)); 

Я предпочитаю использовать префиксный индекс ', так как вам не нужно менять запросы, чтобы также проверять хеш, и, что еще важнее, вам не нужно вычислять хеш как на стороне вашего скрипта, так и внутри БД. вычислять хеши не бесплатно! ; -)

0 голосов
/ 24 февраля 2012

Чтобы избежать коллизий, вы можете использовать функцию MD5 для генерации хешей или лучше SHA1.Теоретическая частота столкновений в SHA1 составляет 2 51 , для MD5 - 2 32 См. http://en.wikipedia.org/wiki/Sha1 и http://en.wikipedia.org/wiki/Md5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...