暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql参数优化

MySQLDBA运维零基础自学 2021-04-13
714

max_connections

    (1)简介
    Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,当然这是要建立在机器能够支撑的情况下,因为如果连接数越来越多,mysql会为每个连接提供缓冲区,就会开销的越多的内存,所以需要适当的调整该值,不能随便去提高设值。(2)判断依据
    show variables like 'max_connections';
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | max_connections | 151 |
    +-----------------+-------+
    show status like 'Max_used_connections';
    +----------------------+-------+
    | Variable_name | Value |
    +----------------------+-------+
    | Max_used_connections | 101 |
    +----------------------+-------+


    (3)修改方式举例
    vim etc/my.cnf
    Max_connections=1024


    补充:
    1.开启数据库时,我们可以临时设置一个比较大的测试值
    2.观察show status like 'Max_used_connections';变化
    3.如果max_used_connections跟max_connections相同,
    那么就是max_connections设置过低或者超过服务器的负载上限了,
    低于10%则设置过大.
    复制


    back_log

      (1)简介
      mysql能暂存的连接数量,当主要mysql线程在一个很短时间内得到非常多的连接请求时候它
      就会起作用,如果mysql的连接数据达到max_connections时候,新来的请求将会被存在堆栈中,
      等待某一连接释放资源,该推栈的数量就是back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
      back_log值指出在mysql暂时停止回答新请求之前的短时间内有多少个请求可以被存在推栈中,只有如果期望在一个短时间内有很多连接的时候需要增加它
      (2)判断依据
      show full processlist
      发现大量的待连接进程时,就需要加大back_log或者加大max_connections的值
      (3)修改方式举例
      vim /etc/my.cnf
      back_log=1024
      复制


      wait_timeout和interactive_timeout

        (1)简介
        wait_timeout:指的是mysql在关闭一个非交互的连接之前所要等待的秒数
        interactive_timeout:指的是mysql在关闭一个交互的连接之前所需要等待的秒数,比如我们在终端上进行mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时间就会自动的断开,默认的是28800,可调优为7200。wait_timeout:如果设置太小,那么连接关闭的就很快,从而使一些持久的连接不起作用
        (2)设置建议
        如果设置太大,容易造成连接打开时间过长,在show processlist时候,能看到很多的连接 ,一般希望wait_timeout尽可能低
        (3)修改方式举例
        wait_timeout=60
        interactive_timeout=1200
        长连接的应用,为了不去反复的回收和分配资源,降低额外的开销。一般我们会将wait_timeout设定比较小,interactive_timeout要和应用开发人员沟通长链接的应用是否很多。如果他需要长链接,那么这个值可以不需要调整。另外还可以使用类外的参数弥补。
        复制


        key_buffer_size

          1)简介
          key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度
          1》此参数与myisam表的索引有关
          2》临时表的创建有关(多表链接、子查询中、union)
          在有以上查询语句出现的时候,需要创建临时表,用完之后会被丢弃
          临时表有两种创建方式: 内存中------->key_buffer_size
          磁盘上------->ibdata1(5.6)
          ibtmp1 (5.7
          2)设置依据
          通过key_read_requests和key_reads可以直到key_buffer_size设置是否合理。
          mysql> show variables like "key_buffer_size%";
          +-----------------+---------+
          | Variable_name | Value |
          +-----------------+---------+
          | key_buffer_size | 8388608 |
          +-----------------+---------+
          1 row in set (0.00 sec)


          mysql>
          mysql> show status like "key_read%";
          +-------------------+-------+
          | Variable_name | Value |
          +-------------------+-------+
          | Key_read_requests | 10 |
          | Key_reads | 2 |
          +-------------------+-------+
          2 rows in set (0.00 sec)


          mysql>
          一共有10个索引读取请求,有2个请求在内存中没有找到直接从硬盘中读取索引
          控制在 5%以内 。注:key_buffer_size只对myisam表起作用,即使不使用myisam表,但是内部的临时磁盘表是myisam表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知:mysql> show status like "created_tmp%";
          +-------------------------+-------+
          | Variable_name | Value |
          +-------------------------+-------+
          | Created_tmp_disk_tables | 0 |
          | Created_tmp_files | 6 |
          | Created_tmp_tables | 1 |
          +-------------------------+-------+
          3 rows in set (0.00 sec)
          mysql>
          通常地,我们习惯以 Created_tmp_tables/(Created_tmp_disk_tables + Created_tmp_tables)
          Created_tmp_disk_tables/(Created_tmp_disk_tables + Created_tmp_tables)


          或者已各自的一个时段内的差额计算,来判断基于内存的临时表利用率。所以,我们会比较关注 Created_tmp_disk_tables 是否过多,从而认定当前服务器运行状况的优劣。Created_tmp_disk_tables/(Created_tmp_disk_tables + Created_tmp_tables)
          控制在5%-10%以内
          看以下例子:在调用mysqldump备份数据时,大概执行步骤如下:180322 17:39:33 7 Connect root@localhost on
          7 Query /*!40100 SET @@SQL_MODE='' */
          7 Init DB guo
          7 Query SHOW TABLES LIKE 'guo'
          7 Query LOCK TABLES `guo` READ /*!32311 LOCAL */
          7 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
          7 Query show create table `guo`
          7 Query show fields from `guo`
          7 Query show table status like 'guo'
          7 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `guo`
          7 Query UNLOCK TABLES
          7 Quit


          其中,有一步是:show fields from `guo`。从slow query记录的执行计划中,可以知道它也产生了 Tmp_table_on_disk。所以说,以上公式并不能真正反映到mysql里临时表的利用率,有些情况下产生的 Tmp_table_on_disk 我们完全不用担心,因此没必要过分关注 Created_tmp_disk_tables,但如果它的值大的离谱的话,那就好好查一下,你的服务器到底都在执行什么查询了。
          3)配置方法
          key_buffer_size=64M
          复制


          max_connect_errors

            max_connect_errors是一个mysql中与安全有关的计数器值,
            它负责阻止过多尝试失败的客户端以防止暴力破解密码等情况,当超过指定次数,
            mysql服务器将禁止host的连接请求,直到mysql服务器重启或通过flush hosts命令
            清空此host的相关信息 max_connect_errors的值与性能并无太大关系。修改/etc/my.cnf文件,在[mysqld]下面添加如下内容
            max_connect_errors=2000
            复制


            sort_buffer_size

              (1)简介:每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速
              ORDER BY
              GROUP BY
              distinct
              union


              (2)配置依据
              Sort_Buffer_Size并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。列如:500个连接将会消耗500*sort_buffer_size(2M)=1G内存
              (3)配置方法
              修改/etc/my.cnf文件,在[mysqld]下面添加如下:sort_buffer_size=1M
              复制


              max_allowed_packet

                (1)简介:mysql根据配置文件会限制,server接受的数据包大小。(2)配置依据:有时候大的插入和更新会受max_allowed_packet参数限制,导致写入或者更新失败,
                更大值是1GB,必须设置1024的倍数
                (3)配置方法:max_allowed_packet=32M
                复制


                join_buffer_size

                  select a.name,b.name from a join b on a.id=b.id where xxxx
                  用于表间关联缓存的大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接
                  独享。尽量在SQL与方面进行优化,效果较为明显。优化的方法:在on条件列加索引,至少应当是有MUL索引
                  复制


                  thread_cache_size

                    (1)简介
                    服务器线程缓存,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时,
                    那么客户端的线程将被放到缓存中以响应下一个客户而不是销毁
                    (前提是缓存数未达上限),如果线程重新被请求,那么请求将从缓存中读取,如果缓存
                    中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加
                    这个值可以改善系统性能.
                    2)配置依据
                    通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。设置规则如下:1GB 内存配置为82GB配置为163GB配置为324GB或更高内存,可配置更大。服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)


                    试图连接到MySQL(不管是否连接成功)的连接数
                    mysql> show status like 'threads_%';
                    +-------------------+-------+
                    | Variable_name | Value |
                    +-------------------+-------+
                    | Threads_cached | 8 |
                    | Threads_connected | 2 |
                    | Threads_created | 4783 |
                    | Threads_running | 1 |
                    +-------------------+-------+
                    4 rows in set (0.00 sec)


                    Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。Threads_connected:代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。Threads_created:代表从最近一次服务启动,已创建线程的数量,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗cpu SYS资源,可以适当增加配置文件中thread_cache_size值。Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态。(3)配置方法:thread_cache_size=32


                    整理:Threads_created :一般在架构设计阶段,会设置一个测试值,做压力测试。结合zabbix监控,看一段时间内此状态的变化。如果在一段时间内,Threads_created趋于平稳,说明对应参数设定是OK。如果一直陡峭的增长,或者出现大量峰值,那么继续增加此值的大小,在系统资源够用的情况下(内存)
                    复制


                    innodb_buffer_pool_size

                      (1)简介
                      对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。(2)配置依据:InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%,一般我们建议不要超过物理内存的70%。(3)配置方法
                      innodb_buffer_pool_size=2048M
                      复制


                      innodb_flush_log_at_trx_commit

                        (1)简介
                        主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为012三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,每次事务的提交都会引起redo日志文件写入、flush磁盘的操作,确保了事务的ACID;2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。(2)配置依据
                        实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。根据MySQL官方文档,在允许丢失最近部分事务的危险的前提下,可以把该值设为02。(3)配置方法
                        innodb_flush_log_at_trx_commit=1
                        1标准中的一个1
                        复制


                        innodb_thread_concurrency

                          (1)简介
                          此参数用来设置innodb线程的并发数量,默认值为0表示不限制。(2)配置依据
                          如果一个工作负载中,并发用户线程的数量小于64,建议设置innodb_thread_concurrency=0;如果工作负载一直较为严重甚至偶尔达到顶峰,建议先设置innodb_thread_concurrency=128,
                          并通过不断的降低这个参数,96, 80, 64等等,直到发现能够提供最佳性能的线程数。
                          复制


                          innodb_log_buffer_size

                            此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,对于较大的事务,可以增大缓存大小。innodb_log_buffer_size=128M


                            设定依据:
                            1、大事务: 存储过程调用 CALL
                            2、多事务
                            复制


                            innodb_log_file_size = 100M

                              设置 ib_logfile0  ib_logfile1 
                              此参数确定数据日志文件的大小,以M为单位,更大的设置可以提高性能.
                              innodb_log_file_size = 100M
                              复制

                              innodb_log_files_in_group = 3

                                为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3
                                复制


                                read_buffer_size = 1M

                                  MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为
                                  它分配一段内存缓冲区。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描
                                  进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。和 sort_buffer_size一样,该参数对应的分配内存也是每个连接独享
                                  复制


                                  read_rnd_buffer_size = 1M

                                    MySql的随机读(查询操作)缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序
                                    ),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免
                                    磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个
                                    客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。注:顺序读是指根据索引的叶节点数据就能顺序地读取所需要的行数据。随机读是指一般需要根据辅助索引叶节点中的主键寻找实际行数据,而辅助索引和主键所在的数据段不同,因此访问方式是随机的。
                                    复制


                                    bulk_insert_buffer_size = 8M

                                      批量插入数据缓存大小,可以有效提高插入效率,默认为8M
                                      复制


                                      binary log

                                        log-bin=/data/mysql-bin
                                        binlog_cache_size = 2M 为每个session 分配的内存,在事务过程中
                                        用来存储二进制日志的缓存, 提高记录bin-log的效率。没有什么大事务,dml也不是很频繁
                                        的情况下可以设置小一点,如果事务大而且多,dml操作也频繁,则可以适当的调大一点。前者建议是--1M,后者建议是:即 2--4M


                                        max_binlog_cache_size = 8M /表示的是binlog 能够使用的最大cache 内存大小
                                        max_binlog_size= 512M //指定binlog日志文件的大小,如果当前的日志大小达到max_binlog_size,
                                        还会自动创建新的二进制日志。你不能将该变量设置为大于1GB或小于4096字节。默认值是1GB。在导入大容量的sql文件时,建议关闭sql_log_bin,否则硬盘扛不住,
                                        而且建议定期做删除。expire_logs_days = 7 //定义了mysql清除过期日志的时间。二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。log-bin=/data/mysql-bin
                                        binlog_format=row
                                        sync_binlog=1
                                        1标准(基于安全的控制):sync_binlog=1 什么时候刷新binlog到磁盘,每次事务commit
                                        innodb_flush_log_at_trx_commit=1
                                        set sql_log_bin=0;
                                        show status like 'com_%';
                                        复制


                                        安全参数

                                          Innodb_flush_method=(O_DIRECT, fsync) 
                                          1、fsync :(1)在数据页需要持久化时,首先将数据写入OS buffer中,然后由os决定什么时候写入磁盘
                                          (2)在redo buffuer需要持久化时,首先将数据写入OS buffer中,然后由os决定什么时候写入磁盘
                                          但,如果innodb_flush_log_at_trx_commit=1的话,日志还是直接每次commit直接写入磁盘
                                          2、 Innodb_flush_method=O_DIRECT
                                          (1)在数据页需要持久化时,直接写入磁盘
                                          (2)在redo buffuer需要持久化时,首先将数据写入OS buffer中,然后由os决定什么时候写入磁盘
                                          但,如果innodb_flush_log_at_trx_commit=1的话,日志还是直接每次commit直接写入磁盘


                                          最安全模式:
                                          innodb_flush_log_at_trx_commit=1
                                          innodb_flush_method=O_DIRECT


                                          最高性能模式:innodb_flush_log_at_trx_commit=0
                                          innodb_flush_method=fsync
                                          复制


                                          文章转载自MySQLDBA运维零基础自学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                          评论