2015-11-20 4 views
0

У меня есть этот запрос:Что является лучшим способом для создания индексов для запроса ниже

select * from `metro_stations` 
where `is_active` = 1 
    and (`title` like '%search%' or `title_en` like '%search%') 

Как создать эффективные индексы, если is_active является TINYINT поля и названия VARCHAR (255)?

А что об этом запросе:

select * from `metro_stations` 
where `is_active` = 1 
and (`title` like '%search%' or 
     `title_en` like '%search%' or 
     `description` like '%search%') 

, если поле Описание текст?

+0

''% search% 'не является SARGable. Подумайте о полном текстовом индексе – lad2025

+0

FYI https://en.wikipedia.org/wiki/Sargable. 'LIKE' является SARGable, но только с'% 'в конце' search% 'см. Пример здесь http://stackoverflow.com/questions/799584/what-makes-a-sql-statement-sargable –

ответ

0

использовать полный индекс текста для каждого столбца. Если использование в запросе «или» использовать отдельно FTS индекс, если использовать «и» индекс Mix FTS (в одном индексе использовать несколько столбцов) Full Text Index

+0

Я добавил два разных полные текстовые индексы для полей title и title_en, но запрос: EXPLAIN EXTENDED выберите 'id' из' metro_stations' где 'is_active' = 1 и (' title' like "% мото%" или 'title_en' как"% мото% ") , похоже, не использует индексы. Как это возможно ? –

+0

select id from metro_stations WHERE match (title) против ('мото' IN BOOLEAN MODE) –

+0

ОК, его ошибка. Спасибо! Как насчет производительности? Является ли это решение лучше, чем использование LIKE '% search%' без каких-либо индексов? –

0
FULLTEXT(title, title_en) 

WHERE is_active = 1 
    AND MATCH(title, title_en) AGAINST ("+search" IN BOOLEAN MODE) 

(Это должно работать либо Ьшо (5.6+) или MyISAM.)

Имейте в виду ограничения «длины слова» и «остановки слов» в FULLTEXT.

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