Может ли INSTR () в MySQL получить пользу от индекса? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть таблица пользователей, которая выглядит примерно так для тестирования:

USER
----------------------------------
id   username           name
1    "djangoIsAwesome"  "Ale"
2    "craze123"         "John"
3    "hope this works"  "JJ"
4    "Rage"             "Ludo"
5    "coolguy1996"      "Frank"

Мне нужно выполнять чрезвычайно производительные запросы, которые отвечают, когда кто-то вводит поисковый запрос пользователя. Обычно можно использовать стратегию LIKE% string%, но я не могу себе этого позволить, поскольку таблица USER имеет миллионы строк.

Я создал полнотекстовый индекс для (имя пользователя, имя), но кажется, что полнотекстовые индексы делают не поддерживает запросы подстрока .

Кажется, мое последнее средство - использовать INSTR (). Может ли какой-либо индекс столбца использовать функцию INSTR ()?

Примеры запросов:

«J», «wesome», «96», «k»

1 Ответ

1 голос
/ 19 июня 2020

Использование функций и операторов почти всегда исключает использование индексов. INSTR() определенно относится к этой категории. LIKE с постоянным шаблоном и без подстановочных знаков в начале шаблона является исключением.

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

Вы также можете реализовать нечто подобное в MySQL, используя n-граммы. Однако это потребует отдельной структуры данных и некоторого усложнения.

Вы также можете реализовать это, используя полнотекстовый индекс, но изменяя данные при вводе. Например, вы можете извлечь соседние трехбуквенные комбинации и добавить их в индекс, так:

'Frank' --> 'Frank Fra ran ank'
...