sync_binlog:这个参数控制mysql怎么刷新二进制日志,从操作系统cache到磁盘上的这种行为。
问:默认值为0的意思是什么?
答:表示mysql并不会主动去刷新,而是由操作系统自己来决定什么时候刷新cache到磁盘。
问:如果上述参数的值大于零则表示什么?
答:两次刷新到磁盘的操作之间,间隔的多少次二进制日志的写操作,通常情况下的一次事务,就会有一次写操作;
由此可见如果把这个值设置为1,那么每次事务完成之后,都会有一次binlog写日志这样的操作,这样做是最安全的情况。同时每次都要进行磁盘的写操作,成本也是最高的,但是对于主从复制中的主DB来说,还是建议大家把这个参数的值设置为1,这样可以避免,由于主DB崩溃而造成在cache中的日志,没有同步到二进制日志的那种情况发生;
如果这种情况发生了,主从服务器的数据就会出现不同步,也很难的进行恢复。
tmp_table_size和max_heap_table_size:是一起使用的,这两个参数的可以控制使用Memery存储引擎的内存临时表,能够使用多大内存,如果是隐式内存的临时表,超过了这两个参数的配置的值时,将会被转换为磁盘临时表,这两个值得设置应该保持一致,并且不要太大,以防造成内存的溢出。
max_connection:Mysql的一些内存分配是以连接为单位的,如果到Mysql服务器的连接不断增长,很容易就会把服务器内存耗光,而这个参数作用的就是控制最多可以有多少个连接进入到Mysql服务器;
问:这个参数的默认值的只有100,而对于大多数情况来说,这都太小了,通常情况下我们会把这个值设置为2000或者是更加大一些,不过具体说成多少呢?
答:还要根据我们的应用环境来定
以上就是所有Mysql配置中,对数据库性能影响比较大的一些参数,对于开发人员来说,只要了解它们的用处就可以了,因为这些配置可以在session级进行配置,所以在程序开发的时候,如果需要我们可以在session级对其中一些参数来进行配置,以达到我们想要的那个效果。
对性能影响最大的还是数据库的结构设计、SQL语句的优化,只有对数据库的结构和SQL已经无法优化的情况下,我们才应该考虑对服务器的硬件、操作系统与数据库的配置进行优化。
问:过分的反范式化的设计会造成什么影响?
答:我们在设计数据库的结构时,比较容易犯的一个错误,就是对表进行了过分的反范式化的设计,就会造成一个表中的列过多,虽然说Mysql允许为一个表建立了很多的列,这是由于Mysql的插件式架构的原因,Mysql服务器层和存储引擎层是分离的,Mysql存储引擎API,工作时需要把在服务器层和存储引擎层之间,通过缓冲格式来拷贝数据,然后在服务器层将缓冲中的内容解析成个列,操作过程的成本是非常高的,特别是对于MyISAM这种变长结构和InnoDB这种行结构,在进行解析时还必须进行转换。
这个转换的成本就依赖于列的数量,所以如果一个表的列太多,在使用这个表示就会带来额外的CPU的消耗,所以大家在进行表设计的时候一定要注意,不要把所有的相关的列全放到一个表中,而是要按照范式化适当的对表进行拆分。
即如果一个表有太多的列,会对性能产生很不好的影响。
问:过分的使用了范式化的设计思路,对于任何查询都要关联很多的表才能完成会造成什么影响?
答:上述原理可知,在Mysql中进行表关联的成本是很高的,性能也会随着关联表的增加下降,所以Mysql对于可关联的表的数量进行了一个限制,最多只能关联61个表,这个限制虽然对于大多数应用来说已经足够了,但是我们为了Mysql性能,还是要尽量的减少关联的表,对于关联表最好控制在10个以内。
这就要求我们,在进行数据库设计时应当适当进行了反范式化的设计,把经常一起使用的两个小表和一个大表,这样做对提升数据库性能和机构查询的性能都是很有帮助的。
分区表是个好东西,可以帮助我们把一个大表从物理存储上,按照分区成多个小表。
问:分区表和分库、分表有什么差别?
答:分区表是在同一个数据库实例上所进行的,而在物理存储将它分成了多个小表,但是在使用时的逻辑上的还是一个表;而分库、分表中所要做的操作,不只是在物理上对表产进行拆分,在逻辑上也会拆分多个表,而且分库、分表后多个表不在同一数据库实例上。
使用分区表,分区键的选择非常关键,如果选择的不好,就会造成查询时的需要,划多个分区来进行查询,这样不仅不会提高数据库的查询性能,反而还会降低其性能,所以建议大家在OLTP环境中使用分区表一定要注意,分区表最好还是在OLAP环境中来进行使用,或对于一些日志类的表,存储中的使用还是比较合适。
InnoDB是事务型存储引擎是支持事务和外键。
问:很多开发人员喜欢使用外键约束,来保证数据的完整性有什么影响?
答:但是这样的效率非常低,因为在对使用外键的表进行数据i需该时,Mysql要对外界约束进行检查,这样就带来了额外的锁的开销,降低计算机数据库修改的效率;
使用外键在进行数据备份、恢复或者是手动数据库归档也会产生问题,比如:我们不能使用truncate table这种语句快速的对使用外键的表进行清空操作,只能用delete来进行,这样在主从复制环境下,能对于一个大表的数据清理的复杂度就会变得很高,强烈建议大家不要使用外键约束,但是呢在关联键上建立相关的索引还是必须的。