【踩坑】MySQL时间索引失效

项目中查时间数据段数据时,发现查询时间很长,RDS查了一下执行计划:

各列解析说明:

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:

表示使用哪个索引

rows:

表示影响的行数

extra:

表示查询帅选的类型,比如使用了where条件,索引条件,或者排序,或者临时表空间


了解到的资料:

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

发现原因:

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

解决:

时间段的范围可以通过唯一键如订单号查询,因为订单号可以区分时间,并且列基数=1

增加其他能进一步查询筛选的条件,如姓名、手机号码等字段

 

------------------------------------------------------

------------------------------------------------------

 

关于我(个人域名)

我的开源项目集Github

 

期望和大家一起学习,共同进步,共勉,O(∩_∩)O谢谢

欢迎交流问题,可加个人QQ 469580884,

或者,加我的群号 751925591,一起探讨交流问题

不讲虚的,只做实干家

Talk is cheap,show me the code

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页