Запрос MYSQL, оптимизация LIKE и NOT IN

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

Мне нужно выполнить поиск элементов с именем LIKE: Пример "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%') 

Прежде всего, у меня есть два INNER JOINs, и я должен выполнить его на 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) 

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

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

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

 select t1.name, t1.stuff from my_table t1 where match(t1.name) against ('+some_name -term1 -term2 -term3' in boolean mode) 

Я бы предложил использовать внешний полнотекстовый движок, такой как 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 (оператор NOT в вашем случае). Кроме того, вы можете включить поддержку морфологии, которая также может быть полезна.

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