【问题标题】:GROUP BY and ORDER BY clauses cause query to be slowGROUP BY 和 ORDER BY 子句导致查询变慢
【发布时间】:2014-02-11 15:02:04
【问题描述】:

我有一个执行很长时间的以下查询。 article_category 和 article 表都有大约 250k 行。我尝试了一些多列索引,但没有什么可以加快查询速度。当前的 EXPLAIN 是这样的(当前使用的状态索引由 article.status 和 article.published 组成,优化器当前决定使用它)。

您能给我一些建议吗?创建哪个索引来加快查询速度?

1 SIMPLE a ref PRIMARY,status,published status 1 const 109338 Using where;使用临时的;使用文件排序

1 SIMPLE ac ref PRIMARY,fk_article_category_category_id_category_id PRIMARY 4 e15.a.id 1 使用 where

1 SIMPLE c eq_ref PRIMARY PRIMARY 4 e15.ac.category_id 1

SELECT SQL_NO_CACHE `a`.`id`,`a`.`title`,`a`.`perex`,`a`.`published`,`a`.`updated`,`a`.`article_type_id`,`a`.`tag`   ,`ac`.`category_id`,`c`.`name`,`a`.`top_hp`,`ac`.`top_category`,`a`.`is_pr`,`a`.`seo_title`,`c`.`id_domain` 
FROM `article` `a`  
JOIN `article_category` `ac` ON `ac`.`article_id` = `a`.`id` 
JOIN `category` `c` ON `ac`.`category_id`=`c`.`id` 
WHERE `ac`.`category_id` IN (109,118,38,39,40,62,63,119,110,111,112,113,114,115,116,117,121,122) 
AND `a`.`status`='published' AND a.published < "2014-02-03 22:45:00"
GROUP BY `a`.`id` 
ORDER BY `a`.`published` DESC 
LIMIT 0,8

【问题讨论】:

    标签: mysql performance group-by


    【解决方案1】:

    你应该在加入之前限制你的结果,例如像这样(未经测试!):

    SELECT SQL_NO_CACHE `a`.`id`,`a`.`title`,`a`.`perex`,`a`.`published`,`a`.`updated`,`a`.`article_type_id`,`a`.`tag`   ,`ac`.`category_id`,`c`.`name`,`a`.`top_hp`,`ac`.`top_category`,`a`.`is_pr`,`a`.`seo_title`,`c`.`id_domain` 
    FROM 
    (
    SELECT `id` FROM `category` WHERE `id` IN (109,118,38,39,40,62,63,119,110,111,112,113,114,115,116,117,121,122) 
    ) `c` JOIN `article` `a`  
    JOIN `article_category` `ac` ON `ac`.`article_id` = `a`.`id` 
    JOIN ON `ac`.`category_id`=`c`.`id` 
    WHERE `a`.`status`='published' AND a.published < "2014-02-03 22:45:00"
    GROUP BY `a`.`id` 
    ORDER BY `a`.`published` DESC 
    LIMIT 0,8
    

    【讨论】:

    • 这执行(280 秒)甚至更糟(修复后),但感谢您的尝试:-)
    • 也许您可以重新设计查询,在加入之前也执行“ where 'a'.... ”子句
    【解决方案2】:

    终于找到了解决办法。由于 ORDER BY 和 GROUP BY 子句不同,未使用索引。

    http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2017-07-13
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多