Индексирование для операций BINARY LIKE в MySQL - PullRequest
2 голосов
/ 15 апреля 2019

Я знаю, что varchar_pattern_ops существует в Postgresql для быстрого поиска по индексу в запросе LIKE, но есть ли подобная функциональность для MySQL?

В настоящее время у меня есть установка Django-MySQL, где у меня есть этот запрос, который выполняется в неиндексированном поле и с операцией BINARY LIKE, и для его завершения требуется более минуты.

Мой запрос - это частичный поиск с начала текста - text%.

Это структура таблицы. На самом деле таблица содержит более 20 полей, но я включил только первичный ключ и поле, которое я ищу в

+---------+---------------+------+-----+---------+-------+

| Field   | Type          | Null | Key | Default | Extra |

+-------------------------+---------------+------+-----+--

| id      | varchar(255)  | NO   | PRI | NULL    |       |

| mid     | varchar(255)  | NO   | MUL | NULL    |       |

А это запрос -

select count(*) from table where mid binary like 'text%';

Это индексы -

PRIMARY KEY index has cardinality 102820460
mid index has cardinality 756032

1 Ответ

1 голос
/ 15 апреля 2019

Делайте тот факт, что MySQL индексирует левую часть строки.

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

 SELECT * FROM your_table WHERE field LIKE "text%" # can use an index

но помните, что для индекса существует ограничение в 767 байт

Из Mysql DOC

Индекс B-дерева можно использовать для сравнения столбцов в выражениях, которые используйте операторы =,>,> =, <, <= или BETWEEN. Индекс также может быть используется для сравнений LIKE, если аргумент LIKE является константной строкой это не начинается с символа подстановки. </p>

https://dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...