MySQL 时间索引的选择

背景

MySQL 在使用过程中经常会对时间加索引,方便进行时间范围的查询,常见的时间类型有 data、datetime、long、timestamp 等,在此分析下这几种时间类型的索引大小,以找到比较合适的时间类型。

时间类型对比

常用的索引类型是 timestamp、datetime、long、int(秒级),占用的空间大小如下:
在这里插入图片描述
参考:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
如图所示,timestam 和 datetime、long 类型都占用 8 字节空间,int 类型占用 4 个字节,具体验证下占用空间大小。
分别新建表 date1、timestamp1、long1、int_1,只有 id 和 created 字段,id 是主键,created 是索引,都是 10W 条数据,看下具体占用的索引空间大小。

create table date1 (id int (11) unsigned not null comment '主键',created datetime not null comment '创建时间',primary key(`id`),key `idx_created`(created) using btree
) engine = INNODB default charset = utf8 comment = 'date1'create table long1 (id int (11) unsigned not null comment '主键',created bigint(20) not null comment '创建时间',primary key(`id`),key `idx_created`(created) using btree
) engine = INNODB default charset = utf8 comment = 'long1'create table int_1 (id int (11) unsigned not null comment '主键',created int(11) not null comment '创建时间',primary key(`id`),key `idx_created`(created) using btree
) engine = INNODB default charset = utf8 comment = 'long2'create table timestamp1 (id int (11) unsigned not null comment '主键',created timestamp not null comment '创建时间',primary key(`id`),key `idx_created`(created) using btree
) engine = INNODB default charset = utf8 comment = 'timestamp1'

批量插入 10W 条数据:

delimiter ;;
create procedure idata()
begindeclare i int;set i=1;while(i<=100000)doinsert into date1(id, created) values(i, DATE_ADD('2000-01-01 00:00:00', INTERVAL FLOOR(RAND() * 31536000) SECOND));set i=i+1;end while;
end;;
delimiter ;
call idata();delimiter ;;
create procedure idata3()
begindeclare i int;set i=1;while(i<=100000)doinsert into timestamp1(id, created) values(i, DATE_ADD('2000-01-01 00:00:00', INTERVAL FLOOR(RAND() * 31536000) SECOND));set i=i+1;end while;
end;;
delimiter ;
call idata3();delimiter ;;
create procedure idata1()
begindeclare i int;set i=1;while(i<=100000)doinsert into long1(id, created) values(i, 1697027000000 + i);set i=i+1;end while;
end;;
delimiter ;
call idata1();delimiter ;;
create procedure idata2()
begindeclare i int;set i=1;while(i<=100000)doinsert into int_1(id, created) values(i, 1697000000 + i);set i=i+1;end while;
end;;
delimiter ;
call idata2();

查看占用的索引空间大小:

selecttable_schema, table_name, table_rows,-- round(DATA_LENGTH/1024/1024,2) as data_size_MB,round(DATA_LENGTH/1024/1024/1024,2) as data_size_GB,round(index_length/1024/1024,2) as index_size_MB,
--     round(index_length/1024/1024/1024,2) as index_size_GB,round((DATA_LENGTH + index_length)/1024/1024/1024,2) as data_index_sum_size_GB,table_comment
from information_schema.TABLESWHERE table_schema = 'test'
--     AND table_name='test'order by index_size_MB desclimit 20;

在这里插入图片描述
long、timestamp、datetime 占用的索引空间大小一直,int 类型的占用空间小一些,和预想的一致。
类型 TIMESTAMP 最大的优点是可以带有时区属性,因为它本质上是从毫秒转化而来。如果你的业务需要对应不同的国家时区,那么类型 TIMESTAMP 是一种不错的选择。比如新闻类的业务,通常用户想知道这篇新闻发布时对应的自己国家时间,那么 TIMESTAMP 是一种选择。
虽然从毫秒数转换到类型 TIMESTAMP 本身需要的 CPU 指令并不多,这并不会带来直接的性能问题。但是如果使用默认的操作系统时区,则每次通过时区计算时间时,要调用操作系统底层系统函数 __tz_convert(),而这个函数需要额外的加锁操作,以确保这时操作系统时区没有修改,此时性能没有 datetime 好。
常规使用场景中 datetime 和 timestamp 都可。如果仅需要日期查询,也可以考虑建立 date 类型索引,占用空间会更小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpServletResponse接口用于表示状态代码的字段

1. HttpServletResponse接口用于表示状态代码的字段 您已学习了状态代码以及可用于从servlet向客户机发送状态代码的HttpServletResponse接口的字段。下表列出了HttpServletResponse接口表示状态代码的一些其他字段。 字段状态代码描述SC_HTTP_VERSION_NOT_SUPPORTED505服务器…

PyTorch深度学习实战(23)——从零开始实现SSD目标检测

PyTorch深度学习实战&#xff08;23&#xff09;——从零开始实现SSD目标检测 0. 前言1. SSD 目标检测模型1.1 SSD 网络架构1.2 利用不同网络层执行边界框和类别预测1.3 不同网络层中默认框的尺寸和宽高比1.4 数据准备1.5 模型训练 2. 实现 SSD 目标检测2.1 SSD300 架构2.2 Mul…

Verilog刷题笔记25

题目&#xff1a; You’re already familiar with bitwise operations between two values, e.g., a & b or a ^ b. Sometimes, you want to create a wide gate that operates on all of the bits of one vector, like (a[0] & a[1] & a[2] & a[3] … ), whic…

USB Type-C 接口 PD 协议解决方案

文章来源&#xff1a;USB Type-C接口PD协议解决方案 | Richtek Technology

极值图论基础

目录 一&#xff0c;普通子图禁图 二&#xff0c;Turan问题 三&#xff0c;Turan定理、Turan图 1&#xff0c;Turan定理 2&#xff0c;Turan图 四&#xff0c;以完全二部图为禁图的Turan问题 1&#xff0c;最大边数的上界 2&#xff0c;最大边数的下界 五&#xff0c;…

【C++基础入门】七、指针(定义和使用、所占内存空间、空指针和野指针、const关键字修饰指针、指针和数组、指针和函数)

七、指针 7.1 指针的基本概念 指针的作用&#xff1a; 可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示可以利用指针变量保存地址 7.2 指针变量的定义和使用 指针变量定义语法&#xff1a; 数据类型 * 变量名&#xff1b; 示例&…

DevOps落地笔记-21|业务价值:软件发布的最终目的

上一课时介绍如何度量软件的内部质量和外部质量。在外部质量中&#xff0c;我们提到用户满意度是衡量软件外部质量的关键因素。“敏捷宣言”的第一条原则规定&#xff1a;“我们最重要的目标&#xff0c;是通过持续不断的及早交付有价值的软件使用户满意”。从这一点也可以看出…

2024.2.6

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&g…

简化版SpringMVC

简化版SpringMVC web.xml xml version"1.0" encoding"UTF-8"?> <web-app version"2.5" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&quo…

【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏2(附项目源码)

最终效果 文章目录 最终效果系列目录前言添加捕食者动画控制源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第24篇中&#xff0c;我们将探索如何用unity制作一个3D动物AI生态系统游戏…

如何在 emacs 上开始使用 Tree-Sitter (archlinux)

文章目录 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 在archlinux上使用比windows上不知道要方便多少倍&#xff01; $ sudo pacman -S emacs $ sudo pacman -S tree-sitter这里…

第6章——深度学习入门(鱼书)

第6章 与学习相关的技巧 本章将介绍神经网络的学习中的一些重要观点&#xff0c;主题涉及 寻找最优权重参数的最优化方法、权重参数的初始值、超参数的设定方法 等。此外&#xff0c;为了应对过拟合&#xff0c;本章还将介绍 权值衰减、Dropout等正则化方法&#xff0c;并进行实…

Redis(02)——事务管理

事务概念 Redis事务的本质是一组命令的集合。事务支持一次执行多个命令&#xff0c;一个事务中所有命令都会被序列化&#xff0c;在事务执行过程中&#xff0c;会按照顺序串行化执行队列中的命令&#xff0c;其他客户端提交的命令请求不会插入到事务执行命令序列中 Redis事务…

Windows权限维持

注册表类&#xff1a; 普通注册表后门 在一般用户权限下&#xff0c;通常是将要执行的后门程序或脚本路径填写到如下注册表的键值中HKCU\Software\Microsoft\Windows\CurrentVersion\Run&#xff0c;键名任意。普通权限即可运行 cmd下操作&#xff1a; reg add "HKEY_…

我差一点就中了Magniber勒索病毒

前言 勒索攻击已经成为了全球最大的网络威胁&#xff0c;越来越多的黑客组织开始加入到勒索病毒攻击活动&#xff0c;目前勒索病毒黑客组织大致可以分为两类&#xff0c;一类攻击目标主要以TO C(个人)为主&#xff0c;一类攻击目标主要以TO B(企业)为主&#xff0c;前者的勒索…

C# CAD交互界面-自定义面板集(四)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System.Windows.Forms; 二、程序说明 创建自定义面板集&#xff08;PaletteSet&#xff09;的C#命令方法实现。该方法名为CreatePalette&#xff…

Redis篇之持久化

一、为什么要进行持久化 Redis是一个基于内存的键值存储系统&#xff0c;但为了保证数据在服务器重启、故障等情况下不丢失。 二、应该怎么持久化 1.RDB持久化 &#xff08;1&#xff09;RDB是什么 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff…

流程引擎activiti、flowable、camunda简单介绍

市场上比较有名的开源流程引擎有osworkflow、jbpm、activiti、flowable、camunda。 其中&#xff1a;Jbpm4、Activiti、Flowable、camunda四个框架同宗同源&#xff0c;祖先都是Jbpm4&#xff0c;开发者只要用过其中一个框架&#xff0c;基本上就会用其它三个。 推荐使用camu…

C语言带颜色输出

我们在做函数API功能测试时或其他数据解析时&#xff0c;为了区分信息内容&#xff0c;可以给不同级别的输出加上不同的颜色&#xff0c;以方便查看。 如&#xff0c;我自己的一个项目中的显示效果&#xff1a; 这样做可以更加清晰的反应数据信息&#xff01; 实现原理&#x…

07:Kubectl 命令详解|K8S资源对象管理|K8S集群管理(重难点)

Kubectl 命令详解&#xff5c;K8S资源对象管理&#xff5c;K8S集群管理 kubectl管理命令kubectl get 查询资源常用的排错命令kubectl run 创建容器 POD原理pod的生命周期 k8s资源对象管理资源文件使用资源文件管理对象Pod资源文件deploy资源文件 集群调度的规则扩容与缩减集群更…