【发布时间】:2010-07-26 13:25:23
【问题描述】:
我有一个表 1 和表 2。
表 1 PARTNUM - ID_BRAND partnum 是主键 id_brand 已“编入索引”
表 2 ID_BRAND - BRAND_NAME id_brand 是主键 brand_name 已“编入索引”
表 1 包含 100 万条记录,表 2 包含 1.000 条记录。
我正在尝试使用 EXPLAIN 优化一些查询,但经过多次尝试后,我走到了死胡同。
EXPLAIN
SELECT pm.partnum, pb.brand_name
FROM products_main AS pm
LEFT JOIN products_brands AS pb ON pm.id_brand=pb.id_brand
ORDER BY pb.brand ASC
LIMIT 0, 10
查询返回这个执行计划:
ID, SELECT_TYPE, TABLE, TYPE, POSSIBLE_KEYS, KEY, KEY_LEN , REF, ROWS, EXTRA
1, SIMPLE, pm, range, PRIMARY, PRIMARY, 1, , 1000000, Using where; Using temporary; Using filesort
1, SIMPLE, pb, ref, PRIMARY, PRIMARY, 4, demo.pm.id_pbrand, 1,
MySQL 查询优化器在执行计划中显示临时 + 文件排序。 我怎样才能避免这种情况?
“邪恶”在 ORDER BY pb.brand ASC 中。按该外部字段排序似乎是瓶颈..
【问题讨论】:
-
这些表中有哪些索引?
-
猜测一下,除非您在 pb.brand 上有索引,否则 mysql 将需要在应用限制之前对所有 1M 行进行排序
-
表1:PARTNUM是PK,ID_BRAND是加速索引表2:ID_BRAND是PK,BRAND是加速索引
标签: mysql performance join inner-join