Как я могу заменить / ускорить запрос текстового поиска, который использует LIKE? - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь ускорить мой запрос ...

select PadID from Pads WHERE (keywords like '%$search%' or 
ProgramName like '%$search%' or English45 like '%$search%') AND 
RemovemeDate = '2001-01-01 00:00:00' ORDER BY VersionAddDate DESC

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

... PadID IN (SELECT PadID FROM Keywords WHERE word = '$search') ...

Однако разделение слов из English45 и ProgramName в таблицу слов будет кошмаром.

Есть идеи? РЕДАКТИРОВАТЬ: (также с указанием фактических имен таблиц)

alt text

alt text

alt text

Ответы [ 3 ]

2 голосов
/ 20 декабря 2010

Вы пробовали индексацию FULLTEXT?Вот хорошая статья об этом:

http://devzone.zend.com/article/1304

Также обратите внимание на использование функций SOUNDEX, которые могут помочь, но могут и не помочь.

0 голосов
/ 21 декабря 2010

Jules,

На основе вывода EXPLAIN следует отметить несколько вещей:

  1. WHERE RemoveMeDate ограничивает предложение.
  2. ORDER BY выполняет2-й проход по данным, чтобы отсортировать их.Обратите внимание, что для VersionAddDate нет индекса.

Выбор индекса зависит от всех других запросов, которые вы используете, но для этого конкретного запроса я хотел бы добавить индекс для VersionAddDate.Однако, поскольку MySQL может использовать только один индекс для запроса, индекс будет выглядеть следующим образом:

INDEX `removemedate` (`RemoveMeDate` ASC, `VersionAddDate` ASC)

После выполнения этого EXPLAIN следует читать что-то вроде:

+----+-------------+-------+------+---------------+--------------+---------+--------------+-------------+
| id | select_type | table | type | possible_keys | key          | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+--------------+---------+-------+------+-------------+
|  1 | SIMPLE      | pads  | ref  | removemedate  | removemedate | 4       | const |    1 | Using where |
+----+-------------+-------+------+---------------+--------------+---------+-------+------+-------------+

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

Спасибо.

0 голосов
/ 20 декабря 2010

Jules,

Вы должны предоставить вывод объяснения в запросе.Что-то вроде:

mysql> EXPLAIN select id from mytable WHERE (keywords like '%$search%' or ProgramName like '%$search%' or English45 like '%$search%') AND RemovemeDate = '2001-01-01 00:00:00' ORDER BY VersionAddDate DESC

И, если возможно, структурировать таблицу, выполнив DESC для таблицы.Это поможет нам определить вашу структуру индекса и, если они используются в запросе.

Спасибо.

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