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=utf8x,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的值在索引中都可以获得 为什么出现文件排序的情况呢
`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=utf8x,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的值在索引中都可以获得 为什么出现文件排序的情况呢
x y z
==================
1 2 3
1 2 2
1 1 2
2 1 5
2 1 4索引的数据, 复合索引(x, y, z)
x y z
==================
1 1 2
1 2 2
1 2 3
2 1 4
2 1 5select * from t1 order by x, z在x为1的时候在x的范围内比较y 得到
x y
=================
1 1
1 2
1 2但是仍然在y列上出现了相同的值, 继续比较z得到
x y z
==================
1 1 2
1 2 2
1 2 3现在select * from t1 order by x, z 提示使用了文件排序, 但是我觉得可以在索引中比较啊(在索引x的范围内查找z并对z进行排序), 为什么会读取原始的数据行呢
这个取所有记录,然后要按X,Z排序。按X排序可以利用索引,但Z则无法使用索引了,而且是取全部记录,这样当然直接去原表中取记录然后排序更为有效。
突然茅塞顿开, 榔头哥威武, 感谢你们这些大牛的热心帮助, 我把order by x, y 中的y想成一个范围了, 没有当成一个整体来看