优化表的数据类型
应用设计的时候需要考虑字段长度留有一定冗余,但是不能留有大量的冗余。这样浪费磁盘存储空间,同时在应用程序操作时也浪费物理内存。
数据类型通常更小的更好。一般应该尽可能使用能正确存储数据的最小数据类型,更小的数据类型通常更快,因为他们占用更少的磁盘、内存和CPU缓存,并且处理需要的CPU周期更少。
整型比字符串操作代价更低,一般整型>字符串>时间
在MySQL中 可以使用函数PROCEDURE ANALYSE()对当前应用的表进行分析
语法 select * from tb1_name procedure analyse();
输出的每一列信息都会对数据表中的列的数据类型提出优化建议
select * from tb1_name procedure analyse(16,256);
不要为那些包含的值多余16个或者256个字节的ENUM类型提出建议
如果没有这样的限制 输出信息可能很长 ENUM定义通产很难阅读
通过拆分提高表的访问效率
MyISAM类型的表拆分
1 垂直拆分 按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分,即把主码和一些列放到一个表 然后把主码和另外的列放到另一个表中。
适用情况:一个表中的某些列常用,而另一些列不常用,则可以采用垂直拆分
优点:垂直拆分可以使得数据行变小,一个数据页就能存放更多的数据,减少I/O次数。这样使得数据模块更清楚,数据维护起来更方便。
缺点:需要管理冗余列,查询所有数据需要联合操作,有些查询无法再数据库层面解决,如果依然有大表造成的性能问题,解决不了。并且切分到一定程度的话,扩展性就会遇到限制。过度切分可能会带来系统过渡复杂而难以维护。
2 水平拆分 将某个访问极其频繁的表再根据一列或多列数据的某种规则来分散到多个独立表之中,每个表中包含一部分数据。
适用情况:
1 表很大 分割后可以降低在查询时需要读的数据和索引的页数 同时也降低了索引的层数提高查询速度
2 表中的数据本来就有独立性
3 需要把数据存放到多个介质上
逆规范化
数据库规范化越高 产生的关系越多 关系过多的直接结果就是导致表之间的连接操作越繁琐 而表之间的连接操作室性能较低的操作 直接影响到查询的速度 所以 对于查询较多的应用 就需要根据实际情况运用逆规范化对数据进行设计 通过逆规范化来提高查询的性能
反规范的好处是降低连接操作的需求降低外码和索引的数据 还可能减少表的数目 相应带来的问题是可能出现数据的完整性问题 加速查询速度 但会降低修改速度
使用反规范要仔细分析应用的数据存取需求和实际的性能特点 能用索引和其他方法解决问题就不使用反规范
常用反规范方法
1 增加荣誉列 在表中具有相同列 他常用来在查询时避免连接操作
2 增加派生列 增加的列来自其他表中的数据 由其他表中的数据经过计算生成 增加的派生列 其作用是在查询时减少连接操作 避免使用集函数
3 重新组表 如果许多用户需要查看两个表连接出来的结果数据 则把这两个表重新组成一个表来减少连接而提高性能
4 分割表 水平分割和垂直分割
管理和维护数据的完整性的常用方法
1 批处理维护是指对复制列或派生列的修改积累一定时间后运行一批处理作业或存储过程对复制或派生列进行修改 这只能在对实时性要求不高的情况下使用
2 数据的完整性也可由应用逻辑来实现 这就要求必须在同一事物中对所有涉及的表进行增删改操作 而应用逻辑来实现数据的完整性分先较大 因为统一逻辑必须在所有的应用中使用和维护 容易遗漏特别是在需求变化时 不易于维护
3 触发器 对数据的任何修改立即触发对复制列或派生列的相应修改 触发器是实时的 而相应的处理逻辑只在一个地方出现 易于维护 一般来说 是解决此类问题比较好的办法
使用中间表提高查询速度
场景 在数据量较大的表 在其上进行查询通常会效率很低 并且还要考虑统计查询是否会对在线的应用产生负面影响
优点
1 中间表复制源表部分数据 并且与源表相隔离 在中间表上做统计查询不会对在线应用产生负面影响
2 中间表上可以灵活地添加索引或者增加临时用的新字段 从而达到提高统计查询效率和辅助统计查询作用