Важно! Это обходное решение, и оно не подходит для всех случаев. Но в определенных ситуациях это может пригодиться.
Это обходное решение помогает экономить производительность, но оплачивается за счет использования дополнительного объема памяти.
Пример случай
установка Давайте простой пример случай:
term
------------------
...
Understanding InnoDB clustered indexes
...
и пользователь ищут все условия, соответствующие следующий предикат:
term LIKE '%InnoDB%'
В случае, если упрощать term LIKE 'InnoDB%', эта фраза будет потеряна из поиска.
Обход
Введем R радикал столбца, который будет содержать обращенного термин:
term rterm
------------------
...
Understanding InnoDB clustered indexes sexedni deretsulc BDonnI gnidnatsrednU
...
Добавить индекс в колонку R радикал:
ALTER TABLE `t_term`
ADD INDEX `rterm` (`rterm`);
или уникальный один в зависимости от вашего случая:
ALTER TABLE `t_term`
ADD UNIQUE `rterm` (`rterm`);
Применить поиск по следующему предикату:
term LIKE 'InnoDB%' OR rterm LIKE 'BDonnI%'
где 'BDonnI' является перевернутой строкой для 'InnoDB'.
Прибыль!
план запрос
MySQL запрос для заполнения R радикала columnn
MySQL имеет удобную функцию строки REVERSE(). Для того, чтобы заполнить R радикала использования колонков:
UPDATE t_term SET rterm = REVERSE(term)
Если вы должны сканировать весь индекс, так как вы не можете полагаться на его заказ, то, что будет выигрыш в производительности? (В любом случае, я не думаю, что это плохой вопрос.) –
@ ÁlvaroGonzález Это частый вопрос, и я хотел бы поделиться трюком, который я использую для пользователей SO. –