Оптимизация поиска MySQL для повышения производительности - PullRequest
0 голосов
/ 09 марта 2011

У меня есть массив со списком ключевых слов,

$arr = array('london','england','football',...);

Массив может иметь N th ключевых слов.

Мне нужно использовать это в SQL-запросе, но я не хочу делать слишком много повторений, подобных этому.

select * from t1 where title LIKE('%$arr[0]%') OR title LIKE('%$arr[1]%') [...]

просто нужно лучшее решение, поскольку каждое ключевое слово отфильтровывает записи.

Thnx

Ответы [ 4 ]

1 голос
/ 09 марта 2011
1 голос
/ 09 марта 2011

Одним из решений было бы создание таблицы поиска, которая заполняется значениями rowid и keywordid при каждом создании или изменении строки.

Тогда вы можете пропустить все LIKE и получить гораздо большую производительность.

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

Вы бы просто использовали

SELECT * FROM t1 WHERE id in (SELECT id FROM lookup WHERE keywordid IN ())

А если ключевых слов много, выможно использовать дополнительный запрос больше, чтобы получить идентификаторы ключевых слов, или, если меньше, использовать кэшированную структуру поиска непосредственно в коде, словаре или аналогично.

0 голосов
/ 09 марта 2011

В зависимости от вида (и количества) поисковых запросов, которые вы будете выполнять, вам, возможно, придется подумать об использовании чего-то другого, кроме чистого MySQL.

MySQL сам по себене совсем подходит для полнотекстового поиска:

  • Использование like '%...%' приведет к плохой производительности (сканирование всех строк таблицы)
  • Использование индекса FULLTEXT означает использование MyISAM в качестве механизма хранения.


Если вам нужно выполнить много поисков, может оказаться более интересным инвестировать в решение, посвященное индексации /поиск по тексту, например Solr или Sphinx .

0 голосов
/ 09 марта 2011

Я не уверен, хотите ли вы оптимизировать сам запрос или способы вставки ключевых слов в запрос. Если это последнее, то, что быстро приходит на ум, это:

$query = "SELECT * FROM t1 WHERE title";

foreach($arr as $keyword)
{
    $stack[] = " LIKE '%$keyword%' ";
}

$query .= implode(' OR title ', $stack);

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

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