MYSQL Query, оптимизировать как и не в - PullRequest
2 голосов
/ 03 января 2012

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

Что мне нужно сделать, это поиск предметов с похожим именем: Пример "SELECT name, other, stuff FROM my_table WHERE name LIKE '%some_name%'"

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

SELECT name, other, stuff 
FROM my_table 
WHERE name LIKE '%some_name%' 
AND name NOT IN (SELECT name FROM my_table WHERE name LIKE '%term1%' AND name LIKE '%term2%' AND name LIKE '%term3%')

В довершение всего, у меня есть два ВНУТРЕННИХ СОЕДИНЕНИЯ, и я должен выполнить это на PHP. У меня есть индексы в таблице для соответствующих столбцов. Он находится на сервере, который быстро справляется практически со всеми остальными запросами, которые я могу ему выдать.

Вопрос в том, есть ли другой метод, который я мог бы использовать, чтобы выполнить этот тип запроса, это быстро?

ОБНОВЛЕНИЕ

Это мой фактический запрос после добавления индекса FULLTEXT в таблицу chem и использования функции соответствия. ПРИМЕЧАНИЕ. У меня нет контроля над именами таблиц и столбцов. Я знаю, что они не выглядят хорошо.

CREATE FULLTEXT INDEX name_index ON chems (name)

SELECT f.name fname, f.state, f.city, f.id fid,
cl.alt_facilid_ida, cl.alt_facili_idb,
c.ave, c.name, c.id chem_id,
cc.first_name, cc.last_name, cc.id cid, cc.phone_work
FROM facilities f
INNER JOIN facilitlt_chemicals_c cl ON (f.id = cl.alt_facilid485ilities_ida)
INNER JOIN chems c ON (cl.alt_facili3998emicals_idb = c.id)
LEFT OUTER JOIN facilities_contacts_c con ON (f.id = con.alt_facili_ida)
LEFT OUTER JOIN contacts cc ON (con.alt_facili_idb = cc.id)
WHERE match(c.name) against ('+lead -gas' IN BOOLEAN MODE)

Это просто пример простого запроса. Фактические условия могут быть многочисленными.

Ответы [ 2 ]

5 голосов
/ 03 января 2012

Вы хотите реализовать полнотекстовые возможности MySQL для столбцов, которые вы ищете.Подробнее об этом здесь .

Более того, вы, вероятно, хотите выполнить логический поиск:

select
    t1.name,
    t1.stuff
from
    my_table t1
where
    match(t1.name) against ('+some_name -term1 -term2 -term3' in boolean mode)
1 голос
/ 04 января 2012

Я бы предложил использовать внешний полнотекстовый движок, такой как Lucene или Sphinx.Особенно, если вы планируете запускать поисковые запросы для относительно больших наборов данных.

В случае с Sphinx вы можете использовать SELECT-подобный синтаксис, называемый SphinxQL, который будет работать точно так же, как требуется:

SELECT * FROM <sphinx_index_name> WHERE MATCH('some_name -term1 -term2 -term3');

, как описано в http://sphinxsearch.com/docs/current.html#extended-syntax (в вашем случае это НЕ оператор),Кроме того, вы можете включить поддержку морфологии, которая также может быть полезна.

Вы можете комбинировать запросы MySQL и Sphinx с http://sphinxsearch.com/docs/current.html#sphinxse

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