Mysql数据类型设计思考

news2024/11/26 22:24:20

一、Mysql数据类型设计规范

1.1 选择更小的数据类型

一般情况下,在满足存储要求的基础上,尽量选择小的存储类型。例如:存储0~200,tinyint和bigint都可以存储,那么选择tinyint。原因:越小的数据类型运算速度更快,占用磁盘、内存以及CPU缓存更小

1.2 简单更好

简单的数据类型意味着操作需要更少的CPU周期。例如:整型比字符操作代价要小很多,因此字符集和排序规则使得字符比整型更加复杂。

1.3 避免使用NULL值

虽然NULL值也可以走索引,但对索引统计值比较逻辑以及内存使用等不太友好。
索引统计: 由于Mysql在执行查询优化时,会基于索引统计信息来选择最优的执行计划。当列中包含null值时,因null值不参与统计,会对执行计划产生影响,导致选择的执行计划不是最优的;
值比较逻辑: 对null值的操作只能使用is null, is not null,<=>,因此在进行范围查询或等值比较时,需要进行额外的处理;

选择步骤:

  1. 选择合适的大类型。比如:整型,字符串或时间
  2. 选择具体的小类型。比如:tinyint,bigint, datetime, timestamp等。

二、各种数据类型使用场景解析

2.1 整数和小数类型

2.1.1 整数

类型:tinyint, smallint, mediumint, int, bigint.分别占用1,2,3,4,8个字节的空间;
是否支持负数:支持
特点:
	1.默认是有符号。有unsigned【无符号】属性可以选择。加上unsigned意味着只能是正数,表示范围扩大一倍;
	2.有符号和无符号存储空间是相同的;
	3.int(n)int(m)存储空间是一样的,只不过显示宽度不一样而已.

2.1.2 小数

Mysql既支持精确类型,也支持不精确类型

精确类型:floatdouble
	- 使用标准的浮点运算进行【近似计算】
	- 适用于不需要精准计算的场景
不精确类型:decimal
	- 用于存储精确的小数
	- 适用于需要精准计算的场景。一般用于存储金额,但在大数据量情况下,可以将金额换算成分,存储到bigint里,解决浮点存储计算不精确和decimal精确计算代价高的问题。

decimal也有正负之分,通过unsigned来设置。decimal的格式为:decimal(P,D)
P: 表示有效数字位的精度。范围为1-65
D:表示小数点后的位数。范围为0-30Mysql要求D小于等于P

Decimal的存储:
在这里插入图片描述

2.2 字符串类型

char和varchar

char和varchar的区别:
前提:假设每个字符占用4个字节

  1. 存储方式:
    • char是定长字符串。当为char指定一个长度M时,会使用固定长度4M的空间来存储数据;
    • varchar是变长字符串。使用可变长度【实际字符串长度+存储字符串长度的空间】的空间来存储数据
  2. 使用场景
    • char更适合固定长度的字符串存储;
    • varchar更适合存储不定长度的字符串
varchar(10)场景下:"hh""hhh"占用多个字节?
	"hh": 2个字符 * 48个字节,由于8小于255,1个字节来存储字符串的长度,因此总体为9个字节
	"hhh": 3个字符 * 412个字节,由于12小于255,1个字节来存储字符串的长度,因此总体为13个字节

varchar(6)varchar(10)的区别:存储同样的字符串"hello"
1. 占用的磁盘空间大小是一样的。都是5个字符*4 + 1 = 21个字节;
2. 占用的内存空间不一样。MySQL通常会分配【固定大小的内存块】来保存内部值。尤其是使用临时表进行排序会操作时,会消耗更多的内存。在使用磁盘进行排序时,也是一样

blob和text:

两者都是为了存储大数据设计的字符串类型。blob采用二进制存储,text采用字符存储.
Mysql为了存储blob和text,专门分配存储区域来存储,然后在B+树上使用1-4字节的内存指针,指向存储区域。

2.3 时间类型

目前常用的两种时间格式为:datetime和timestamp。Mysql目前仅支持到毫秒级别的存储。

DateTime: 
	- 范围:1001-9999
	- 精度:秒
	- 与时区无关
	- 8字节存储
TimeStamp:
	- 范围:1970-2038
	- 精度:秒
	- 与时区有关
	- 4字节存储

使用场景:
1. 为时间创建索引或精确到毫秒:将时间转换为bigint类型存储,方便索引;
2. 对内存敏感的场景:使用TimeStamp
3. 对内存不敏感的场景:使用DateTime

其它数据类型用的比较少,如果要使用的话,可以查阅相关的资料即可。

三、Null值设计思考

建议:建表时,尽量不要将字段设置为null,给字段设置一个默认值

3.1 null生效和不生效情况

不生效情况查询运算符、like、between and、in、not in对null查询不生效
生效情况is null,is not null,<=>(安全等于,既可以判断null值,也可以判断普通数值,可读性差,不建议使用)

3.2 聚合函数和null值的结合

count(字段): 不会统计为null的数据;
count(*): 会统计为null的数据

3.3 null值和主键的结合

当字段设置为主键时,字段会自动被设置为not null

3.4 null值存储在B+树的哪里

考虑到主键不能为null,因此允许null值创建的索引都是非聚簇索引。设计Innodb的大叔定义Null值大小为最小的:
We define the SQL null to be the smallest possible value of a field.
因此,null值索引在B+树中的位置,应该是最靠近左边的。
在这里插入图片描述

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

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

相关文章

计算机组成原理(超详解!!) 第七节 中央处理器(下)

1.微程序控制器 微程序设计技术&#xff1a;利用软件方法来设计硬件的一门技术。 微程序控制器的基本思想&#xff1a; 仿照通常的解题程序的方法&#xff0c;把操作控制信号编成所谓的“微指令”&#xff0c;存放到一个只读存储器里。当机器运行时&#xff0c;一条又一条地…

高速电流反馈运放总结

目录 前言 基础架构 CFB运算放大器拓扑结构的进步 前言 最近项目发现有震荡&#xff0c;发现是电流反馈型运放导致&#xff0c;所以对电流运放的知识做了全面的复习。 基础架构 现在&#xff0c;我们将详细考察高速运算放大器中非常流行的电流反馈(CFB)运算放大器拓扑结 构…

Vue 局部布局 Layout 内部布局 [el-row]、[el-col]

之前的布局容器是一个整体的框架&#xff0c;layout里面的布局其实就是el-row和el-col的组合。 基础布局 使用单一分栏创建基础的栅格布局。 通过 ​row ​和 ​col ​组件&#xff0c;并通过 ​col ​组件的 ​span ​属性我们就可以自由地组合布局。 这种最简单&#xff0c;…

网络库-libevent介绍

1.简介 libevent是一个事件驱动的网络库&#xff0c;主要用于构建可扩展的网络服务器。它提供了跨平台的API&#xff0c;支持多种事件通知机制&#xff0c;如select、poll、epoll、kqueue等。 主要组件 event: 表示一个具体的事件&#xff0c;包括事件类型、事件回调等。eve…

Office之Word应用(二)

一、页眉添加文件名称和页码 1、双击页眉&#xff0c;点击“页眉-空白&#xff08;三栏&#xff09;” 2、删掉第一处&#xff08;鼠标放在上面就会选中&#xff0c;Enter即可&#xff09;&#xff0c;第二处输入文档名称&#xff0c;第三处插入页码。 注&#xff1a;插入页码时…

【CSP CCF记录】202203-2 出行计划

题目 过程 第一次提交 暴力求解&#xff0c;时间复杂度为n*n&#xff0c;超时 #include<bits/stdc.h> using namespace std; const int N100001; int n,m,k; int t[N],c[N],q[N]; int main() {cin>>n>>m>>k;for(int i0;i<n;i){cin>>t[i]&g…

计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目主要包括&#xff1a;物体表面缺陷检测技术项目介绍&#xff0c;数据构造&#xff0c;模型介绍。 物体表面缺陷检测技术是工业自动化…

深入探讨黑盒测试:等价类划分与边界值分析

文章目录 概要黑盒测试等价类划分边界值分析 设计测试用例小结 概要 在软件开发领域&#xff0c;测试是确保产品质量的关键步骤之一。而黑盒测试方法作为其中的一种&#xff0c;通过关注输入与输出之间的关系&#xff0c;而不考虑内部实现的细节&#xff0c;被广泛应用于各种软…

最短木板长度 - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 一、题目描述 小明有 n 块木板&#xff0c;第 i ( 1 ≤ i ≤ n ) 块木板长…

3分钟,学会一个 Lambda 小知识之【流API】

之前给大家介绍的 Lambda 小知识还记得吗&#xff1f;今天再来给大家介绍&#xff0c; 流API 的相关知识要点。 流API Stream是Java8中处理集合的关键抽象概念&#xff0c;它可以指定你对集合的&#xff0c;可以执行查找、过滤和映射等数据操作。 Stream 使用一种类似用 SQ…

SSRF(服务器端请求伪造)的学习以及相关例题(上)

目录 一、SSRF的介绍 二、漏洞产生的原因 三、利用SSRF可以实现的效果&#xff08;攻击方式&#xff09; 四、SSRF的利用 五、SSRF中的函数 file_get_content() 、fsockopen() 、curl_exec() 1.file_get_content()&#xff1a; 2.fsockopen(): 3.curl_exec()&#xff1…

Golang面向对象编程(二)

文章目录 封装基本介绍封装的实现工厂函数 继承基本介绍继承的实现字段和方法访问细节多继承 封装 基本介绍 基本介绍 封装&#xff08;Encapsulation&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一种重要概念&#xff0c;封装通过将数据和相关的方法组合在一起…

进程间的IPC通信机制

一、介绍 进程与进程间的用户空间相互独立&#xff0c;内核空间共享。 1.传统的进程间通信机制 a.无名管道 pipe b.有名管道 fifo c.信号 signal 2.system V中的IPC对象 a.消息队列 message queue b.共享内存 shared memory c.信号灯集 semaphoare 3.可用于跨主机传输…

【C++ 】红黑树

1.1 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff…

Android的NDK开发中Cmake报缺少对应的x86的so文件

需要实现一个串口操作的命令。 供应商提供了2个so文件。 分别是 armeabi-v7a 和 arm64-v8a 添加到对应的cpp下。 在CMakeLists.txt里添加so文件 # 添加预编译的库 add_library(libxxx SHARED IMPORTED)# 设置库的路径 set_target_properties(libxxx PROPERTIES IMPORTED_…

OPT系列极速版远距离光数据传输器|光通讯传感器安装与调试方法

OPT系列极速版远距离光数据传输器|光通讯传感器使用红外激光通信&#xff0c;满足全双工 100M 带宽&#xff0c;通讯距离可达 300 米。能够快速&#xff0c;稳地传送数据&#xff0c;支持主流的工业控制总线&#xff08;Profinet&#xff0c;Ethercat 等&#xff09;&#xff1…

如何8步完成hadoop单机安装

前言 Hadoop是一个开源框架&#xff0c;用于存储和处理大规模数据集。 系统要求 Ubuntu 20.044GB&#xff08;建议8GB&#xff09;hadoop-3.3.6 步骤1&#xff1a;更新系统 打开终端并输入以下命令来更新您的系统&#xff1a; apt update 步骤2&#xff1a;安装Java Had…

浪潮信息企业级存储逆势增长 市场份额位列中国前二

2023年&#xff0c;中国企业级存储市场竞争激烈&#xff0c;在挑战重重之下&#xff0c;浪潮信息仍然实现逆势增长&#xff0c;销售额增幅达4.7%&#xff0c;市场份额相比2022年扩大0.6%&#xff0c;位列中国前二。另外&#xff0c;在高端和全闪存阵列细分市场&#xff0c;浪潮…

文件操作IO网络编程网络原理

​ 文件操作—IO 文件在计算机中可以代表很多东西 在操作系统中, 文件主要是指硬盘文件 硬盘主要分为机械硬盘和固态硬盘。机械硬盘通过磁头在旋转的磁盘上读取数据&#xff0c;适合顺序读取。而固态硬盘则使用闪存芯片来存储数据&#xff0c;没有机械部件&#xff0c;因此读…

进程创建-fork

demo1代码状态变迁 demo2代码输出到stdout使用管道 demo1 代码 #include <pthread.h> #include <iostream> #include <unistd.h> int main(int argc, char const *argv[]) {// 1.pid_t x fork();// 2.pid_t y fork();// 3.printf("%d %d\n", x…