您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页表字段优化

表字段优化

来源:爱问旅游网

这一章主要是讲表字段的一些优化和陷阱。
字段优化的一般原则:

整数、实数

int(11)和int(20)在计算和存储上没有差别,只是在一些客户端上显示不同的字符个数而已。
实数一般可以用float、double、decimal。float和double使用的空间更少,但是高精度时不准确,所以不推荐指定精度。比如float(5,2) :最多表示5个数字(包括整数和小数个数),小数最多两位。所以整数最多占3位,剩下的2位是给小数用的。
比如1234不合法,因为变为1234.00超过了5位。

在对小数进行精确计算时才使用DECIMAL——例如,存储财务数据。
一些大容量的场景,可以考虑使用BIGINT代替DECIMAL。 比如把数字乘以一百万,
(比如12345.67元,乘以100万就是123456700)然后用bigint存储,既可以避免float的精度问题和decimal精确计算代价高的问题。

字符

varchar和char。

varchar:变长。适合存变动少的、字符串列的最大长度远大于平均长度;使用了UTF-8复杂的字符集
char:定长。适合存贮短的字符串 或者 长度差不多的字符串。
分析:

  1. varchar是变长的,定义varchar(50),比如之前存的是“ab”,后面改成了“abcddd…”这样可能导致他在原本的存储位置上不够,可能导致页的啥的。
  2. “字符串列的最大长度远大于平均长度”。比如名字,平均4个字符左右,我们可以指定varchar(50),这样比char(50)更好。
  3. 在 UTF-8 编码中,每个字符的长度不是固定的,而是根据字符的 Unicode 码点来决定的。一些字符可能只需要 1 个字节来存储,而一些特殊字符或 Unicode 码点较高的字符可能需要 2、3 或更多个字节来存储。
  4. varchar需要额外的1~2个字节来保存长度。比如varchar(10),实际需要11个字节。varchar(256),实际需要12个字节,其中2个字节用来保存长度。

注意,当存储CHAR值时,MySQL删除所有尾随空格。如果需要进行比较,值会用空格填充。

blob和text

BLOB和TEXT用来存储大的数据,分别采用二进制和字符方式存储。text有字符集和排序规则。
MySQL不能将BLOB和TEXT数据类型的完整字符串放入索引,也不能使用索引进行排序。

使用枚举代替(不推荐)

当可以穷举时,可以用枚举代替。一般更节约空间。在存储时,会根据定义的位置存为数字。所以不要枚举数字ENUM(‘1’,‘2’,‘3’)。
执行下面语句,看到结果:

CREATE TABLE TEST_ENUM (
ID TINYINT PRIMARY KEY,
ANIMAL ENUM('TIGER','BIRD','LION')
);

INSERT INTO TEST_ENUM(ID,ANIMAL) VALUES(1,'LION'),(2,'BIRD'),(3,'TIGER');

SELECT * FROM TEST_ENUM ORDER BY ANIMAL;

日期

datetime和timestamp。
timestamp省空间,但是会遇到2038年问题。
一般还是推荐使用datetime。具体看是否满足需要。
其他可替代方案:

  • 用date 和time两个字段存储。
  • 用int存。比如20240729155029,表示2024-07-29 15:50:29。或者可以存时间戳。
  • 用字符串存。(不推荐。原因见开头)

位压缩数据类型(不推荐)

bit和set.从技术上来说都是字符串类型。
bit每一位可以表示true或false。实际存的是二进制01的字符串。注意在数字上下文中,会变为数字。如图,bit里面存的是二进制00111001。10进制下是57,ASCII表示的是9。所以不推荐使用

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务