mysql中datetime字段建立索引并比较大小详解

 更新时间:2022年12月15日 08:54:08   作者:太上码农  
MySQL数据库常用的时间类型有timestamp和datetime,两者主要区别是占用存储空间长度不一致、可存储的时间也有限制,下面这篇文章主要给大家介绍了关于mysql中datetime字段建立索引并比较大小的相关资料,需要的朋友可以参考下

1、问题背景

最近测试库查询一个表的数据,需要用到唯一的一个日期类型字段作为 where 的子查询(查询当天的数据),就正常写了个这样的 SQL,具体的表名我就不写了:

# create_time 是 datetime 类型
select * from ${tablename} where date(create_time)='20220919' limit 20;

其中字段的值样本如下:

我知道我写的这条 SQL 即使在 create_time 这个列有索引的情况下也不会走索引,但是执行了以后就 wc 了:

NM!20条记录你查询需要 8 s!

这种问题要不优化都不敢说自己是农民工!

2、优化过程

1) 操作索引

首先我看了下这个表的索引:

show index from ${tablename};

一看,有一个列对应了 2 个索引字段,也就是 create_time 没有索引,我就干掉其中一个重复的并在 create_time 上建了一个(表名我就不写了):

#删除索引
drop index index_create_time on ${tablename};
#添加索引
create index index_create_time on {tablename}(create_time);

2)是否走索引判断

有索引了关键是得让它走索引啊,先验证一下,我用执行计划继续执行了上面问题背景中的那个sql:

explain select * from ${tablename} where date(create_time)='20220919' limit 20;

结果如下,一点都不意外,照样全表扫描:

3)datetime使用索引查询

既然不能操作索引列,我又想查询某一天的数据,就只能用范围了,范围的就那个几个,between…and 、> 、<
于是,我写了下面查询 SQL:

select * from ${tablename} where create_time between '2022-09-19 00:00:00' and '2022-09-19 23:59:59';

果然不辜负我的小操作,查询结果如下:

查询 1850 条数据平均在 0.5 s,这不用说,绝壁走了索引,一个查询 20 条花费 8s,一个小 2 千记录花费半秒,没有可比性。

下面验证这个查询,同样在 sql 前加上 explain 后执行:

没毛病,索引类型 range,between…and 走的就是这种范围索引,这种范围类型的索引结构开销是有点大的,大到一定程度就不走索引了,比如在性别字段上建索引!

补充:Mysql 时间Datetime 索引不生效问题

今天发现之前在使用日期索引时,通过explain发现一直不走日期索引,在网上查询了下,发现使用过程中要注意以下情况:

1、在查询数据条数约占总条数五分之一以下时能够使用到索引,但超过五分之一时,则使用全表扫描了。

2、查询条件有日期索引和其他条件的话,只有所有条件都有索引的情况下,才会走日期索引,

例如:

我建立了复合索引car_date_index: date_time,car_plate_no.

当我是用查询条件: WHERE car_plate_no=‘冀E8888’ and date_time<=‘2019-05-01 00:00:00’,如果想走car_date_index的索引,表中必须有car_plate_no字段的索引才能走,暂时没发现为啥会出现此问题,有知道可以分享下哦

总结

到此这篇关于mysql中datetime字段建立索引并比较大小的文章就介绍到这了,更多相关mysql datetime字段建立索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL架构设计思想详解

    MySQL架构设计思想详解

    这篇文章主要介绍了MySQL架构设计思想详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • mysql日期date型和int型互换的方法

    mysql日期date型和int型互换的方法

    下面小编就为大家带来一篇mysql日期date型和int型互换的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • MySQL 8.0 驱动与阿里druid版本兼容问题解决

    MySQL 8.0 驱动与阿里druid版本兼容问题解决

    MySQL 8.0 驱动与阿里druid版本不兼容会导致有报错问题,本文就详细的介绍一下解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2021-07-07
  • win10下mysql 8.0.13 安装配置方法图文教程

    win10下mysql 8.0.13 安装配置方法图文教程

    这篇文章主要为大家详细介绍了win10下mysql 8.0.13安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • mysql如何实现多行查询结果合并成一行

    mysql如何实现多行查询结果合并成一行

    利用函数:group_concat(),实现一个ID对应多个名称时,原本为多行数据,把名称合并成一行
    2013-12-12
  • MySQL批量插入唯一索引冲突的几种避免办法

    MySQL批量插入唯一索引冲突的几种避免办法

    我们在进行大批量的数据插入时,遇到唯一索引冲突是经常的事,本文主要介绍了MySQL批量插入唯一索引冲突的几种避免办法,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 一篇文章看懂SQL中的开窗函数

    一篇文章看懂SQL中的开窗函数

    开窗函数也叫分析函数有两类,一类是聚合开窗函数,一类是排序开窗函数,下面这篇文章主要给大家介绍了关于SQL中开窗函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Mysql触发器语法解读(附带简单实用例子)

    Mysql触发器语法解读(附带简单实用例子)

    这篇文章主要介绍了Mysql触发器语法解读(附带简单实用例子),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • mysql 如何使用JSON_EXTRACT() 取json值

    mysql 如何使用JSON_EXTRACT() 取json值

    这篇文章主要介绍了mysql如何使用JSON_EXTRACT() 取json值的操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • mysql获得60天前unix时间的方法

    mysql获得60天前unix时间的方法

    首先根据now()获得当前时间,使用adddate()方法获得60天前时间,使用unix_timestamp()方法转换时间类型,需要的朋友可以参考下
    2014-09-09

最新评论