Выполнение mysql-подобного% term% на записях 1B (с индексированным полем) - PullRequest
0 голосов
/ 16 ноября 2018

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

SELECT 
  * 
FROM 
  entity_access 
  JOIN entity ON (entity.id=entity_access.entity_id)
WHERE
  user_id = 144
  AND name LIKE '%format%'

Таблица entity_access будет иметь околомиллиард результатов.Но каждый пользователь должен иметь максимум 5 тысяч записей.Я думал, что LIKE %term% будет тривиально для таблицы из 5 тыс. Строк (до 50 мс), так что, надеюсь, было бы то же самое, если бы у меня был хороший индекс для большой таблицы перед этим?Или я что-то здесь упускаю?

1 Ответ

0 голосов
/ 16 ноября 2018

Две вещи.Во-первых, не имеет значения, сколько всего строк в таблице, потому что индекс на user_id выберет только те строки для сопоставления.Поскольку вы говорите, что для user_id существует около 5 тыс., То этим легко управлять.

Во-вторых, LIKE '%foo%' будет не использовать индекс: ведущий '%' исключает это.Если вы хотите использовать индекс, вам придется принять шаблон LIKE 'foo%'.Если это соответствует сценарию использования, тогда выполненный запрос будет работать нормально.

Если какое-либо из указанных выше условий не выполняется, рассмотрите возможность использования специальной поисковой системы (например, Sphinx или roll-).самостоятельно с помощью радикальных деревьев ) или материализуйте свой поиск в более индексируемый формат (например, используя Полнотекстовый поиск MySQL ).

...