Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL查询,喜欢和不喜欢优化_Php_Mysql_Full Text Search - Fatal编程技术网

Php MYSQL查询,喜欢和不喜欢优化

Php MYSQL查询,喜欢和不喜欢优化,php,mysql,full-text-search,Php,Mysql,Full Text Search,我需要运行一个查询,当前运行速度非常慢。我正在使用的表有近100万条记录 我需要做的是搜索具有类似名称的项目:例如“从名称为“%some\u name%”的my_表中选择名称、其他内容” 此外,它还必须能够从搜索结果中排除某些带有通配符的术语,这样它就会变成这样: SELECT name, other, stuff FROM my_table WHERE name LIKE '%some_name%' AND name NOT IN (SELECT name FROM my_table W

我需要运行一个查询,当前运行速度非常慢。我正在使用的表有近100万条记录

我需要做的是搜索具有类似名称的项目:例如
“从名称为“%some\u name%”的my_表中选择名称、其他内容”

此外,它还必须能够从搜索结果中排除某些带有通配符的术语,这样它就会变成这样:

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表添加全文索引并尝试match函数后的实际查询。注意:我无法控制表/列名。我知道它们看起来不好看

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的情况下,您可以使用名为SphinxQL的类似选择的语法,该语法将完全按照需要执行:

SELECT * FROM <sphinx_index_name> WHERE MATCH('some_name -term1 -term2 -term3');
从匹配的地方选择*('some_name-term1-term2-term3');
如中所述(在您的情况下不是操作员)。此外,您还可以启用形态学支持,这可能也会有所帮助


您可以将MySQL和Sphinx查询与

结合使用。my_表上是否有主键或唯一ID?如果是这样的话,做
…可能会更快。。。我不在(从…
中选择id,而不是我简单地做的子选择:如果名称像“%some_name%”,名称不像“%term1%”,名称不像“%term2%”,名称不像“%term3%”,那么速度会更快。此外,如果使用子选择,可能应该使用或而不是AND来分隔条件,除非同时需要它们。所以大都会在执行联接之前创建一个临时表以保存筛选的行(然后联接临时表而不是原始表)比加入庞大的表要快得多。你应该自己进行基准测试。只是别忘了用索引创建表。我用我的查询更新了描述。仍然非常慢。服务器本身非常坚固,内存为18G,CPU速度很快,等等。我是否可以建议
布尔模式
serching()这将添加+和-等符号以要求或排除单词。连接/“不在”的意义是什么。这甚至可以通过对(“+some_name-term1-term2”)说
match(t1.name)来删除连接/“不在”
@JonathanKuhn-很好的建议。我已经好几年没有使用MySQL全文搜索了,所以感谢你填补了这个空白:)修复
对(“+some_name-term1-term2”在布尔模式下)
@JonathanKuhn-谢谢,修复:)@Tyler-是的,它会很慢,直到你给它添加索引。它试图遍历一百万个字符串并比较纯文本。这通常需要一段时间。