在标TableA有个字段addtime (int)建了索引字段
查询时:select * from TableA where addtime>=123456789
用explain看,这个查询语句没有用到索引
select * from TableA where addtime=123456789
这样查询就用到索引数字类型的字段,按范围查不能用索引吗?
这是很常用的查询啊 ?应该怎样做呢?
不会只能等于才能用索引,大于,小于不能用索引吧?
查询时:select * from TableA where addtime>=123456789
用explain看,这个查询语句没有用到索引
select * from TableA where addtime=123456789
这样查询就用到索引数字类型的字段,按范围查不能用索引吗?
这是很常用的查询啊 ?应该怎样做呢?
不会只能等于才能用索引,大于,小于不能用索引吧?
explain select * from TableA where addtime>=123456789;一般来说,估计你的记录很多 并且 addtime>=123456789; 是绝大多数记录,比如你有 100 条记录,其中 90 条是符合 id>123 条件的,则没有必要去用索引。
但这个也跟系统自身的优化计划有很大关系
因为系统对SQL分析时,会生成很多执行计划
其会根据数据分布等一些系统信息,来获取一个“自认为”的最优执行计划。
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多条
执行如下
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE order ALL addtime NULL NULL NULL 6139 Using where
如果你的索引类型是hash,大于小于就不会用到索引,仅仅针对等于有效!
BTREE应该没有问题!贴出你的建表语句看看:
SHOW CREATE TABLE TableA;
explain select addtime from TableA where addtime>=123456789;
试试,看看有没有用到索引!
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
一个字段采用到索引
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
一个字段采用到索引
表总记录条数6000多条
返回字段不只是addtime的时候
如果查询条件addtime>=
记录条数1000条左右就用不到索引了,查询结果在几百条内就用到索引但如果select只有addtime一个字段,就查询条件返回更多记录时,也能用到索引大家明白我的意思吗?
我觉得mysql这样不太好
返回结果占总记录条数的20%以内的查询,都不能用到索引
要全表扫描,效率也太低了吧
返回字段不只是addtime的时候
如果查询条件addtime>=
记录条数1000条左右就用不到索引了,查询结果在几百条内就用到索引 但如果select只有addtime一个字段,就查询条件返回更多记录时,也能用到索引
这是因为mysql优化器在执行 select addtime from TableA where addtime>=1246414598 的时候,用到了covering index,addtime 就在索引当中,而且所列出的结果只有addtime,这样mysql只需查询索引就可以列出你想要的,不用再去查数据表了,何乐而不为呢?如果select * 或还有别的字段需要列出的话,情况就不一样了!优化器肯定要权衡利弊,考虑更多的东西了!至于这其中的利弊,我也正在琢磨,应该就是ACMAIN和yueliangdao0608说得那样了!