数据类型、存储引擎的选择及其数据的优化
1、主键的选择
代理主键:与业务无关的,无意义的数字序列(例如身份证号)
自然主键:事物属性中的自然唯一标识
推荐使用代理主键:
1、 在表设计时,优先推荐代理主键,不推荐自然主键(代理主键无意义,所以与业务解耦,
另一方面,自然主键是自然界的事物,一般为字符串,处理很麻烦)
2、 一个大多数表,最好是全部表,通用的键策略能够减少需要编写的源码数量,减少系统的总体拥有成本
2、字符串的选择
字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用
的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,
进而减少IO操作次数。
如:
1.纯拉丁字符能表示的内容,没必要选择 latin1 之外的其他字符编码,因为这会节省大量的存储空间。
2.如果我们可以确定不需要存放多种语言,就没必要非得使用UTF8或者其他UNICODE字符类型,
这回造成大量的存储空间浪费。
3.MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,
可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低 IO 操作
次数并提高缓存命中率。
3、存储引擎的选择
4、适当的数据冗余
1. 被频繁引用且只能通过 Join 2张(或者更多)大表的方式才能得到的独立小字段。
2. 这样的场景由于每次Join仅仅只是为了取得某个小字段的值,Join到的记录又大,会造成大量不必要的 IO,
完全可以通过空间换取时间的方式来优化。不过,冗余的同时需要确保数据的一致性不会遭到破坏,
确保更新的同时冗余字段也被更新。
5、适当拆分
当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR类型的大字段的时候,如果我们大部分
访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用
的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,
也能大大提高内存中的缓存命中率。