我有一个查询需要运行,但当前运行速度极慢。我正在使用的表有近 100 万条记录。
我需要做的是搜索具有 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 JOIN,我必须在 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 的全文功能。了解更多信息 here .
此外,您可能想要进行 bool 搜索:
select
t1.name,
t1.stuff
from
my_table t1
where
match(t1.name) against ('+some_name -term1 -term2 -term3' in boolean mode)
关于php - MYSQL 查询、优化 LIKE 和 NOT IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8717188/