我有一个我需要运行的查询,目前运行速度非常慢。我正在使用的表有近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索引添加并尝试匹配函数后的实际查询。注意:我无法控制表/列名称。我知道他们看起来不太好。
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)
这只是一个简单查询的示例。实际条款可能很多。
答案 0 :(得分:5)
您希望在要搜索的列上实现MySQL的全文功能。阅读更多相关信息here。
此外,您可能想要进行布尔搜索:
select
t1.name,
t1.stuff
from
my_table t1
where
match(t1.name) against ('+some_name -term1 -term2 -term3' in boolean mode)
答案 1 :(得分:1)
我建议使用像Lucene或Sphinx这样的外部全文引擎。特别是如果您计划针对相对较大的数据集触发搜索查询。
在Sphinx案例中,您可以使用名为SphinxQL的类似SELECT的语法,它将完全按照要求执行:
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
结合使用