高性能MySQL第三版第4章学习
mysql show create table tablename
查看建表语句
用sql创建表后一定要自信看看实际生成的schema
Smaller is usually better
IP 用整形存储, 因为 IP 本来就是 32 位的无符号整数, 为了方便阅读才4个为一组分开的。
用 INET_ATON 和 INET_NTOA 函数转换
Simple is good
Avoid NULL if possible.
不能为 NULL 显示标记为 NOT NULL
if you’re planning to index columns, avoid making them nullable if possible
INT(1) 和 INt(20) 存储上没有什么区别, 括号内的宽度只是对显示格式的一个约束,所以定义时不要加宽度。
Float 4个字节,Double 8个字节, Double 精度和范围更高
DECIMAL: 是精确小数(exact fractional numbers)。 为什么就做精确小数呢???因为 Float 和 Double 在计算机内的表示方法(一般是IEE754)无法精确的表示一个精度很高的小数(如 1/3 等),只能近似表示。
那么 DECIMAL 为什么能表示呢??? 因为 DECIMAL 会通过一些方法自己计算,CPU 硬件是直接支持浮点运算的,因此Float 和 Double 运算非常块,而CPU 不支持 DECIMAL的运算,DECIMAL 运算是自己实现的,速度很慢。
除了要求高精度的金融应用,一般应用用不到 DECIMAL 类型。
一些高精度的小数可以转成 BIGINT 来表示,如万分之一分钱, 我可以统一乘以一万表示成 BIGINT。
这样就避免了 Float的不精确和 DECIMAL 的计算代价。
VARCHAR 通常会用 1到2个而外的字节存储字符串的长度,长度小于255就用1个字节存储长度, 大于255就用两个字节粗存储长度。
DateTime 时区独立的,占8个字节
TimeStamp 时区有关的,有时区信息,4个字节
区别不大,一般推荐用 TimeStamp 因为节省空间
底层没有 Boolean 类型, boolean 在底层用 tinyint 表示,占用 1个字节
Badly written schema migration programs and programs that autogenerate schemas can cause severe performance problems
自动生成的数据库schema 很危险,一定要检查,因为生成的不一定可靠,可能有性能问题, 如所有的string都用大的 VARCHAR 表示。
大部分 ORM 都支持由实体生成 schema (code first 模式), 当然也支持由数据库表直接生成实体类(database first)
网友评论