Есть ли способ лучше оптимизировать этот полнотекстовый поиск MySQL? Слишком высокая загрузка процессора - PullRequest
1 голос
/ 23 мая 2011

У меня есть таблица с 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)

Ответы [ 2 ]

1 голос
/ 23 мая 2011
0 голосов
/ 27 мая 2011

Некоторые идеи, касающиеся оптимизации полнотекстового поиска в MySQL, см. В моем ответе на Как оптимизировать MySQL Boolean Full-Text Search? (Или чем его заменить?) - C #

...