【问题标题】:Why does a multi-word Doctrine search cause MySQL to use up to 300% CPU?为什么多词 Doctrine 搜索会导致 MySQL 使用高达 300% 的 CPU?
【发布时间】:2010-10-29 13:41:15
【问题描述】:

我有一个使用 Doctrine 的 Searchable 行为的表,它非常适合单字查询。但是我注意到,当查询包含空格时,页面会挂起,并且我无法通过刷新页面等得到任何响应。

如果我在我的 Mac 上打开 Activity Monitor,或者 SSH 然后在 Ububntu 中打开“顶部”,MySQL 正在以高达 300% 的 CPU 运行进程。我必须终止进程才能让事情再次正常运行。

这些是 Doctrine 生成的 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) 

我尝试了一些方法,例如在两个单词周围添加双引号。

谢谢

【问题讨论】:

  • 如果你不能让学说更快地工作,你可能想研究sphinxsearch.com或Lucene
  • 很简单...因为 MySQL 需要处理很多行,所以它使用了很多 CPU。通过EXPLAIN 运行查询,这应该可以告诉你很多关于发生了什么......但是你正在对 3 个临时表进行 3 次连接,所以它会很慢......
  • 某些东西怎么能以 300% cpu 运行?
  • @Petoj:在 3 核 CPU 上,很容易。
  • 我有一个 4 核 cpu,我仍然只使用 100%,但我使用的是 windows...

标签: php mysql search symfony1 doctrine


【解决方案1】:

是否可以让 Doctrine 从查询中删除 GROUP BY

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

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'
        )

,前提是您在 hotel(is_active)hotel_index (keyword) 上有索引

你也可以这样重写:

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' 

这样会更有效率。

【讨论】:

  • 我没有从 Doctrine 中找到任何说明如何自定义自动生成的搜索查询的内容。目前我在想我可能只需要手动复制(正确的)查询并运行它。
猜你喜欢
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
相关资源
最近更新 更多