1

次のクエリがあります

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

速くする方法を教えてください。前もって感謝します

4

1 に答える 1

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
于 2013-05-14T08:21:37.890 に答える