1
incompatible 2014-09-26 11:38:18 +08:00 1
join的字段和order by的字段加上索引
|
2
CosWind OP @incompatible 有联合索引,而且是顺序的。不行诶
|
3
CosWind OP @incompatible INNER JOIN的字段是联合索引的前缀索引
|
4
yangqi 2014-09-26 11:49:30 +08:00 1
order by的字段是什么类型的, 是否有索引
另外你explain看一下 |
6
CosWind OP @yangqi explain的结果Using where; Using index; Using temporary; Using filesort
|
7
incompatible 2014-09-26 11:52:45 +08:00
@CosWind 先去掉order by,单独执行join的部分试试,以便推断到底是join和order by里的哪一个导致了filesort
|
8
CosWind OP @incompatible 单独没问题。
|
10
CosWind OP @yangqi ![image](http://img.itc.cn/photo/jD1XNVpd1Hx)
|
11
CosWind OP |
12
CosWind OP @yangqi http://img.itc.cn/photo/oD1XjXvEUYf 这个,刚那个没截取全
|
13
incompatible 2014-09-26 12:01:12 +08:00
@CosWind 我做了一个测试 如果where条件中只命中了某字段的一行(比如column = ?),那么对“与该字段构成联合索引的后续列”做order by的话,可以命中索引。 如果where条件中命中了多行(比如用 column
in (?, ? ...) 的方式),order by时就会引起filesort 不知你是否是这种情况 |
14
CosWind OP @incompatible yes,可以说差不多是这个意思。因为我的是INNER JOIN,命中的是很多行
|
15
CosWind OP @incompatible IN的方式会产生subquery,我用INNER JOIN代替了。
|
16
yangqi 2014-09-26 12:07:46 +08:00 1
http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html
这里是官方对于order by使用索引的解释, 估计你的是下面这种情况, 不能用索引 You are joining many tables, and the columns in the ORDER BY are not all from the first nonconstant table that is used to retrieve rows. (This is the first table in the EXPLAIN output that does not have a const join type.) |