关于全索引扫描和全表扫描的性能比较
查资料说,index比all类型性能高,但是有疑问例如下面的例子,
create table test (a int(11), b int(11), primary key a(a), index b(b))engine=innodb;
1. select *from test force index (b) order by b
2. select *from test order by b我的理解是 2的性能比较高:情况1 用了b索引,减少了排序操作;但是需要再次通过索引定位到主键具体记录,而且这个操作可能有随机甚至重复的I/O;
情况2 要排序;但是能够直接顺序扫描数据表,属于顺序I/O;当然这需要视具体的环境情况而定。本人属于初学数据库,希望大侠们帮我解惑~,最好能详细点哈

解决方案 »

  1.   

    上面我举例子有点问题,改下
    create table test (a int(11), b int(11), c int(11), primary key a(a), index b(b))engine=innodb;
      

  2.   

    1. select *from test force index (b) order by b
    这个效率高。
    你可以自己在纸上 列上10个记录, 然后再写下这10个记录的索引结构。之后你可以人工模拟一下语句1,语句2, 就自然发现哪个高了。如果仍有问题,则可以详细写出你的模拟步骤,大家可以进行分析评论。
      

  3.   

    下面是我所理解的执行过程:
    1. select *from test force index (b) order by b
      读取所有的索引信息,对于每个索引键值根据索引信息中的主键值,在聚簇索引树中定位记录,从而得到的就是有序的结果集了
    2. select *from test order by b
      顺序读取所有的记录信息,放在缓存中排序得到有序的结果集对于两种情况的区别是
    情况1 多了对所有索引定位到具体记录信息的过程,并且对每条记录的定位读取会是一个随机的I/O过程
    情况2 多了一个排序的过程,如果整个结果集太大,排序缓存区放不下,那么将会使用临时表会有磁盘I/O操作。在排序缓存区够大的情况下,我还是认为情况2效率高。遗漏或错误的地方,帮忙指出下啊~
      

  4.   

    两个效率一样的,优化器会自己选择一个执行计划, 我也试了两个的执行计划一样的         
     id: 1
      select_type: SIMPLE
            table: test
             type: index
    possible_keys: NULL
              key: b
          key_len: 5
              ref: NULL
             rows: 4
            Extra: Using index
    1 row in set (0.00 sec)
    执行计划一样,在这里不管你强制用不用都会选择b
    如果你by a 结果就不一样,什么是顺序I/O这里不是理解的,你select数据能保证数据都在一快连续的银盘上吗?比如预写日志为什么效率还会高?这里是系统给日志文件分配的是一块连续的硬盘存数据,否则两次I/O效率肯定会下降的!