多个左连接和性能
我有如下表:多个左连接和性能
产品 - 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
结果:
问题是MySQL对3个表使用连接类型ALL
。这意味着MySQL执行3次全表扫描,将所有可能性放在一起,然后对那些不符合ON
声明的声明进行排序。为了获得更快的联接类型(例如eq_ref
),您必须在ON
语句中使用的coloumns上放置索引。
请注意,不建议将索引放在每个可能的色彩上。很多索引都会加快SELECT
语句的速度,但由于索引必须存储和管理,因此也会产生开销。这意味着操纵查询如UPDATE
和DELETE
要慢得多。我看到查询在半个小时内只删除了1000条记录。这是一个折衷,你必须决定更经常发生的事情,更重要的是什么。
谢谢迈克。我把索引,现在一切正常完美。 – 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
你可以做,如果你想选择所有的数据。希望它有效。
您可能需要创建非群集覆盖索引。 – 2012-02-22 07:33:13
你使用任何索引方法,如B树等? – DonCallisto 2012-02-22 07:33:40
在'SELECT'前面放置'EXPLAIN'并显示结果。这可以帮助我们找出瓶颈是什么。 – Mike 2012-02-22 07:38:32