2016-09-28 2 views
1

Если у вас есть индексированный поле в MySQL InnoDB таблицы (давайте назовем его термин здесь), вы можете использовать только:Как заставить индекс/InnoDB MySQL на срок LIKE% ...%

term LIKE 'step%' 

вид запросов с % символ в конце если вы хотите, чтобы индекс работал. Другими слова:

вы можете сделать индексированный поиск по префиксам только

Существует обходной путь для этого ограничения, которые будут работать в certian случаев.

+0

Если вы должны сканировать весь индекс, так как вы не можете полагаться на его заказ, то, что будет выигрыш в производительности? (В любом случае, я не думаю, что это плохой вопрос.) –

+0

@ ÁlvaroGonzález Это частый вопрос, и я хотел бы поделиться трюком, который я использую для пользователей SO. –

ответ

2

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

Это обходное решение помогает экономить производительность, но оплачивается за счет использования дополнительного объема памяти.

Пример случай

установка Давайте простой пример случай:

term 
------------------ 
... 
Understanding InnoDB clustered indexes 
... 

и пользователь ищут все условия, соответствующие следующий предикат:

term LIKE '%InnoDB%' 

В случае, если упрощать term LIKE 'InnoDB%', эта фраза будет потеряна из поиска.

Обход

  1. Введем R радикал столбца, который будет содержать обращенного термин:

    term          rterm 
    ------------------ 
    ... 
    Understanding InnoDB clustered indexes sexedni deretsulc BDonnI gnidnatsrednU 
    ... 
    
  2. Добавить индекс в колонку R радикал:

    ALTER TABLE `t_term` 
    ADD INDEX `rterm` (`rterm`); 
    

    или уникальный один в зависимости от вашего случая:

    ALTER TABLE `t_term` 
    ADD UNIQUE `rterm` (`rterm`); 
    
  3. Применить поиск по следующему предикату:

    term LIKE 'InnoDB%' OR rterm LIKE 'BDonnI%' 
    

    где 'BDonnI' является перевернутой строкой для 'InnoDB'.

  4. Прибыль!

план запрос

enter image description here

MySQL запрос для заполнения R радикала columnn

MySQL имеет удобную функцию строки REVERSE(). Для того, чтобы заполнить R радикала использования колонков:

UPDATE t_term SET rterm = REVERSE(term) 
+0

Ну, это на самом деле не заставляет использовать индексы для 'LIKE% ...%', как указано в вопросе, не так ли? ; -P –

+1

wow это работает как шарм. спасибо – Learner

+0

@ ÁlvaroGonzález Это определенно нет. Заголовок вопроса предназначен для этого обходного пути, который можно найти через поиск. На практике он имитирует полный индекс путем поиска двух индексов и слияния результатов. –