サーバーでDjangoORM 、eav-django、mysql5.1を使用しています。このようなクエリを実行すると、私の小さなサーバー(実際には私の4core開発マシンも)が完全に停止します。これは、それ自体、つまりbon_attrテーブルを参照しているためですか?
物事を少しスピードアップするための良いヒントはありますか(キャッシュすることを除く)?
SELECT DISTINCT `bon_property`.`id`, `bon_property`.`company_id`, `bon_property`.`remote_id`, `bon_property`.`category_id`, `bon_property`.`slug`, `bon_property`.`address_id`, `bon_property`.`address_given_id`, `bon_property`.`agent_contact_id`, `bon_property`.`date_modyfied`, `bon_property`.`status`
FROM `bon_property`
INNER JOIN `bon_attr` ON (`bon_property`.`id` = `bon_attr`.`entity_id`)
INNER JOIN `bon_attr` T5 ON (`bon_property`.`id` = T5.`entity_id`)
INNER JOIN `bon_attr` T6 ON (T5.`id` = T6.`id`)
INNER JOIN `bon_attr` T10 ON (`bon_property`.`id` = T10.`entity_id`)
INNER JOIN `bon_attr` T11 ON (T10.`id` = T11.`id`)
WHERE ((`bon_attr`.`value_float` <= 1
AND `bon_attr`.`entity_type_id` = 18 )
AND (`bon_attr`.`schema_id` = 23
AND `bon_attr`.`entity_type_id` = 18 )
AND (T6.`value_float` >= 1
AND T6.`entity_type_id` = 18 )
AND (T6.`schema_id` = 23
AND T6.`entity_type_id` = 18 )
AND `bon_property`.`company_id` = 27
AND (T11.`value_float` >= 200000
AND T11.`entity_type_id` = 18 )
AND (T11.`schema_id` = 42
AND T11.`entity_type_id` = 18 )
AND `bon_property`.`status` = 1 )
ORDER BY `bon_property`.`id` ASC;
このクエリでさえサーバーを殺しています:
SELECT * FROM `bon_property`
INNER JOIN `bon_attr` T3 ON (`bon_property`.`id` = T3.`entity_id`)
INNER JOIN `bon_attr` T4 ON (T3.`id` = T4.`id`)
INNER JOIN `bon_attr` T8 ON (`bon_property`.`id` = T8.`entity_id`)
WHERE `bon_property`.`status` = 1
約4分後、slow-queryログにQuery_time:430.093778 Lock_time:0.000247 Rows_sent:0 Rows_examined:164591659と表示され、膨大な数の行が検査されました...
my config:http ://dpaste.com/hold/833263/
同様のクエリでexplainを編集します。
1 PRIMARY T4 ref PRIMARY,entity_type_id,bon_attr_299a9dd7,bon_attr_... bon_attr_6f9d19 4 const 9770 Using where; Using temporary; Using filesort
1 PRIMARY T9 ref PRIMARY,entity_type_id,bon_attr_299a9dd7,bon_attr_... bon_attr_6f9d19 4 const 12037 Using where
1 PRIMARY T3 eq_ref PRIMARY PRIMARY 4 om.T4.id 1 Using where
1 PRIMARY bon_property eq_ref PRIMARY,bon_property_543518c6 PRIMARY 4 om.T3.entity_id 1 Using where
1 PRIMARY T8 eq_ref PRIMARY PRIMARY 4 om.T9.id 1 Using where; Distinct
5 DEPENDENT SUBQUERY U1 ref entity_type_id,bon_attr_299a9dd7,bon_attr_6f9d19 entity_type_id 12 const,func,const 1 Using where; Using index
5 DEPENDENT SUBQUERY U0 eq_ref PRIMARY PRIMARY 4 func 1 Using where; Using index
4 DEPENDENT SUBQUERY U1 ref entity_type_id,bon_attr_299a9dd7,bon_attr_147166d7 entity_type_id 8 const,func 17 Using where; Using index
4 DEPENDENT SUBQUERY U0 eq_ref PRIMARY PRIMARY 4 func 1 Using where; Using index
3 DEPENDENT SUBQUERY U1 ref entity_type_id,bon_attr_299a9dd7,bon_attr_6f9d19 entity_type_id 12 const,func,const 1 Using where; Using index
3 DEPENDENT SUBQUERY U0 eq_ref PRIMARY PRIMARY 4 func 1 Using where; Using index
2 DEPENDENT SUBQUERY U1 ref entity_type_id,bon_attr_299a9dd7,bon_attr_147166d7 bon_attr_147166d7 5 const 1 Using where
2 DEPENDENT SUBQUERY U0 eq_ref PRIMARY PRIMARY 4 func 1 Using where; Using index
編集2はい、それはそれをさらに索引付けする問題でした。EXPLAINはDukeSilverと同様に非常に役に立ちました。