选择优化的数据类型
数据类型选择的基本原则
尽量使用可以正确存储数据的最小数据类型 | ①. 更小的通常更好 ②. 确保没有低估需要存储的值的范围 ③. 选择不会超过范围的最小类型 |
尽量选择简单数据类型 | ①. 简单数据类型的操作通常需要更少CPU周期,例如:整型的操作代价比字符串更低 |
避免NULL | ①. 除非真的需要NULL值,尽量设置NOT NULL ②. NULL会占用更多的存储空间 ③. NULL会使mysql更难优化,更复杂 ④. 对NULL改成NOT NULL的性能提升比较小,不是最优先项 ⑤. 但是如果是计划成为索引列的字段,尽量设置为NOT NULL |
一旦选择完数据类型,确保相关表中的数据类型都相同,包括unsigned这种属性,防止出现性能问题 标识列的字段选择尽量选择整数类型,字符串其次(不包括随机字符串:如md5()生成的)
|
MYSQL表设计注意点
尽量避免过多的字段列使用 | 尤其是避免有大量的无效列 |
单个查询最好最好在12个表以内做关联 |
|
使用枚举的情况下,尽量避免使用过多的枚举个数 |
|
集合不能滥用 |
|
NULL不能滥用,但是有时候使用NULL会比用数字代替更安全,不容易产生偏差 |
|
范式和逆范式
范式 | 逆范式 |
①. 每列都不可再分,具备原子性 ②. 每行数据仅与其中一列有关系 ③. 数据不存在传递关系 |
|
范式的优点: ①. 更新操作更快 ②. 更少或者没有重复数据,更少的修改 ③. 表更小,在内存在执行操作更快 ④. 更少使用group by和distinct
范式的缺点: ①. 通常需要关联查询,代价昂贵 容易造成索引策略失效 | 逆范式的优点: ①. 有效避免关联,避免关联的随机IO,更快 ②. 有效的索引策略
逆范式的缺点: ①. 数据冗余 ②. 更新操作量大 |
混合使用范式和逆范式是实际使用的方式 |
计数器表的并发性能优化
普通的计数器表为一张表,一个字段(num),只有一行,仅做计数使用 |
为了提高并发性能 |
可以提前插入100行数据,一张表,两个字段(id,num),100行0值记录 |
update table set num = num+1 where id= floor(rand()*100+1); select sum(num) from table; |