MySQL Optimization - PullRequest
       7

MySQL Optimization

3 голосов
/ 11 февраля 2010

В моей базе 5 миллионов записей .. Структура таблицы:

CREATE TABLE IF NOT EXISTS `music` (
  `id` int(50) NOT NULL auto_increment,
  `artistname` varchar(50) NOT NULL,
  `songname` varchar(50) NOT NULL,
  `duration` varchar(6) NOT NULL,
  `url` varchar(255) NOT NULL,
  `server` int(5) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `artistname` (`artistname`),
  KEY `songname` (`songname`),
  KEY `url` (`url`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

Как мне оптимизировать таблицу, а затем выполнить поиск по полям «имя исполнителя» и «имя песни»?

Извините за плохой английский. Из России с любовью: -D

1 Ответ

6 голосов
/ 11 февраля 2010

Создать FULLTEXT индекс:

CREATE FULLTEXT INDEX fx_music_artist_song ON music (artistname, songname)

и введите следующий запрос:

SELECT  *
FROM    mytable
WHERE   MATCH(artistname, songname) AGAINST ('+queen +bohemian' IN BOOLEAN MODE)

Это будет совпадать для artistname и songname, даже если слова не являются ведущими.

Чтобы соответствовать только исполнителю, вы можете создать дополнительный индекс только для artistname и использовать его в запросе:

SELECT  *
FROM    mytable
WHERE   MATCH(artistname) AGAINST ('+queen' IN BOOLEAN MODE)

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

Обратите внимание, что это предложение будет работать даже без индекса, но в этом случае оно будет намного медленнее.

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