一、表结构优化
由于mysql是基于行(row)的数据库,数据库在操作IO的时候是以page的方式。也就是说,如果我们每条记录所占用的空间量减小,每次page中所存放的数据行数就会增大,那么每次IO可访问的行数也就增大。此外,由于内存有限,增加每个page中存放的数据行数,就等于增加每个内存块中的缓存数据量,提升缓存命中率。
数据类型选择
数据库操作中最为耗时的是IO处理,大部分数据库操作90%以上的时间都花在IO读写上面。所以尽可能减少IO读写量。
1、数字类型:
非万不得已不要使用double,不仅仅是存储长度的问题,同时还存在精确性的问题。同样,固定精度的小数,也不建议使用decimal,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。
对应整数的存储,在数据量较大的情况下,建议区分开tinyint/int/bigint的选择,因为三者占用的存储空间也有很大的差别。
2、字符类型:
非万不得已不要使用text数据类型,其处理方式决定了他的性能要低于char和varchar类型的处理。定长字段,建议使用char类型,不定长字段尽量使用varchar,且仅仅设定适当的最大长度。
3、时间类型:
尽量使用timestamp类型,因为存储空间只需要datetime类型的一半。对于只需要精确到某一天的数据,建议使用date类型,因为它的存储空间只需要3个字节,比timestamp还少。
4、lob:
强烈反对在数据库中存放 LOB 类型数据,用更适合的工具,才可以发挥到极致。而且LOB 类型数据的访问不是线程安全的,需要为其单独分配相应的数据库资源,并在操作完成后释放资源。
适当拆分
当我们的表中存在类似于text或者很大的varchar类型的大字段的时候,如果我们访问这张表的时候大部分都不需要这个字段,将其拆分到另外的独立表中,减少占用的存储空间。提高内存的缓存命中率。