2013-05-14 118 views
1

我有以下查询mysql的慢与子查询

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 

查询组Concat的解释如下结果扩展给。

"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慢有以下结果

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

请指引我,使之快速的方式。 在此先感谢

回答

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 
+0

由于一些修改...它的工作:) – 2013-05-14 12:48:59

+0

Np :)你能告诉我花了多少时间吗?你做了什么修改? – Stephan 2013-05-14 14:43:11

+0

这是最后的子查询。 SELECT 'ccg'.'id_catalog_category', SUM(IF('ccg1'.'id_catalog_category' IS NULL,0,1)),为za_count FROM''catalog_category' ccg' LEFT JOIN''catalog_category' ccg1' ON'ccg1'.lft <='ccg'.lft AND'ccg1'.rgt> ='ccg'.rgt GROUP BY 'ccg'.'id_catalog_category' – 2013-05-18 02:13:30