日期:2014-05-16  浏览次数:20981 次

求教基于索引的排序的机制
CREATE TABLE `t6` (
`x` char(20) DEFAULT NULL,
`y` char(20) DEFAULT NULL,
`z` char(20) DEFAULT NULL,
KEY `bt` (`x`,`y`,`z`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

x,y,z复合索引
=================================================================
describe select * from t6 where x='dfds' and z='fdsfd'

输出(可以看出使用了覆盖索引)


1 SIMPLE t6 ref bt bt 61 const 1 Using where; Using index

==================================================================

但下列语句缺提示使用了文件排序

describe select * from t6 order by x asc, z asc

输出

1 SIMPLE t6 index bt 183 2 Using index; Using filesort


===================================================================

虽然书上说的也是这样的结果, 但是感觉有点理解不起啊

x, 和 z的值在索引中都可以获得 为什么出现文件排序的情况呢




------解决方案--------------------
select * from t6 where x='dfds' and z='fdsfd'

这个是直接取数据,对结果输出没有排序要求。所以,MYSQL可以直接使用索引 找到 x='dfds' 的所有记录,并利用索引中的 Z进行 WHERE判断。

select * from t6 order by x asc, z asc
这个取所有记录,然后要按X,Z排序。按X排序可以利用索引,但Z则无法使用索引了,而且是取全部记录,这样当然直接去原表中取记录然后排序更为有效。