求教基于索引的排序的机制
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'
输出(可以看出使用了覆盖索引)
1SIMPLEt6refbtbt61const1Using where; Using index
==================================================================
但下列语句缺提示使用了文件排序
describe select * from t6 order by x asc, z asc
输出
1SIMPLEt6indexbt1832Using 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则无法使用索引了,而且是取全部记录,这样当然直接去原表中取记录然后排序更为有效。