我有一个查询需要运行,但当前运行速度非常慢。我正在使用的表有近一百万条记录。
我需要做的是搜索具有相似名称的项目: Example "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中执行它。我在表上有相关列的索引。它在一台服务器上,几乎所有其他查询都能快速处理。
问题是,有没有一种不同的方法,我可以用来做这种类型的查询是快速的?
更新
这是我在将全文索引添加到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)这只是一个简单查询的示例。实际的术语可能有很多。
发布于 2012-01-04 02:57:24
您希望在要搜索的列上实现MySQL的全文功能。有关它的更多信息,请阅读here。
此外,您可能想要执行布尔搜索:
select
t1.name,
t1.stuff
from
my_table t1
where
match(t1.name) against ('+some_name -term1 -term2 -term3' in boolean mode)发布于 2012-01-04 04:02:48
我建议使用外部全文引擎,如Lucene或Sphinx。尤其是当您计划对相对较大的数据集执行搜索查询时。
在Sphinx示例中,您可以使用类似于选择的语法,称为SphinxQL,它将完全按照要求执行操作:
SELECT * FROM <sphinx_index_name> WHERE MATCH('some_name -term1 -term2 -term3');如http://sphinxsearch.com/docs/current.html#extended-syntax中所述(在您的例子中不是运算符)。此外,您还可以启用形态学支持,这可能也很有帮助。
您可以使用http://sphinxsearch.com/docs/current.html#sphinxse组合使用MySQL和Sphinx查询
https://stackoverflow.com/questions/8717188
复制相似问题