Почему полнотекстовый поиск mySQL сильно нагружает процессор?

Ubuntu 16.04. 32 ядра, 128гб RAM. Таблица с товарами содержит 30млн записей (~30ГБ):

CREATE TABLE `table1` (
`id` INT(9) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` TEXT(65535) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`model` TEXT(65535) NULL DEFAULT NULL COLLATE 'utf8_general_ci',    
`vendor` TEXT(65535) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
...
FULLTEXT INDEX `ftxt` (`name`, `model`, `vendor`)
) COLLATE='utf8_general_ci' ENGINE=InnoDB;

Запросы по первичному ключу вида

SELECT * FROM table1 WHERE id>2000000 AND id<=2000010 LIMIT 10;
SELECT * FROM table1 WHERE id IN (20345234,4356352,35737,...) LIMIT 10;

выполняются молниеносно и даже при большом одновременном количестве запросов выполняются мгновенно, а процессор практически простаивает.

А вот запросы по полнотекстовому индексу, например

SELECT * FROM table1 WHERE MATCH(`name`,`model`,`vendor`) AGAINST('samsung galaxy S10' IN BOOLEAN MODE) LIMIT 10;

работают от 0.5 до 1 сек каждый, даже при небольшом количестве потоков запросов. При этом сильно нагружают ядра процессора.

Вопрос: Пожалуйста, объясните мне, почему полнотекстовый поиск (несмотря на построенный индекс и то, что со временем база целиком подгружается в память сервера) сильно грузит процессор и работает медленно?

*То, что база спустя некоторое время полностью находится в памяти, вижу по утилите iotop - чтение с "диска" практически нулевое.

В данном случае меня интересует именно стандартный полнотекстовый поиск mySQL. Про Shpinx и прочее - отдельный разговор.

Как работает полнотекстовый поиск в mysql? Как он ищет по fulltext-индексу? Можно ли как-то оптимизировать, ускорить поиск и снизить нагрузку на процессор?


Ответы (1 шт):

Автор решения: Ghost

Вам нужно ваши подобные запросы посмотреть через команду EXPLAIN, там будет указано как будет выполняться тот или иной запрос

Например:

EXPLAIN SELECT * FROM table1 WHERE MATCH(`name`,`model`,`vendor`) AGAINST('samsung galaxy S10' IN BOOLEAN MODE) LIMIT 10;

Подробнее можно узнать здесь

Скорей всего у вас очень много записей в столбце vendor содержащее samsung, и у вас выбирается огромное количество записей потом только из них берется 10 штук

→ Ссылка