这一章主要是讲表字段的一些优化和陷阱。
字段优化的一般原则:
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:变长。适合存变动少的、字符串列的最大长度远大于平均长度;使用了UTF-8复杂的字符集
char:定长。适合存贮短的字符串 或者 长度差不多的字符串。
分析:
注意,当存储CHAR值时,MySQL删除所有尾随空格。如果需要进行比较,值会用空格填充。
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。具体看是否满足需要。
其他可替代方案:
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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务