表t1: create table t1(x int, y int, key i1 using btree(x)) engine=innodb共42942条数据describe select * from t1 where x<>40000 and x<2953
1 SIMPLE t1 range i1 i1 5 5896 Using where
describe select * from t1 where x<>40000 and x<2954
1 SIMPLE t1 ALL i1 39261 Using where
为什么会存在2953使用索引并且range查找, 而2954不使用索引并且全表扫描???  如果这是查询优化器基于成本考虑的, 考虑的因素是什么, 各位大哥有无资料共享给小弟一下, 不胜感激------------------------------------------------------------------------------------------------
另外据说btree是不支持<>比较的describe select x from t1 where x<>5
1 SIMPLE t1 range i1 i1 5 19633 Using where; Using index
为什么能够使用索引进行范围查找, 这个是不是索引覆盖的原因describe select * from t1 where x<>5
1 SIMPLE t1 ALL i1 39261 Using where
无论如何都是全表扫描, 这两条语句, 是基于什么样的成本考虑才有如此不同的行为, 望大牛详解

解决方案 »

  1.   

    show index 的结果是什么样?
      

  2.   

    你的表中一共多少记录? 如果符合条件的百分比大于一定数字,则MYSQL就直接使用全表扫描而不是通过索引了。
      

  3.   


    我猜测也是这样, 只不过这个百分比有没有办法预测呢??? 或者有什么样的配置???? 我原先对数据库优化的看法是几个类似多项式一样的因素叠加就可以得到结果, 但是发现实际上似乎困难的多, 比如面试, 面试官在纸上给定这些条件而不上机测试的话, 平理论知识很难给出正确答案
    另外帮我看下这个呢, 据说btree是不支持<>比较的describe select x from t1 where x<>5
    1 SIMPLE t1 range i1 i1 5  19633 Using where; Using index
    为什么能够使用索引进行范围查找, 这个是不是索引覆盖的原因describe select * from t1 where x<>5
    1 SIMPLE t1 ALL i1  39261 Using where
    无论如何都是全表扫描,  
      

  4.   

    高性能mysql第二版, 每一张感觉都学的很辛苦啊, 吼吼
      

  5.   

    这个是用来说明BTEEE中x<>5的情况吗???? 但是我觉得这个例子似乎不是太恰当, 数据和人的差别在与数据没有主动性, 比如你让全班男生出来发花姑娘了与你让全班男生出来砍头肯定是两种效果!!!我考虑到这样一种情况比如数据x1
    2
    5
    5
    5
    ...中间有100000行x都是5
    6
    7
    8
    我觉得这样的话肯定是使用索引快, 以为如果顺序检查的话中间有一万行相同的5要检查, 不如直接通过索引跳过
      

  6.   

    上面的表t1书上说select * from t1 where x<5 and x<>1 for update; 会锁定前4条记录, 但我实际测试会锁表彻底疯了, 是不是书有问题啊
      

  7.   

    知道原因了, x<5 and x<>1 锁定的是前五条记录, 而不是书上所说的前4条记录, 我测试的时候是x=5 我误以为锁表了