在标TableA有个字段addtime (int)建了索引字段
查询时:select * from TableA where addtime>=123456789
 用explain看,这个查询语句没有用到索引
select * from TableA where addtime=123456789
这样查询就用到索引数字类型的字段,按范围查不能用索引吗?
这是很常用的查询啊 ?应该怎样做呢?
不会只能等于才能用索引,大于,小于不能用索引吧?

解决方案 »

  1.   

    提供一下你的表索引信息。否则比较难猜。show index from TableA;
    explain select * from TableA where addtime>=123456789;一般来说,估计你的记录很多 并且 addtime>=123456789; 是绝大多数记录,比如你有 100 条记录,其中 90 条是符合 id>123  条件的,则没有必要去用索引。
      

  2.   

    理论上,>=是用得上索引的
    但这个也跟系统自身的优化计划有很大关系
    因为系统对SQL分析时,会生成很多执行计划
    其会根据数据分布等一些系统信息,来获取一个“自认为”的最优执行计划。
      

  3.   

    谢谢楼上的几位:
    show index from TableA
    Table  Non_unique  Key_name  Seq_in_index  Column_name  Collation  Cardinality  Sub_part  Packed  Null  Index_type 
    TableA 0 PRIMARY 1 orderid A 6138 NULL NULL   BTREE   
    TableA 1 userid 1 userid A 3069 NULL NULL YES BTREE   
    TableA 1 addtime 1 addtime A 6138 NULL NULL   BTREE   
    TableA 1 oktime 1 oktime A 6138 NULL NULL   BTREE TableA总记录条数6138条
    符合addtime>=1249789220   (时间戳)
    的有200多条  
      

  4.   

    EXPLAIN SELECT * FROM TableA WHERE addtime >=1248605290
    执行如下
    id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
    1 SIMPLE order ALL addtime NULL NULL NULL 6139 Using where 
      

  5.   


    如果你的索引类型是hash,大于小于就不会用到索引,仅仅针对等于有效!
    BTREE应该没有问题!贴出你的建表语句看看:
    SHOW CREATE TABLE TableA;
      

  6.   

    楼主先把语句换成:
    explain select addtime from TableA where addtime>=123456789;
    试试,看看有没有用到索引!
      

  7.   

    To:楼上的netxuning真的是这样啊
    explain select addtime from TableA where addtime>=1246414598
    执行如下
    id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
    1 SIMPLE order range addtime addtime 4 NULL 2794 Using where; Using index 
    但select语句包含任何其他字段,就没有用到索引了
    比如
    select * 或者select orderid或者select orderid,addtime或者select count(*)
    就不行
    只能select addtime from
    一个字段采用到索引
      

  8.   

    To:楼上的netxuning真的是这样啊
    explain select addtime from TableA where addtime>=1246414598
    执行如下
    id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
    1 SIMPLE order range addtime addtime 4 NULL 2794 Using where; Using index 
    但select语句包含任何其他字段,就没有用到索引了
    比如
    select * 或者select orderid或者select orderid,addtime或者select count(*)
    就不行
    只能select addtime from
    一个字段采用到索引
      

  9.   

    最后我总结一下测试情况
    表总记录条数6000多条
    返回字段不只是addtime的时候
    如果查询条件addtime>=
    记录条数1000条左右就用不到索引了,查询结果在几百条内就用到索引但如果select只有addtime一个字段,就查询条件返回更多记录时,也能用到索引大家明白我的意思吗?
    我觉得mysql这样不太好
    返回结果占总记录条数的20%以内的查询,都不能用到索引
    要全表扫描,效率也太低了吧
      

  10.   

    表总记录条数6000多条 
    返回字段不只是addtime的时候 
    如果查询条件addtime>= 
    记录条数1000条左右就用不到索引了,查询结果在几百条内就用到索引 但如果select只有addtime一个字段,就查询条件返回更多记录时,也能用到索引 
      

  11.   


    这是因为mysql优化器在执行 select addtime from TableA where addtime>=1246414598 的时候,用到了covering index,addtime 就在索引当中,而且所列出的结果只有addtime,这样mysql只需查询索引就可以列出你想要的,不用再去查数据表了,何乐而不为呢?如果select * 或还有别的字段需要列出的话,情况就不一样了!优化器肯定要权衡利弊,考虑更多的东西了!至于这其中的利弊,我也正在琢磨,应该就是ACMAIN和yueliangdao0608说得那样了!