图片放在下面
- 简单
- 尽量避免NULL
- 更小
- TINYINT(8)
- SMALLINT(16)
- MEDIUMINT(24)
- INT(32)
- BIGINT(64)
- 类型
- unsigned(不允许负数,并且把正上限提高了一倍)
- signed
- 内存
- 磁盘
- DECIMAL(8)
- 用于保存精确的小数
- MySQL4.1以及早期版本
- 对decimal值执行浮点运算,会因为丢失精度而导致奇怪的结果,在这些版本中,decimal仅仅是存储类型。
- MySQL5.0
- 支持精确的数学运算,服务器自身进行了decimal运算,因为CPU并不支持对她进行直接运算。
- FLOAT(4)
- DOUBLE
- 保存了可变长度的字符串
- 比固定长度类型占用更少的存储空间(只占用自己需要的空间)
- 例外是使用ROW_FORMAT=FIXED创建的MyISAM表,它为每行使用固定长度的空间,可能会造成浪费
- 当最大长度远大于平均长度,并且很少发生更新的时候,建议使用VARCHAER。解决了碎片化问题
- 固定长度
- 适合存储长度相似的值,比如用户密码的MD5
- 适合经常改变的值
- 对于很短的列,效率高于varchar
- 以二进制的形式保存大量数据
- TINYBLOB
- SMALLBLOB
- BLOB
- MEDIUMBLOB
- LONGBLOB
- mysql把blob和text当做有实体的对象来处理,存储引擎通常会特别的保存它们,InnoDB在它们较大的时候回使用单独的“外部”存储区域来进行保存,每个值在行里面都需要1到4字节,并且还需要足够的外部存储空间来保存时实际的值。
- text和blob唯一的区别就是blob保存的是二进制数据,没有字符集和排序规则,但是text有字符集和排序规则。
- Memory存储引擎不支持blob和text类型,尽可能避免使用blob和text,如果不能避免,可以使用order by substring(column,length)把这些值转换为字符串,让它们使用内存中的临时表。
- 使用enum代替字符串类型
- DATETIME
- 保存大范围的值,从1001到9999年,精度为秒(YYYYMMDDHHMMSS)与时区无关,使用了8字节存储空间
- 2008-01-16 22:37:08
- TINESTAMP
- 保持了自1970年一月一日午夜(格林尼治标准时间)以来的秒数,和UNIX的时间戳相同,只占用了4字节的存储空间,表示1970-2038年。
- BIT
- Image
- 使用bit要小心,尽量避免
- 如果只想保存一位的true/false,另一个选择是创建一个可空的CHAR(0)列,它能保存空值(NULL)或0长度的值(空字符串)
- SET
- 如果要保存许多true/false值,可以考虑把许多列合并为SET数据类型,它在MySQL内部是以一系列位表示的。有效的使用了存储空间,主要缺点是改变列定义的代价比较高(需要ALTER TABLE),通常来说也不能在SET列上使用索引进行查找。
- Image
- 通常是标识符的最佳选择,因为速度快,并且能使用AUTO_INCREMNET
- 注意随机值的字符串
- Image
- Image
- 索引死帮助MySQL高效获取数据的数据结构,当数据很大,性能下降,这时候索引就很重要了
- 为什么要小心自动生成的框架.rtfd
- MySQL只能高效的搜索索引最左前缀。
- 索引实在存储引擎层实现的,而不是服务器层。
- B-Tree索引