2012-03-28 2 views
0

У меня есть базы данных, что я пытаюсь индексMySQL Indexing Database Performance Issue

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

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

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

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

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

Когда я запускаю этот запрос (обратите внимание на приход Al «%» дикая карта):

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

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

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

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

ответ

1

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

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

+0

Работает отлично, спасибо за помощь! – ThreadedLemon