Mysql数据类型设计思考

一、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.mzph.cn/pingmian/11616.shtml

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

相关文章

迄今为止最全- 前端性能优化

简介 当我们说前端性能优化的时候&#xff0c;指的可能是不同场景的性能优化。前端涉及性能优化的场景主要有&#xff1a; 项目构建性能优化 页面性能优化 加载时性能优化 运行时性能优化 构建性能主要指构建速度&#xff0c;优化方法和打包工具直接相关&#xff0c;主要…

高效管理文件技巧:一键利用文件大小,轻松移动到指定文件夹

在日常生活和工作中&#xff0c;我们经常需要管理大量的文件&#xff0c;包括文档、图片、视频等各种类型。然而&#xff0c;手动分类和移动这些文件往往是一项繁琐且耗时的任务。为了提高文件管理的效率&#xff0c;我们可以采用一些高效的管理技巧&#xff0c;比如利用文件大…

GBase 8s 数据库集群切换及恢复

GBase 8s 数据库切换分为自动切换、由CM控制的按FOC规则的切换、手工切换。 自动切换 全自动切换用于HAC集群中&#xff0c;由于集群只有两个节点&#xff0c;数据库相互之前进行状态检查&#xff0c;发现异常时&#xff0c;能按DRAUTO的配置方式进行自动切换。 在HAC集群中&…

3.整数运算

系列文章目录 信息的表示和处理 : Information Storage&#xff08;信息存储&#xff09;Integer Representation&#xff08;整数表示&#xff09;Integer Arithmetic&#xff08;整数运算&#xff09;Floating Point&#xff08;浮点数&#xff09; 文章目录 系列文章目录前…

基于Echarts的大数据可视化模板:服务器运营监控

目录 引言背景介绍研究现状与相关工作服务器运营监控技术综述服务器运营监控概述监控指标与数据采集可视化界面设计与实现数据存储与查询优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性…

Android:资源的管理,Glide图片加载框架的使用

目录 一&#xff0c;Android资源分类 1.使用res目录下的资源 res目录下资源的使用&#xff1a; 2.使用assets目录下的资源 assets目录下的资源的使用&#xff1a; 二&#xff0c;glide图片加载框架 1.glide简介 2.下载和设置 3.基本用法 4.占位符&#xff08;Placehold…

[ 视频号]代替用户发布视频api

使用接口&#xff0c;替代用户使用设备直接发布视频api 接口地址&#xff1a; http://接口地址/api/v2 先调用登录接口&#xff0c;进行账号登录 登录二维码接口入参&#xff1a; {"appId": "","proxyIp": "","regionId"…

WWW服务器搭建(1)——HTTP协议原理篇

目录 一、WWW的相关概念 1.1 WWW的定义 1.2 超文本标记语言HTML 1.3 统一资源定位符URL 1.4 超文本传输协议HTTP 二、HTTP协议工作过程 2.1 DNS解析 2.2 TCP连接过程 2.3 HTTP 请求与响应 2.4 TCP连接断开 三、HTTP请求报文格式 3.1 请求行 3.2 请求头 3.3 空行 …

Docker部署Azure chatgpt样例应用

Github地址 https://github.com/microsoft/sample-app-aoai-chatGPT?tabreadme-ov-file#environment-variables 使用Amazon Linux 2 AMI 的arm 64版本镜像, t4g.medium实例。 需要安装git&#xff0c;可能需要安装 pip3等 sudo apt-get install -y python3-pip 然后从如下…

安卓短视频一键搬运软件_V1.5.2 高级版

短视频一键搬运app是一款非常实用的视频处理软件&#xff0c;拥有各种各样的视频处理功能&#xff0c;可以帮助用户进行视频的多项处理&#xff0c;首先用户可以在这里为视频去除水印&#xff0c;打开视频文件过后&#xff0c;再把视频里面的水印内容框选出来&#xff0c;这样就…

QT程序启动前的预加载与QT程序的启动动画(C++)

一、目标任务 在Qt的程序启动前需要做一些预加载操作&#xff0c;这个过程可能持续十几秒&#xff0c;这会让QT程序卡住&#xff0c;所以希望在此期间显示启动动画&#xff1b; 二、具体实现 1、预加载内容的处理 此处需要将预先加载的程序内容放在单独一个线程中&#xff08…

外卖 点金推广实战课程,2024外卖 点金推广全流程(7节课+资料)

课程内容&#xff1a; 外卖点金推广实操课程 资料 01 1-了解外卖.mp4 02 第一节:点金推广的说明.mp4 03 第二节:如何降低点金推广的成本,mp4 04 第三节:如何计算点金推广的流速,mp4 05 第四节:如何提升点金的精准度,mp4 06 第五节:点金推广实操,mp4 07 点金推广高级教程…

volatile详解、原理

文章目录 一、Volatile的定义和作用1.1 Volatile简介1.2 Volatile作用 二、并发编程中的三个问题&#xff1a;可见性、原子性、有序性二、Java内存模型&#xff08;JMM&#xff09;三、volatile变量的特性3.1 线程可见性3.2 禁止重排序禁止重排序原理禁止重排序举例 3.3 volati…

vue3 第二十八节 (vue3 事件循环之JS事件循环)

1、什么是事件循环 事件循环就是消息队列&#xff0c;是浏览器渲染主线程的工作方式&#xff1b; 过去将消息队列&#xff0c;简单的分为宏任务 和微任务 两种队列&#xff0c;而对于现在复杂多变的浏览器环境&#xff0c;显然这种处理方式已经不能满足使用&#xff0c;取而代…

AI试衣IDM-VTON,Windows11本地安装配置记录!

昨天我们已经介绍过IDM-VTON这个开源项目了。 通过这个软件可以轻松实现一键换衣服。 昨天&#xff0c;简单演示了一下在线使用。 今天&#xff0c;来演示如何安装到本地电脑上&#xff01; 本地配置会有一定的专业性&#xff0c;懂的人可以参考下。 不懂得直接拉到最后&am…

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

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

AI大模型客服机器人VS传统客服机器人

摘要&#xff1a;AI大模型客服机器人相较于传统客服机器人&#xff0c;具有更准确的语义理解、丰富的知识库、更自然的交互体验、个性化服务、自主学习和数据分析能力。传统客服机器人受限于规则和固定关键词&#xff0c;难以处理复杂查询和提供个性化服务。 1. 更准确的语义理…

正则表达式(python实例)

正则表达式&#xff08;python实例&#xff09; 一、简介 正则表达式&#xff08;Regular Expressions&#xff0c;简称 Regex&#xff09;是一种用来描述文本模式的工具&#xff0c;它通过一系列字符和特殊字符组合成的表达式&#xff0c;用于在文本中进行模式匹配和搜索。这…

【索引】索引基础

索引 在关系型数据库中&#xff0c;索引是一种用来帮助快速检索目标数据的存储结构。 索引的创建 MySQL可以通过CREATE、ALTER、DDL三种方式创建一个索引。 1、使用CREATE语句创建 CREATE INDEX indexName ON tableName (columnName(length) [ASC|DESC]);2、使用ALTER语句…

基于GD32的简易数字示波器(5)- 软件_控制LED

这期记录的是项目实战&#xff0c;做一个简易的数字示波器。 教程来源于嘉立创&#xff0c;帖子主要做学习记录&#xff0c;方便以后查看。 本期主要介绍GPIO口的输入输出模式&#xff0c;使用其中的输出模式驱动LED。详细教程可观看下方链接。 2.2 LED控制实验 语雀 1、LE…