0

サーバーで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と同様に非常に役に立ちました。

4

0 に答える 0