MySQL数据库中数据类型优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文介绍了数据库优化中关于数据类型的一些优化细节。

数据库中数据类型优化

首先我们介绍一下这个schema:

schema(发音 “skee-muh” 或者“skee-mah”,中文叫模式)是数据库的组织和结构

选择优化的数据类型

mysql支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储那种类型的数据,下面几个简单的原则你需要记住。

  • 更小的通常更好
  • 简单就好
  • 尽量避免null

整数类型

我们有以下几种整数类型:

TINYINT SMALLINT MEDIUMINT INT BIGINT
8位 16位 24位 32位 64位

他们的存储空间范围从-2(N-1)次方到2的(N-1)次方减一。N是位数

整数类型有可选的unsigned属性,表示不允许负值,这大致可以使正数的上限提高一倍。

实数类型

实数嘛,就是带有小数部分的数字,然而,它不只是为了存储小数部分;也可以使用decimal存储比bigint还大的整数。

decimal(18,9)小数点两边各存储9个数字,一个使用9个字节;小数点前的数字使用4个字节,小数点后的数字使用4个字节,小数点本身占一个字节。

因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal--例如存储财务数据,但是在数据量比较大的时候们可以使用bigint代替decimal,将存储的数据根据小数的位数乘以相应的倍数即可。

字符串类型

varchar

用于存储可变长的字符串,如果MySQL使用 ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储,这会很浪费空间。

varchar需要使用1个或者2个额外的字节记录字符串的长度。例如:varchar(10)的列需要11个字节的存储空间。

但是由于行是变长的在update的时候可能使行变得比原来更长,这就导致需要额外的工作。例如myisam会将行拆成不同的片段存储,innodb则需要分裂页来使行可以放进页内。

char

char类型是定长的,当存储char值时。mysql会删除所有的末尾空格。

char适合存储很短的字符串,或者所有值都接近同一个长度。例:char十分适合存储密码的md5值。

对于经常变更的数据,char也比varchar好,因为定长的char类型不容易产生碎片。

BLOB和TEXT

都是为了存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。

MySQL把每个blob和text值当做一个独立的对象处理。存储引擎在存储时通常会做特殊处理。当blob和text值太大时,innodb会使用专门的外部存储区域进行存储,此时每个值在行内需要1--4个字节来存储一个指针,然后在外部的存储区域存储实际的值。

BLOB和TEXT家族之间仅有的不同是BLOB类型存储的是二进制数据,没有排序规则或字符集,而text类型有字符集和排序规则。

使用枚举enum代替字符串类型

有时候可以使用枚举列来代替常用的字符串类型。枚举列可以把一些不重复的字符串存储成一个预定义的集合。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;

image-20220913161520851

SELECT e FROM enum_test;

image-20220913161622827

所以使用数字作为enum枚举常量,这种双重性很容易导致混乱,例如enum(’1‘,’2‘,’3‘)。所以尽量别这么用。

另外一个让人大吃一惊的事情是:

%E5%A4%A7%E5%90%83%E4%B8%80%E6%83%8A.jpeg

枚举字段是按照内部存储的整数而不是定义的字符串进行排序的。

枚举最不好的地方是,字符串列表是固定的,添加或删除字符串必须使用ALTER TABLE 。因此对于一系列未来可能改变的字符串,枚举并不是一个好主意。

日期和时间类型

DATETIME

这个类型可以保存大范围的值,从1001年到9999年,精度为秒,他把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。使用8个字节的存储空间。

TIMRSTAMP

就像它的名字一样TIMESTAMP类型保存了从1970年1月1日午夜(格林尼治标准时间)以来的秒数。它和unix时间戳相同。timestamp值使用4个字节的存储空间,因此他的范围比datetime 小的多。只能表示从1970到2038年MySQL提供了FROM_UNIXTIME()函数把Unix时间戳转换为日期,并且提供Unix_TIMESTAMP()函数把日期转换为Unix时间戳。

位数据类型

BIT

mysql把bit当做字符串类型,而不是数字类型,当检索bit(1)的值时,结果是一个包含二进制0或1 的字符串,而不是ascii码的0,1。

SET

如果需要保存很多true/false值,可以考虑合并这些列到一个set数据类型,他在mysql内部是以一系列打包的位的集合来表示的。这样可以有效的利用空间,并且MySQL有像FIND_IN_SET()和FIELD()这样的函数,方便地在查询中使用。

它的主要缺点是改变列的定义的代价较高:需要alter TABLE,这对大表来说是非常昂贵的操作。

选择标识符

特殊类型数据

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
数据库 索引
如何优化数据库索引?
【8月更文挑战第14天】如何优化数据库索引?
18 4
|
1天前
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
8 2
|
5天前
|
存储 SQL 缓存
优化数据库
【8月更文挑战第15天】优化数据库
9 1
|
6天前
|
SQL 存储 数据库
OceanBase数据库优化
【8月更文挑战第14天】OceanBase数据库优化
9 2
|
6天前
|
数据库连接 数据库
实现加载驱动、得到数据库对象、关闭资源的代码复用,将代码提取到相应的工具包里边。优化程序
该博客文章展示了如何通过创建工具类`Connectiontools`实现数据库连接、语句执行以及资源关闭的代码复用,以优化程序并提高数据库操作的效率和安全性。
|
9天前
|
SQL 关系型数据库 MySQL
"告别蜗牛速度!解锁批量插入数据新姿势,15秒狂插35万条,数据库优化就该这么玩!"
【8月更文挑战第11天】在数据密集型应用中,高效的批量插入是性能优化的关键。传统单条记录插入方式在网络开销、数据库I/O及事务处理上存在明显瓶颈。批量插入则通过减少网络请求次数和数据库I/O操作,显著提升效率。以Python+pymysql为例,通过`executemany`方法,可实现在15秒内将35万条数据快速入库,相较于传统方法,性能提升显著,是处理大规模数据的理想选择。
26 5
|
8天前
|
存储 缓存 运维
优化高并发环境下的数据库查询性能:实战经验与技巧
在高并发环境下,数据库性能往往成为系统瓶颈。本文将深入探讨在高并发场景下优化数据库查询性能的策略与实践,包括索引优化、查询优化、数据库架构设计以及缓存机制的应用。通过对具体案例的分析,读者将能够掌握提升数据库性能的关键技术,从而在面对大规模用户请求时提高系统的响应速度和稳定性。
|
9天前
|
存储 关系型数据库 MySQL
MySQL 上亿大表,如何深度优化?
【8月更文挑战第11天】随着大数据时代的到来,MySQL 作为广泛使用的关系型数据库管理系统,经常需要处理上亿级别的数据。当数据量如此庞大时,如何确保数据库的查询效率、稳定性和可扩展性,成为了一个亟待解决的问题。本文将围绕 MySQL 上亿大表的深度优化,分享一系列实用的技术干货,帮助你在工作和学习中应对挑战。
25 1
|
4天前
|
存储 SQL 关系型数据库
探索MySQL的执行奥秘:从查询执行到数据存储与优化的深入解析
探索MySQL的执行奥秘:从查询执行到数据存储与优化的深入解析

热门文章

最新文章