我有以下查询
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
请指导我快速制作它的方法。 提前致谢
答案 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