MySQL помощь / предложения по оптимизации запроса к большой базе данных - PullRequest
1 голос
/ 01 января 2012

У меня есть MyISAM MySQL таблица с:

CREATE TABLE IF NOT EXISTS `songs` (
  `rid` int(11) NOT NULL auto_increment,
  `aid` int(11) NOT NULL,
  `song_title` varchar(256) NOT NULL,
  `download_url` varchar(256) NOT NULL,
  PRIMARY KEY  (`rid`),
  UNIQUE KEY `download_url` (`download_url`),
  KEY `song_title` (`song_title`),
  FULLTEXT KEY `song_title_2` (`song_title`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1

В нем около 14 миллионов строк. Я впервые обращаюсь с такой большой базой данных, и я не особо заботился об оптимизации раньше. Я пробовал разные вещи, чтобы проверить скорость и точность.

1) Полный текст

select song_title from songs 
where match (song_title) againt ('search term') limit 0, 50
-- This gives me very unreliable results but speed is good.

2) НРАВИТСЯ

select song_title from songs 
where song_title LIKE '%search term%' limit 0, 50
-- Moderate matching results, speed is good when the query is 
-- easily able to fetch the first 50 results... but when i 
-- search for a term that does not exist then... here is the result..
-- MySQL returned an empty result set (i.e. zero rows). ( Query took 107.1371 sec )

3) Несколько LIKE

select song_title from songs 
where song_title like '%word_1%' and 
      song_title like '%word_2%' and 
      song_title like '%word_3%' and 
      song_title like '%word_N%' LIMIT 0, 50;
-- It takes about 0.2 seconds when the search terms are easily found.
-- Ran this exact above query just now to find the execution time when 
-- no results are found.
-- MySQL returned an empty result set (i.e. zero rows). ( Query took 30.8625 sec )

Что мне нужно, так это советы и предложения по оптимизации базы данных / запросов относительно скорости и точности.

Я не могу использовать другую поисковую систему, такую ​​как sphinx, так как у меня нет доступа за пределами корня сайта и я не могу попросить парней, управляющих сервером, настроить его.

Ответы [ 2 ]

1 голос
/ 01 января 2012

MySQL не может создать индекс, который будет охватывать LIKE '% word%' запрос с ведущим знаком процента из-за природы индекса B-дерева, который использовался для этого типа индекса.Он будет использовать индекс для поиска префиксов, например LIKE 'word%' .Обратите внимание, что запросы LIKE вообще не охватываются полнотекстовыми индексами MySQL.Единственными запросами, охватываемыми полнотекстовым индексом MyISAM, являются MATCH ... AGAINST ...

Принимая во внимание размер вашего набора данных, вам необходим внешний поисковик, особенно если вы планируетеувеличить количество данных, которые вы ищете.

У меня нет подробной информации о вашей хостинг-среде, но если у вас есть SSH-доступ к хост-серверу, я считаю, что вы можете установить и запустить Sphinx как непривилегированный пользователь.Установите префикс местоположения с помощью скрипта ./configure для своего домашнего каталога (но, пожалуйста, убедитесь, что он недоступен из Интернета) следующим образом:

./configure --prefix=/path/to/your/home

, а затем выполните

make && make install

Затем создайтеНастройте sphinx, как описано в http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/, и, наконец, запустите демон, запустив searchd из командной строки:

/path/to/your/home/bin/searchd

Надеюсь, это поможет.

1 голос
/ 01 января 2012

В запросе, использующем подобное «% text%», индекс не используется. Если вы ищете хорошую производительность, используйте полнотекстовую версию, даже если она не даст точных результатов. Если можно использовать команду explain select ..., чтобы просмотреть, какие индексы используются в вашем запросе.

Вы можете проверить больше информации здесь: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

...