多个左连接和性能

问题描述:

我有如下表:多个左连接和性能

产品 - 4500个记录

字段:ID,SKU,姓名,别名,价格,special_price,数量,说明,照片,MANUFACTURER_ID,MODEL_ID ,命中,出版

products_attribute_rel - 35000个记录

字段:ID,PRODUCT_ID,attribute_id,attribute_val_id

ATTRIBUTE_VALUES - 243个记录

字段:ID,attr_id,价值,订货

厂商 - 共有29个记录

字段:ID,标题,出版

模型 - 946条记录

字段:ID,MANUFACTURER_ID,标题,发布

所以我通过一个查询得到这些表格数据:

SELECT jp.*, 
     jm.id AS jm_id, 
     jm.title AS jm_title, 
     jmo.id AS jmo_id, 
     jmo.title AS jmo_title 
FROM `products` AS jp 
LEFT JOIN `products_attribute_rel` AS jpar ON jpar.product_id = jp.id 
LEFT JOIN `attribute_values` AS jav ON jav.attr_id = jpar.attribute_val_id 
LEFT JOIN `manufacturers` AS jm ON jm.id = jp.manufacturer_id 
LEFT JOIN `models` AS jmo ON jmo.id = jp.model_id 
GROUP BY jp.id HAVING COUNT(DISTINCT jpar.attribute_val_id) >= 0 

该查询是缓慢的地狱。它需要数百秒的时间来处理它。 那么如何改进这个查询呢?有了小数据块,它可以很好地工作于 。但我猜一切都毁了products_attribute_rel表,其中 有35000条记录。

您的帮助,将不胜感激。

编辑SELECT查询

EXPLAIN结果:

EXPLAIN results of the SELECT query

+1

您可能需要创建非群集覆盖索引。 – 2012-02-22 07:33:13

+0

你使用任何索引方法,如B树等? – DonCallisto 2012-02-22 07:33:40

+2

在'SELECT'前面放置'EXPLAIN'并显示结果。这可以帮助我们找出瓶颈是什么。 – Mike 2012-02-22 07:38:32

问题是MySQL对3个表使用连接类型ALL。这意味着MySQL执行3次全表扫描,将所有可能性放在一起,然后对那些不符合ON声明的声明进行排序。为了获得更快的联接类型(例如eq_ref),您必须在ON语句中使用的coloumns上放置索引。

请注意,不建议将索引放在每个可能的色彩上。很多索引都会加快SELECT语句的速度,但由于索引必须存储和管理,因此也会产生开销。这意味着操纵查询如UPDATEDELETE要慢得多。我看到查询在半个小时内只删除了1000条记录。这是一个折衷,你必须决定更经常发生的事情,更重要的是什么。

要获得有关MySQL连接类型的更多信息,请查看this
更多关于指标here

+0

谢谢迈克。我把索引,现在一切正常完美。 – Bounce 2012-02-22 08:21:26

表数据与其说是巨大的,它的服用几百秒。表模式有些问题。请做适当的索引。那将会加速。

select distinct 
jm.id AS jm_id, 
jm.title AS jm_title, 
jmo.id AS jmo_id, 
jmo.title AS jmo_title 
from products jp, 
products_attribute_rel jpar, 
attribute_values jav, 
manufacturers jm 
models jmo 
where jpar.product_id = jp.id 
and jav.attr_id = jpar.attribute_val_id 
and jm.id = jp.manufacturer_id 
and jmo.id = jp.model_id 

你可以做,如果你想选择所有的数据。希望它有效。