Question

I have following query

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

Explain Extended give following results.

"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"

This query takes around 100 seconds to execute

Sql Slow has following results

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

Please guide me the way to make it Fast. Thanks in advance

Was it helpful?

Solution

The performance of the query can be achieved by removing the dependent subquery (which is executed for each row) so try this:

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top