【发布时间】:2012-02-22 16:16:58
【问题描述】:
我有以下表格:
产品 - 4500 条记录
字段:id、sku、名称、别名、价格、special_price、数量、desc、照片、manufacturer_id、model_id、hits、publishing
products_attribute_rel - 35000 条记录
字段:id、product_id、attribute_id、attribute_val_id
attribute_values - 243 条记录
字段:id、attr_id、值、排序
制造商 - 29 条记录
字段:id、title、publishing
模型 - 946 条记录
字段:id、manufacturer_id、title、publishing
所以我通过一个查询从这些表中获取数据:
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
这个查询慢得要命。 mysql需要数百秒来处理它。
那么如何改进这个查询呢?对于小数据块,它可以工作
非常好。但我想一切都毁了products_attribute_rel 桌子,
有 35000 条记录。
您的帮助将不胜感激。
已编辑
EXPLAINSELECT 查询的结果:
【问题讨论】:
-
您可能需要创建非集群覆盖索引。
-
你有没有使用b-tree之类的索引方法?
-
将
EXPLAIN放在SELECT前面,然后向我们展示结果。这可能有助于我们找出瓶颈是什么。 -
我已经编辑了我的帖子。所以现在您可以在屏幕截图中看到 EXPLAIN 查询结果。
-
灾难不是 35K 行的(小)表。这是您在 5 个表中的 3 个上没有索引(除了 PRIMARY KEYs)。在用于连接的每一列上添加一个索引。
标签: mysql