У меня есть таблица с 2,5 миллионами записей, по которой мне нужно выполнить полнотекстовый поиск.Например, допустим, я занимаюсь поиском музыки.В настоящее время у меня есть этот лучший и наиболее подходящий способ получения результатов:
SELECT *,
MATCH (title,artist,album) AGAINST ('+KEYwORD' IN BOOLEAN MODE) AS score
FROM `music` AS `Music`
WHERE MATCH (title,artist,album) AGAINST ('+KEYWORD' IN BOOLEAN MODE)
ORDER BY `score` DESC LIMIT 10
Это кажется очень неэффективным, но я просто не знаю лучшего способа сделать это.У меня смехотворно высокая загрузка процессора, и я считаю, что это вызывает проблемы.Кроме того, я также делаю следующий запрос, чтобы получить общее количество результатов для разбивки на страницы:
SELECT COUNT(*) AS `count`
FROM `music` AS `Music`
WHERE MATCH (title,artist,album) AGAINST ('+KEYWORD' IN BOOLEAN MODE)
Мои колонки с заголовками, исполнителями и альбомами находятся сейчас на varchar (255) ..Не уверен, что это лучший вариант.У меня есть полный текст по названию, исполнителю и альбому, а также обычные индексы для этих трех по отдельности (не уверен, если это необходимо).
Что бы вы предложили, чтобы обойти эту высокую загрузку ЦП, что этот поисквызывает?
РЕДАКТИРОВАТЬ: Вот ОБЪЯСНЕНИЕ, как и просили.Извините, я не уверен, как правильно отформатировать его здесь ...
mysql> EXPLAIN SELECT *, MATCH (title,artist,album) AGAINST ('+beatles' IN BOOLEAN MODE) AS score FROM `tracks` AS `Track` WHERE MATCH (title,artist,album) AGAINST ('+beatles' IN BOOLEAN MODE) ORDER BY `score` DESC LIMIT 10;
+----+-------------+-------+----------+---------------+--------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+----------+---------------+--------+---------+------+------+-----------------------------+
| 1 | SIMPLE | Track | fulltext | search | search | 0 | | 1 | Using where; Using filesort |
+----+-------------+-------+----------+---------------+--------+---------+------+------+-----------------------------+
1 row in set (0.01 sec)