MySQL调优系列(二)——数据类型优化

news2024/10/5 6:15:16

一、总则

1、更小的数据类型更好

应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择你认为不会超过范围的最小类型。

2、简单的就好

简单数据类型的操作通常需要更少的CPU周期,例如:
1、整型比字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂
2、使用mysql自建类型而不是字符串来存储日期和时间
3、用整型存储IP地址(整型存储可以减少空间,但是减少了阅读性)

3、尽量避免null

如果查询中包含可为NULL的列,对mysql来说很难优化,因为可为null的列使得索引、索引统计和值比较都更加复杂。坦白来说,通常情况下null的列改为not null带来的性能提升比较小,所以没有必要将所有的表的schema进行修改,但是应该尽量避免设计成可为null的列。

二、细则

1、整型

可以使用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。尽量使用满足需求的最小数据类型。

2、字符和字符串

1、char长度固定,即每条数据占用等长字节空间;最大长度是255个字符,适合用在身份证号、手机号等定长字符串。
2、varchar可变长度,可以设置最大长度;最大空间是65535个字节,适合用在长度可变的属性。
3、text不设置长度,当不知道属性的最大长度时,适合用text 。

在这里插入图片描述
按照查询速度:char>varchar>text。

3、BLOB和TEXT类型

MySQL 把每个 BLOB 和 TEXT 值当作一个独立的对象处理。
都是为了存储很大数据而设计的字符串类型,分别采用二进制和字符方式存储。

4、datetime和timestamp

在这里插入图片描述

1、不要使用字符串类型来存储日期时间数据
2、日期时间类型通常比字符串占用的存储空间小
3、日期时间类型在进行查找过滤时可以利用日期来进行比对
4、日期时间类型还有着丰富的处理函数,可以方便的对时间类型进行日期计算
5、使用int存储日期时间不如使用timestamp类型

5、使用枚举代替字符串类型

可以使用枚举类代替常用的字符串类型,mysql存储枚举类型会非常紧凑,会根据列表值的数据压缩到一个或两个字节中,mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的查找表。
create table enum_test(e enum(‘fish’,‘apple’,‘dog’) not null);
insert into enum_test(e) values(‘fish’),(‘dog’),(‘apple’);
select e+0 from enum_test;
枚举在实际存储存储的是1.2.3数字。

6、特殊类型数据

人们经常使用varchar(15)来存储ip地址,然而,ip的本质是32位无符号整数不是字符串,可以使用INET_ATON()和INET_NTOA函数在这两种表示方法之间转换。

select inet_aton('1.1.1.1');
select inet_ntoa(16843009);

7、主键选择

代理主键(与业务无关的,无意义的数字序列),自然主键(事物属性中的自然唯一标识)。
推荐使用代理主键,不与业务耦合,更容易维护。通用的键策略能够减少需要编写的源码数量,减少系统的总体拥有成本。比如id。

8、字符集

1.纯拉丁字符能表示的内容,没必要选择 latin1 之外的其他字符编码,因为这会节省大量的存储空间。
2.如果我们可以确定不需要存放多种语言,就没必要非得使用UTF8或者其他UNICODE字符类型,会造成大量的存储空间浪费。
3.MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低 IO 操作次数并提高缓存命中率。但是设计起来更加复杂。

9、存储引擎选择

见另一篇文章。

10、适当的数据冗余或者拆分

1、可以通过空间换取时间的方式来优化(数据冗余):频繁引用且只能通过 Join 2张(或者更多)大表的方式才能得到的独立小字段。会造成大量不必要的 IO。
2、当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。(拆数据库或者拆表)

11、合理使用范式和反范式

并不是一味的遵守范式就是好的,应根据实际业务情况合理使用范式和反范式,重点是看业务需求是什么,这也是一个设计者应该具备的能力。

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

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

相关文章

OpenCV中的图像处理3.1-3.3(三)色彩空间、几何变换、阈值处理

目录 3.1 改变色彩空间目标改变色彩空间对象跟踪如何找到HSV值来追踪?练习 3.2 图像的几何变换目标变换缩放平移旋转仿射变换透视变换其他资源 3.3 图像阈值处理目标简单的阈值处理自适应阈值处理Otsu的二值化Otsu的二值化是如何工作的?其他资源练习 翻译…

Netty基础(二)

1.Netty高性能架构设计 1.1.线程模型基本介绍 1>.不同的线程模式,对程序的性能有很大影响,为了搞清Netty线程模式,我们来系统的讲解下各个线程模式,最后看看Netty线程模型有什么优越性; 2>.目前存在的线程模型有: ①.传统阻塞I/O服务模型; ②.Reactor(反应器)模式; 3…

The Annotated Diffusion Model(翻译)

The Annotated Diffusion Model(翻译) 来源: https://huggingface.co/blog/annotated-diffusion code: 在这篇博文中,我们将更深入地研究去噪扩散概率模型(也称为 DDPM、扩散模型、基于分数的生成模型或简称为自动编…

一、PEMFC基础之热力学

一、PEMFC基础之热力学 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图2.可逆电压与温度和压力的关系3.能斯特方程4.燃料电池效率 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图 2.可逆电压与温度和压力的关系 标准状态可逆电压Er计算: E …

JAVA15新特性

JAVA15新特性 概述 2020年9月15日,java15正式发布,(风平浪静的一个版本)共有14个JEP,是时间驱动形式发布的第六个版本.相关文档: https://openjdk.java.net/projects/jdk/15/ 一个孵化器阶段,三个预览,两个废弃和两个移除 JAVA15参与企业 java各版本主要特征 JDK5 :enum 泛型…

【面试】面试官:说一下线程池7个参数的含义?

文章目录 前言一、参数1:corePoolSize二、参数2:maximumPoolSize三、参数3:keepAliveTime四、参数4:TimeUnit五、参数5:BlockingQueue六、参数6:ThreadFactory七、参数7:RejectedExecutionHandl…

5月1日启动|2023年CSC西部/地方合作项目即将申报

2023年国家留学基金委(以下简称CSC)西部地区人才培养特别项目(以下简称“西部项目”)及地方合作项目选派工作即将开始,为此知识人网小编整理出以下申请要点,提醒申请者注意。 一、可以申报的省份 1.西部项…

hive sql实战案例-访问开始结束时间

问题描述 现在我们有一张用户访问区域的记录表,有三个字段:user_id表示用户ID,area表示用户访问的区域,visit_time是访问时间。求用户对某一区域访问的开始和结束时间,结果如右表所示。 分析问题 101访问了上午和晚…

InnoDB 与MyISAM 的区别

MyISAM和InnoDB都是Mysql里面的两个存储引擎。 在Mysql里面,存储引擎是可以自己扩展的,它的本质其实是定义数据存储的方式以及数据读取的实现逻辑。 不同存储引擎本身的特性,使得我们可以针对性的选择合适的引擎来实现不同的业务场景。从而获…

大数据框架-Hadoop

大数据框架-Hadoop 1.什么是大数据 大数据是指由传统数据处理工具难以处理的规模极大、结构复杂或速度极快的数据集合。这些数据集合通常需要使用先进的计算和分析技术才能够处理和分析,因此大数据技术包括了大数据存储、大数据处理和大数据分析等方面的技术和工具…

工作日记NO.2

1. 安装局域网内网通; 2. 安装VS2017AutoCADObjectARX VS2017AutoCAD2020配置ObjectARX VS2017AutoCAD2020配置ObjectARX (dgrt.cn) 3. ObjectARX简介 ObjectARX简介 - CAD安装教程 - 土木工程网 (civilcn.com) CAD系统二次开发-ObjectARX中的实体造型技术 (r…

【LeetCode】9,回文数。 难度等级:简单。巧妙解法很多,值得推敲。

文章目录 一、题目二、我的解答:逐个判断对应位置的首末数字是否相同三、其他解答3.1 将数字x转为字符串进行处理3.2 反转一半数字进行比较 LeetCode 第9题,回文数;难度等级:简单 一、题目 二、我的解答:逐个判断对应…

【C++复习1】程序结构和C++的工作原理

如果你是一名newbird的话,建议先看如下的视频加深理解后,再看下面的内容: https://www.bilibili.com/video/BV1N24y1B7nQ?p6 声明 以下的内容均由chatGpt编写与对上面这个视频进行总结生成,我就只负责改改格式。 C的工作原理 …

Live800:在线客服系统对客服管理有哪些好处?

互联网的不断发展,让越来越多的企业开始使用在线客服系统来提高客户服务质量。但是,很多人并不了解在线客服系统对客服管理的好处。本文将介绍在线客服系统的一些能够提高客服管理效率和提升用户满意度的管理功能。 实时客服监控 在线客服系统可以实时监…

MPU6050详解(含源码)

前言:MPU6050是一款强大的六轴传感器,需要理解MPU6050首先得有IIC的基础,MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,内部有硬件算法支持. 1…

JumpServer Harbor

Jumpserver是一款开源的堡垒机,可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作,并且支持大部分操作系统,是一款非常安全的远程连接工具 安装JumpServer jumpserver.org官网去下载安装,有一键安装(里…

【回溯篇(3)---最少城市数】

1、最少城市数 【题目】 下图表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。 【算法分析】 看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图。…

BM14 链表的奇偶重排

链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com) 双指针解决 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改&#x…

Android 9.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

1.前言 在android9.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右…

Linux_红帽8学习笔记分享_9(文件系统管理FS Management与swap交换分区管理)

Linux_红帽8学习笔记分享_9(文件系统管理FS Management与swap交换分区管理) 文章目录 Linux_红帽8学习笔记分享_9(**文件系统管理FS Management与swap交换分区管理**)1.fdisk分区命令的使用技巧1.1 创建大小为100M,200M,300M,400M,500M的5个磁盘分区(MBR分区表类型)1.2创建大小…