У меня есть запрос, который мне нужно выполнить, который в настоящее время работает очень медленно. Таблица, с которой я работаю, содержит около 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)
Это просто пример простого запроса. Фактические условия могут быть многочисленными.