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的值在索引中都可以获得  为什么出现文件排序的情况呢

解决方案 »

  1.   

    真实的数据(表t1)
    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进行排序), 为什么会读取原始的数据行呢
      

  2.   

    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则无法使用索引了,而且是取全部记录,这样当然直接去原表中取记录然后排序更为有效。
      

  3.   


    突然茅塞顿开, 榔头哥威武, 感谢你们这些大牛的热心帮助, 我把order by x, y 中的y想成一个范围了, 没有当成一个整体来看