我是靠谱客的博主 细心金毛,最近开发中收集的这篇文章主要介绍mysql 时间索引失效,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

项目中查询时间断的数据发现查询时间很长。怀疑没有走时间的索引,于是explain一下

EXPLAIN select * from t_order where created_at>'2015-01-01 00:00:00' and created_at<'2017-01-01 00:00:00'


解析:

id:

表示执行的顺序,id的值相同时,执行顺序是从上到下,id的值不同时,id的值越大,优先级越高,越先执行

select_type:

1、SIMPLE表示不包含子查询和union

2、查询中若包含子查询,最外层查询则标记为:PRIMARY

3、在select或者where列表中包含了子查询,则标记为:SUBQUERY

4、在from的子查询会标记为:DERIVED 

5、从union selcect出来的结果被标志为:UNION RESULT

type:

表示找到需要行的访问类型

ALL,index,range,ref,eq_ref,const,system,NULL

性能从最差到最好

key:

表示使用哪个索引

从上面的截图看没有走create_at索引。


上网查到资料:

当表的索引被查询,会使用最好的索引,除非优化器使用全表扫描更有效。优化器优化成全表扫描取决与使用最好索引查出来的数据是否超过表的30%的数据。
优化器更加复杂,其估计基于其他因素,列入表的大小,行数和I/O块的大小。


发现原因:
使用count整张表的数据,和条件的数据发现已经超过30%,,所以失效。在建立索引的时候,要根据列基数来建立。列基数=列中不同的数据/除以总数据。越接近1表示

重复数据越少,越适合建立索引。


解决:

根据上面的理论,时间断的范围通过订单号查询。因为订单号可以区分时间,并且列基数=1;

最后

以上就是细心金毛为你收集整理的mysql 时间索引失效的全部内容,希望文章能够帮你解决mysql 时间索引失效所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部