php - MYSQL 查询、优化 LIKE 和 NOT IN

标签 php mysql full-text-search

我有一个查询需要运行,但当前运行速度极慢。我正在使用的表有近 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/

相关文章:

PHP 内爆(): Invalid arguments passed

php - 共享主机上的 Composer 内存耗尽

c# - 提高从远程数据库获取数据时的性能

mysql - 在 select 语句中设置默认值(不使用 UNION 语句)

search - Elasticsearch 中的索引和搜索分析器:将准确的字符串作为第一个结果时遇到麻烦

mysql - 全文和复合索引以及它们如何影响查询

php - mysql 中存在大量外键?这好吗?

php - 将输入文件放入 FormData jquery 以提交给 PHP

C# 初学者 : If an item from a array was found in a string

php - 更新 3 个图像字段