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.rhkb.cn/news/252391.html

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

相关文章

YIA主题如何关闭新版本升级提示?WordPress主题怎么取消升级提醒?

前两天YIA主题发布了升级到2.8版本&#xff0c;新增了一些功能&#xff0c;优化调整修复了一些功能&#xff0c;但是这些功能调整幅度不大&#xff0c;加上boke112百科使用的YIA主题已经进行了很多方面的个性化修改&#xff0c;所以就懒得升级了&#xff0c;但是每次进入WordPr…

linux k8s 源码编译及单集群测试

目录 概述实践安装插件docker 在线安装containerd安装二进制安装yum安装修改containder配置文件 cnietcdrsyncgo设置golang代理 安装CFSSL下载kubernetes代码编译启动本地单节点集群问题k8s没有被正常启动该如何k8s正常启动日志测试 结束 概述 此文详细说明在 centos 7上编译 k…

YOLO-World: Real-Time Open-Vocabulary Object Detection

文章目录 1. Introduction2. Experiments2.1 Implementation Details2.2 Pre-training2.3 Ablation Experiments2.3.1 预训练数据2.3.2 对RepVL-PAN的消融研究2.3.3 文本编码器 2.4 Fine-tuning YOLO-World2.5 Open-Vocabulary Instance Segmentation2.6 Visualizations Refere…

vscode 突然连接不上服务器了(2024年版本 自动更新从1.85-1.86)

vscode日志 ll192.168.103.5s password:]0;C:\WINDOWS\System32\cmd.exe [17:09:16.886] Got some output, clearing connection timeout [17:09:16.887] Showing password prompt [17:09:19.688] Got password response [17:09:19.688] "install" wrote data to te…

Go语言每日一练 ——链表篇(三)

传送门 牛客面试笔试必刷101题 ---------------- 链表中的节点每k个一组翻转 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方…

《Python 网络爬虫简易速速上手小册》第1章:Python 网络爬虫基础(2024 最新版)

文章目录 1.1 网络爬虫简介1.1.1 重点基础知识讲解1.1.2 重点案例&#xff1a;社交媒体数据分析1.1.3 拓展案例1&#xff1a;电商网站价格监控1.1.4 拓展案例2&#xff1a;新闻聚合服务 1.2 网络爬虫的工作原理1.2.1 重点基础知识讲解1.2.2 重点案例&#xff1a;股票市场数据采…

运营商数智化缩影:一部哑资源的资源管理史

不知你是否曾经留意过马路边的电杆、路面上的人井、还有路边不知道里面装的是什么的大箱子&#xff0c;稍微观察一下其实就会发现&#xff0c;这些设施上都会刻有产权归属单位&#xff0c;比如中国移动、中国电信、中国联通等等。那么&#xff0c;这些运营商的基础设施都是用来…

TCP TIME_WAIT 过多怎么处理

文章目录 1.什么是 TCP TIME_WAIT&#xff1f;2.为什么要 TIME_WAIT?3.TIME_WAIT 过多的影响4.解决办法4.1 调整短连接为长连接4.2 调整系统内核参数 5.小结参考文献 1.什么是 TCP TIME_WAIT&#xff1f; TCP 断开连接四次挥手过程中&#xff0c;主动断开连接的一方&#xff…

YOLO-World——超级轻量级开放词汇目标检测方法

前言 目标检测一直是计算机视觉领域中不可忽视的基础挑战&#xff0c;对图像理解、机器人技术和自主驾驶等领域具有广泛应用。随着深度神经网络的发展&#xff0c;目标检测方面的研究取得了显著进展。尽管这些方法取得了成功&#xff0c;但它们存在一些限制&#xff0c;主要体…

http伪造本地用户字段系列总结

本篇记录了http伪造本地用户的多条字段&#xff0c;便于快速解决题目 用法举例&#xff1a; 直接把伪造本地用户的多个字段复制到请求头中&#xff0c;光速解决部分字段被过滤的问题。 Client-IP: 127.0.0.1 Forwarded-For-Ip: 127.0.0.1 Forwarded-For: 127.0.0.1 Forwarded…

双非本科准备秋招(17.1)—— 力扣二叉树

1、257. 二叉树的所有路径 要求返回根节点到叶子节点的所有路径&#xff0c;这里用前序遍历就好。 每次递归前&#xff0c;都让字符串s加上当前节点的值和“->”&#xff0c;然后判断是否为叶子节点&#xff0c;如果是的话&#xff0c;说明这条路径是一个答案&#xff0c;因…

【教程】Linux使用支持文件恢复的rm命令

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 首先非常不幸地告诉你&#xff1a;Linux 系统的标准 rm 命令不支持文件恢复功能。一旦使用 rm 删除了文件或目录&#xff0c;它们就会从文件系统中永久删除&#xff0c;除非你使用专门的文件恢复工具尝试…

计算机设计大赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

算法学习——LeetCode力扣哈希表篇2

算法学习——LeetCode力扣哈希表篇2 454. 四数相加 II 454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 …

Java 学习和实践笔记(1)

2024年&#xff0c;决定好好学习计算机语言Java. B站上选了这个课程&#xff1a;【整整300集】浙大大佬160小时讲完的Java教程&#xff08;学习路线Java笔记&#xff09;零基础&#xff0c;就从今天开始学吧。 在这些语言中&#xff0c;C语言是最基础的语言&#xff0c;绝大多…

C++ this指针/常量成员函数/const/mutable

目录 1.this 指针2.常量成员函数3.mutable 成员变量4.const 关键字总结5.参考内容 1.this 指针 this 指针&#xff0c;指向成员函数所作用的对象&#xff0c;并且 this 总是指向这个对象&#xff0c;所以 this 是一个常量指针&#xff0c;我们不允许改变 this 中保存的地址。th…

arcgis各种版本下载

arcgic 下载&#xff01;&#xff01;&#xff01; ArcGIS是一款地理信息系统软件&#xff0c;由美国Esri公司开发。它提供了一系列完整的GIS功能&#xff0c;包括地图制作、空间数据管理、空间分析、空间信息整合、发布与共享等。ArcGIS是一个可扩展的GIS平台&#xff0c;提供…

vite+vue3发布自己的npm组件+工具函数

记录一下个人最近一次发布npm组件的过程&#xff1a; 一、创建组件和工具函数 执行命令创建一个空项目&#xff1a; npm create vite 创建过程稍微有些慢&#xff0c;不知何故&#xff1f;其中选择vue , 个人暂时使用的JS 。在 src 目录下面创建一个文件 package 存放组件和公…

Spring Web Header 解析常见错误

在上一章&#xff0c;我们梳理了 URL 相关错误。实际上&#xff0c;对于一个 HTTP 请求而言&#xff0c;URL 固然重要&#xff0c;但是为了便于用户使用&#xff0c;URL 的长度有限&#xff0c;所能携带的信息也因此受到了制约。 如果想提供更多的信息&#xff0c;Header 往往…

CGAL-3D 凸包算法

3D 凸包算法 一、概述二、静态凸包构造1. Traits 特征类2. 极端点3. 半空间相交4. 凸性检验 三、动态凸包构造四、性能 一、概述 一个点集 S∈R3 是凸的&#xff0c;如果对于任意两点 p 和 q 在集合中&#xff0c;具有端点的线段 p 和 q 包含在 S。集合的凸包 P 包含点集 S 的最…