Mysql Slow Query组与子查询连接

时间:2013-05-14 08:01:32

标签: mysql performance query-optimization mysql-slow-query-log

我有以下查询

select 
  `cs`.sku ,
  group_concat(
    IF(
        (
          (
            SELECT 
               count(id_catalog_category) 
            from 
               `catalog_category` 
            where 
               lft <= `ccg`.lft 
               and  rgt >= `ccg`.rgt
          )=2
       ),
       `ccg`.name_en,
       NULL
    )
) as level_1_categories
from 
  catalog_simple `cs` 
left join `catalog_config` `cc` 
  on `cs`.`fk_catalog_config` = `cc`.`id_catalog_config`
left join `catalog_config_has_catalog_category` `cchcc` 
  on `cc`.`id_catalog_config` = `cchcc`.`fk_catalog_config`
left join `catalog_category` `ccg` 
  on `cchcc`.`fk_catalog_category` = `ccg`.`id_catalog_category` 
group by `cc`.sku

解释扩展给出以下结果。

"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "filtered"  "Extra"
"1" "PRIMARY"   "cs"    "ALL"   NULL    NULL    NULL    NULL    "27384" "100.00"    "Using temporary; Using filesort"
"1" "PRIMARY"   "cc"    "eq_ref"    "PRIMARY"   "PRIMARY"   "4" "pkfas.cs.fk_catalog_config"    "1" "100.00"    ""
"1" "PRIMARY"   "cchcc" "ref"   "uk_id_catalog_config_has_catalog_category,fk_catalog_config"   "uk_id_catalog_config_has_catalog_category" "4" "pkfas.cc.id_catalog_config"    "2" "100.00"    "Using index"
"1" "PRIMARY"   "ccg"   "eq_ref"    "PRIMARY"   "PRIMARY"   "4" "pkfas.cchcc.fk_catalog_category"   "1" "100.00"    ""
"2" "DEPENDENT SUBQUERY"    "catalog_category"  "ALL"   "lft,rgt"   NULL    NULL    NULL    "1739"  "100.00"    "Using where"

此查询大约需要100秒才能执行

Sql Slow有以下结果

Query_time: 95.189445  Lock_time: 0.000000 Rows_sent: 8523  Rows_examined: 242668622

请指导我快速制作它的方法。 提前致谢

1 个答案:

答案 0 :(得分:0)

可以通过删除从属子查询(对每一行执行)来实现查询的性能,所以试试这个:

SELECT 
  `cs`.sku ,
  group_concat(
    IF(
       tmp.za_count = 2,
       `ccg`.name_en,
       NULL
    )
) as level_1_categories
FROM 
  catalog_simple `cs` 
LEFT JOIN `catalog_config` `cc` 
  ON `cs`.`fk_catalog_config` = `cc`.`id_catalog_config`
LEFT JOIN `catalog_config_has_catalog_category` `cchcc` 
  ON `cc`.`id_catalog_config` = `cchcc`.`fk_catalog_config`
LEFT JOIN (
    SELECT
      `ccg`.`id_catalog_category`,
      SUM(IF(`ccg1`.`id_catalog_category` IS NULL,0,1)) as za_count
    FROM `catalog_category` `ccg` 
      ON `cchcc`.`fk_catalog_category` = `ccg`.`id_catalog_category`
    LEFT JOIN `catalog_category` `ccg1` 
      ON `ccg1`.lft <= `ccg`.lft 
      AND  `ccg1`.rgt >= `ccg`.rgt
    GROUP BY
      `ccg`.`id_catalog_category`
) as tmp
    ON tmp.id_catalog_category = `cchcc`.`fk_catalog_category`
group by `cc`.sku