MySQL中级优化教程(八)——MySQL配置优化

前言:

如果我们对MySQL的数据库表结构、使用的SQL语句都进行了优化,那么这就算结束了吗?一名有经验的程序员肯定会告诉我们,还有配置文件需要我们针对自己的数据库去进行差异性的优化。不同的项目规模、不同的业务逻辑,不同的系统硬件配置,都要求我们对自己的数据库做出不一样的配置。

 

首先,我们的mysql配置文件在哪呢?

MySQL可以通过启动时指定配置参数和使用配置文件两种方法来进行配置,对于Linux来说在大多数情况下配置文件位于/etc/my.cnf或是/etc/mysql/my.cnf,在windows系统配置可以是位于C:/windows/my.ini文件。

Linux系统中,MySQL查找配置文件的顺序可以通过以下方法获得:

$/usr/sbin/mysqld --verbose --help | grep -A 1 'Default options'

 

MySQL常用配置文件说明:

 

首先第一个参数是   innodb_buffer_pool_size

它是非常重要的一个参数,用于配置Innodb的缓冲池,如果数据库中只有Innodb表且该服务器只作为数据库服务器来用,则推荐配置为服务器总内存的75%。

我们可以通过下列语句来判断本机所有类型数据库总共需要的空间(数据库索引+数据总大小):

SELECT ENGINE,
ROUND(SUM(data_length + index_length) /1024/1024, 1) AS "Total MB"
FROM INFORMATION_SCHEMA.TABLES WHERE table_schema not in
('information_schema', 'performance_schema')
GROUP BY ENGINE;

我的执行结果如下:

+--------+----------+
| ENGINE | Total MB |
+--------+----------+
| InnoDB |     22.2 |
| CSV    |      0.0 |
| NULL   |      0.0 |
| MyISAM |      0.0 |
+--------+----------+

我们的要求是: Innodb_buffer_pool_size >= Total MB
如果我们数据库很大、数据也很多,导致TotalMB的值太大的话也没关系,让Innodb_buffer_pool_size的值尽可能大就好。

 

第二个参数 Innodb_buffer_pool_instances

这是MySQL5.5中开始添加的属性,可以控制缓冲池的个数,默认情况下只有一个缓冲池。
此属性和上一个属性innodb_buffer_pool_size有一定的关系,增加缓冲池的个数可以减少阻塞请求数量,增大数据库连接并发,一般我们将之设置为4或8,每一个缓冲池的大小是Innodb_buffer_pool_size 除以 Innodb_buffer_pool_instances。

 

第三个参数innodb_log_buffer_size

这个是数据库日志缓存的大小,出于性能考虑,数据库默认先将日志数据存入缓冲区,然后每隔一秒向磁盘中写入一次。所以它的值不必太大,能放得下一秒内数据库产生的日志就行。

 

第四个参数Innodb_flush_log_at_trx_commit
这也是一个极为重要的参数,它是控制MySQL磁盘写入策略的,即如何将数据库在缓存中的数据向磁盘中同步,我们有三个可选参数0、1、2,在解释这三个参数的不同机制之前,我们要先搞清楚对数据库的操作是如何同步到磁盘中的,过程如下:
对数据库进行插入了操作--》操作存入log_buffer--》log_buffer将数据同步到log file中--》log file将数据同步到物理磁盘中。

它的三个参数及机制如下:

0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘中去),该模式为系统默认。
2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘中去)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

如果我们对数据安全性要求比较高度,则使用默认值1。

 

第五个参数

其实是两个:Innodb_read_io_threads 和 Innodb_write_io_threads

以上两个参数决定了Innodb读写的IO进程数,默认为4,在MySQL5.5之后我们可以手动指定它的值,根据我们cpu的线程数、核数来调整该值,提高并发。

 

第六个参数Innodb_file_per_table

这也是一个关键参数,控制Innodb是否每一个表使用独立的表空间,MySQL5.6之前默认为OFF,也就是所有的表都会建立在共享表空间ibdata1中。MySQL5.6以后默认将其设置为ON,也就是每张表都有一个独立的表空间。二者各有利弊,总体而言,设置为ON,利大于弊。

感兴趣的童靴可以看一下笔者搜集的解释:
Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间。
共享表空间:  某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1  初始化为10M。
    
独立表空间:  每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
共享表空间的最大问题就是这个ibdata文件大小只增不减,有时会大到不可思议。如果使用单独的表空间,那么这个数据表被truncate或者drop时,此数据单独的表空间会被回收,节省内存。
更多关于二者详细解释可以参考本篇博文:https://blog.csdn.net/jesseyoung/article/details/42236615

另外,少部分使用MySQL5.6之前版本的童鞋还要注意一点,假如现在将其设置为ON的话,那么以前的表仍然还是放在共享空间内,新创建的表才会拥有单独的表空间。

 

第七个参数innodb_stats_on_metadata

它决定了MySQL在什么时候会刷新innodb表的统计信息,这个参数在MySQL5.6之后被从默认为on改为默认为off了,这个参数是干什么的呢?我们的数据库优化器,在分析到底使用哪个索引更好一点的时候,就会去分析参考我们的统计信息,如果我们将其设置为on的话,那么我们对该表执行结构查询语句的时候(show table status、show create table等),数据库引擎都会顺便把统计信息清理刷新一遍。

显而易见,我们的统计信息刷新频率过快的话,是不利于我们的查找操作的。所以最好让其保持off状态,即MySQL5.6之后的默认设置。

你可能感兴趣的:(Mysql,MySQL中级优化教程)