MySQL запрос полнотекстового индекса не использует какой-либо индекс?

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

CREATE TABLE IF NOT EXISTS metadata (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title varchar(500),
category varchar(50),
uuid varchar(20),
FULLTEXT(title, category)
) ENGINE=InnoDB;

Когда я выполняю полнотекстовый поиск, это заняло 2,5 с 1M строк. Поэтому я выполняю планировщик запросов, и он не использует какой-либо индекс:

mysql> explain SELECT uuid, title, category, MATCH(title, category) AGAINST ('grimm' IN NATURAL LANGUAGE MODE) AS score FROM metadata HAVING score > 0 limit 20;
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------+
|  1 | SIMPLE      | metadata | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1036202 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------+

Это ожидается? Как я могу ускорить это?

1

Решение

Ваш запрос выбирает каждую строку в таблице, вычисляет совпадение на естественном языке и затем передает результаты (все еще для каждой строки) в предложение HAVING. Это таблица сканирования.

Вместо этого вы должны попытаться поместить поиск с полнотекстовым индексом в предложение WHERE, чтобы уменьшить количество совпадающих строк.

mysql> explain SELECT uuid, title, category FROM metadata
WHERE MATCH(title, category) AGAINST ('grimm' IN NATURAL LANGUAGE MODE)
LIMIT 20;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]