【发布时间】:2013-11-15 11:41:55
【问题描述】:
我的 MySQL 查询有问题,我无法对其进行优化。
SELECT
p.id,
p.name,
p.sku,
p.type
FROM
xm_products p
LEFT JOIN xm_store_product sp ON p.id = sp.product_id
LEFT JOIN xm_store s ON sp.store_id = s.id
WHERE
s.id = 1
ORDER BY
p.type,
p.name asc
LIMIT
20 OFFSET 0
这个查询很慢:Querytime 2.532s
如果我去掉Order By子句,查询很快:0.0001s
说明显示以下信息:
+----+-------------+-------+--------+-------------------------------------------+----------------------+---------+---------------------------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------------------+----------------------+---------+---------------------------------------+--------+----------------------------------------------+
| 1 | SIMPLE | s | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | sp | ref | IDX_CA42254AB092A811,IDX_CA42254A4584665A | IDX_CA42254AB092A811 | 5 | const | 102157 | Using where |
| 1 | SIMPLE | p | eq_ref | PRIMARY | PRIMARY | 4 | model.sp.product_id | 1 | |
+----+-------------+-------+--------+-------------------------------------------+----------------------+---------+---------------------------------------+--------+----------------------------------------------+
3 rows in set
我有 3 张桌子:
- xm_product 主键 id
- 带有主键 id 的 xm_store
- xm_store_product 索引为 store_id 和 product_id
我尝试在 p.name 和 p.type 上添加索引以及组合索引 (p.name, p.type),但没有帮助。
如何优化此查询的性能?
编辑:
我花了 2 个小时来创建一个 sqlfile。但这里有一些数据。 http://sqlfiddle.com/#!2/2bf8d/1
问题是“分组依据”导致“使用索引;使用临时;使用文件排序”。
如何纠正我的例子?
编辑 2:
De xm_products 表有大约 200'000 条记录。 xm_store_products 大约 400'000。 Query 用于寻呼机,每页限制为 20 个。
【问题讨论】:
-
您好,您可以使用示例值为您的架构创建一个 sqlfiddle(sqlfiddle.com) 链接吗?
-
您是否使用 p.name 和 p.type 上的索引运行了解释?
-
要排序多少条记录?
-
在性能上存在(显着)差异很有意义。我不知道你的桌子有多大,但是 LIMIT 20 只会在没有订单的情况下提高性能。使用 order by,必须首先检索 所有 记录,然后才能发生 order by,而没有 order by,执行在 20 次匹配后停止。也许在您的 order by 子句中使用组合索引以及您可以获得性能的视图。
-
@oerkelens - 你完全正确,我认为你的评论应该是一个答案。
标签: mysql performance