Проблема производительности индексации базы данных MySQL - PullRequest
0 голосов
/ 28 марта 2012

У меня есть база данных, которую я пытаюсь проиндексировать

Индекс, который я создал, выглядит следующим образом:

CREATE INDEX <name> ON geoplanet_places(name(15));

Когда я запускаю следующий запрос:

SELECT * FROM geoplanet_places WHERE name LIKE "vancouver%";

Результат возвращается менее чем за 1 секунду

Когда я запускаю этот запрос (обратите внимание на дополнительный символ '%'):

SELECT * FROM geoplanet_places WHERE name LIKE "%vancouver%";

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

База данных содержит более 5 миллионов записей, я понимаю, почему она замедляется. Что я хотел бы знать, так это то, есть ли в любом случае символ подстановки перед именем без столь значительного снижения производительности в MySQL.

Заранее спасибо.

1 Ответ

1 голос
/ 28 марта 2012

Индексы MySQL создаются из передней части столбца - первый запрос ищет «Ванкувер» в начале столбца - полностью в пределах 15 символов индекса.Однако второй запрос ищет в столбце 'vancouver' где угодно - нет никакой гарантии, что он будет в пределах 15 символов индекса (и я был бы очень удивлен, если бы индекс мог посмотретьгде-то, кроме начала секции индексированных строк) - если вы посмотрите на план запроса, вы, вероятно, увидите табличное сканирование, в котором механизм последовательно просматривает все значения в столбце.

Это выглядит так, как будтовам следует изучить индекс MySQL FULLTEXT - в прошлый раз, когда я смотрел на него, он был недостаточно хорош для создания поисковой системы, но это может решить вашу проблему (похоже, что современный MySQL поддерживает индексы FULLTEXT для таблиц InnoDBа также таблицы MyISAM, которыми оно исторически ограничивалось).

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