2013-09-26 5 views
0

Этот MySQL запрос запущенной на большом (около 200 000 записей, 41 столбцов) таблицы MyISAM:.Лучший способ использовать индексы на большой MySQL, как запрос

выберите t1 * от table t1, где t1 1 и. inactive = '0' и (t1. code как '% searchtext%' или t1. name как '% searchtext%' или t1. ext как '% searchtext%') order by t1. id desc LIMIT 0, 15

ID является основным показателем.

Я попытался добавить индекс с несколькими столбцами во все 3 найденных (похожих) столбца. работает нормально, но результаты подаются в автоматически заполненной таблице ajax на веб-сайте, а 2-секундная задержка возврата слишком медленная.

Я также попытался добавить отдельные индексы на все 3 столбца и индекс полнотекстового текста на все 3 столбца без значительного улучшения.

Какой был бы лучший способ оптимизировать этот тип запроса? Я хотел бы достичь производительности менее 1 секунды, это выполнимо?

ответ

0

Лучшее, что вы можете сделать, это реализовать пейджинг. Независимо от того, что вы делаете, стоимость ввода-вывода будет огромной. Если вы вернете только одну страницу записей, 10/25/или что-то еще, что поможет.

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

0

Вы можете создать полнотекстовый индекс, который охватывает три столбца: code, name и ext. Затем выполнить полнотекстовый запрос с использованием функции MATCH() AGAINST():

select t1.* 
from table t1 
where match(code, name, ext) against ('searchtext') 
order by t1.id desc 
limit 0, 15 

Если опустить предложение ORDER BY строки сортируются по умолчанию, используя функцию MATCH значение результата релевантности. Для получения дополнительной информации читайте Full-Text Search Functions documentation.

Как отмечает @Vulcronos, оптимизатор запросов не может использовать индекс, если используется оператор LIKE с выражением, которое начинается с подстановочного знака %.

Смежные вопросы