数据库设计对性能的影响

数据库结构设计和数据库优化呢,是我们后面几张主要的内容,所以我们这里先简单的看几个和数据库的设计,

和SQL优化有关的对数据库性能产生影响的一些易犯的错误,我们现在对如何高性能的数据库设计,和SQL优化的方法呢,

详细的讨论,我们在设计数据库结构时呢,比较容易犯的第一个错误呢,就是对表进行过多的反范式化的设计,这就会造成

表中列过多,虽然说MSYQL运行给一个表建立很多的列,但是由于MYSQL的架构是插件的原因,MYSQL服务器层和存储引擎层,

是分离的,MYSQL的存储引擎,API工作时呢,需要把在服务器层和存储引擎层之间,通过缓冲拷贝数据,在服务器层将缓冲的内容

解析成各个列,这个操作过程成本是非常高的,特别是对于MYISAM变长结构,和Innodb的行结构呢,在进行解析时还必须进行转换,

这个转换的成本就还依赖于列的数量,所以如果一个表的列太多,在使用这个表时呢,就会带来额外CPU的消耗,所以大家在进行表

设计的时候呢,一定要注意,不要把所有相关的列呢,放到一个表中,而是要按照范式化,适当的把表进行拆分,关于什么是范式化,

后面有详细的讨论,在这里只要大家记录一下,一个表如果有太多列的话,对性能产生很不好的影响,就可以了,而第二个易犯的错误

呢,和上面的正好相反,就是对数据库设计过分的使用了范式化的思路,对于任何查询呢,都要关联很多的表来完成,通过上面的计算呢,

应该知道,在MYSQL中,进行表关联的成本是很高的,而且性能呢也会随着关联表的增加而下降,所以MYSQL对于可关联表的数量呢,进行了

一个限制,MYSQL最多只能关联一个表,这个限制虽然对于大多数应用来说,已经足够了,但是我们为了MYSQL的性能呢,我们还是要尽量

的减少,关联的表,对于关联表最好是关联在10个以内,这就要求我们,在进行数据库设计时呢,应当进行适当的反范式化的设计,

把经常使用的两个小表呢,合成一个大表,这样对提升数据库的性能,和查询的性能都是很有帮助的,而第三个易犯的问题就是,

OLTP环境中,错误的使用了分区表,分区表是个好东西,帮助我们把一个大表,从物理存储上,按照分区键,分成多个小表,

这里要注意,分区表和我们常说的分库分表是有差别的,分区表是在同一个数据库实例上所进行的,而在物理存储上呢,

分成了多个小表,但是在使用时呢,实际上还是一个表,而分库分表呢,所要做的操作,不只是物理上对表进行了拆分,

在逻辑上也会拆分多个表,而且分库分表后呢,这多个表通常是不在同一个数据库实例下的,在使用分区表时,

分区键的选择非常的关键,如果分区选择的不好,就会造成查询时呢,

就会造成查询时呢需要跨多个分区来进行查询,这样不仅不会提高数据库的查询性能,反而还会降低其性能,所以建议大家呢,在OLTP

环境中呢,这个分区表一定要注意,分区表最好还是在OLTP环境中呢,来进行使用,或对于一些日志类的表,存储中的使用还是比较

合适的,那么最后一个易犯的错误呢,外键的使用,大家都知道,Innodb存储引擎是事务的存储引擎,它是支持事务和外键的,

所以我见过很多开发人员,喜欢使用外键约束来保证数据的完整性,但是这样的效率是非常低的,因为在对外键进行数据修改时,

MYSQL都要对外键进行检查,这样就带来额外的这种锁的开销,降低数据库的修改的效率,另外使用外键来进行数据备份,恢复

或手动进行数据库归档,维护也会产生问题,比如我们不能使用truncate table这种语句呢,快速对于使用外键的表呢,进行清空操作,

只能使用delete来进行,这样在主从复制的情况下呢,对于一个大表的清理的复杂度呢,就会变得很高,所以强烈建议大家,不要使用

外键约束,但是建立相关的索引还是必须的

数据库设计对性能的影响_第1张图片

 

你可能感兴趣的:(数据库优化,Mysql)