Php 为什么多词搜索会导致MySQL使用高达300%的CPU?

Php 为什么多词搜索会导致MySQL使用高达300%的CPU?,php,mysql,search,symfony1,doctrine,Php,Mysql,Search,Symfony1,Doctrine,我有一个使用Doctrine的可搜索行为的表,它很适合单词查询。然而,我注意到,当一个查询包含一个空格时,页面会挂起,我无法从刷新页面中得到任何响应 如果我在Mac上打开Activity Monitor,或者SSH,然后在UBNTU中打开“top”,MySQL将以高达300%的CPU运行进程。我必须终止这个进程,以便让事情再次正常运行 以下是条令生成的SQL查询: 对于单词查询: SELECT COUNT(*) AS num_results FROM hotel h WHERE h.is_act

我有一个使用Doctrine的可搜索行为的表,它很适合单词查询。然而,我注意到,当一个查询包含一个空格时,页面会挂起,我无法从刷新页面中得到任何响应

如果我在Mac上打开Activity Monitor,或者SSH,然后在UBNTU中打开“top”,MySQL将以高达300%的CPU运行进程。我必须终止这个进程,以便让事情再次正常运行

以下是条令生成的SQL查询:

对于单词查询:

SELECT COUNT(*) AS num_results FROM hotel h WHERE h.is_active = '1' 
AND h.id IN (SELECT id FROM hotel_index WHERE keyword = 'samui' GROUP 
BY id) 
对于包含空格的多词查询:

SELECT COUNT(*) AS num_results FROM hotel h WHERE h.is_active = '1' 
AND h.id IN (SELECT id FROM hotel_index WHERE id IN (SELECT id FROM 
hotel_index WHERE keyword = 'sala') AND id IN (SELECT id FROM 
hotel_index WHERE keyword = 'samui') GROUP BY id) 
我试过一些方法,比如在两个单词周围加上双引号


谢谢

是否可以从查询中删除
分组依据

它没有任何意义,只会降低性能。这将表现得更好:

SELECT  COUNT(*) AS num_results
FROM    hotel h
WHERE   h.is_active = '1' 
        AND h.id IN
        (
        SELECT id
        FROM   hotel_index
        WHERE  keyword = 'sala'
        )
        AND h.id IN
        (
        SELECT id
        FROM   hotel_index
        WHERE  keyword = 'samui'
        )
,前提是您在
酒店(处于活动状态)
酒店索引(关键字)

您也可以这样重写它:

SELECT  COUNT(*) AS num_results
FROM    (
        SELECT  id
        FROM    hotel_index
        WHERE   keyword IN ('sala', 'samui')
        GROUP BY
                id
        HAVING COUNT(*) = 2
        ) q
JOIN    hotel h
ON      h.id = q.id
        AND h.is_active = '1' 

这将更加有效。

如果你不能让教义发挥作用,你可能需要研究一下fasterIt的简单。。。因为MySQL需要处理很多行,所以它使用了很多CPU。通过运行查询,这应该会告诉您很多关于发生了什么。。。但是你在3个临时表上进行3次连接,所以速度会很慢……有些东西怎么能以300%的cpu运行呢?@Petoj:在3核
cpu
上,很容易。我有一个4核cpu,我仍然只使用100%,但我使用windows……我还没有从理论中找到任何指示如何自定义自动生成的搜索查询的东西。目前,我想我可能需要手动复制(正确的)查询并运行它。