zoukankan      html  css  js  c++  java
  • MySQL高负载优化

    MySQL配置文件优化

    [client]
    
    port   = 3306#客户端端口号为3306
    
    socket  = /data/3306/mysql.sock #
    
    default-character-set = utf8  #客户端字符集,(控制character_set_client、character_set_connection、character_set_results)
    
     
    
    [mysql]
    
    no-auto-rehash  #仅仅允许使用键值的updates和deletes
    
     
    
    [mysqld]  #组包括了mysqld服务启动的参数,它涉及的方面很多,其中有MySQL的目录和文件,通信、网络、信息安全,内存管理、优化、查询缓存区,还有MySQL日志设置等。
    
    user    = mysql#mysql_safe脚本使用MySQL运行用户(编译时--user=mysql指定),推荐使用mysql用户。
    
    port    = 3306#MySQL服务运行时的端口号。建议更改默认端口,默认容易遭受攻击。
    
    socket  = /data/3306/mysql.sock  #socket文件是在Linux/Unix环境下特有的,用户在Linux/Unix环境下客户端连接可以不通过TCP/IP网络而直接使用unix
    socket连接MySQL。
    
    basedir = /application/mysql  #mysql程序所存放路径,常用于存放mysql启动、配置文件、日志等
    
    datadir = /data/3306/data  #MySQL数据存放文件(极其重要)
    
    character-set-server = utf8  #数据库和数据库表的默认字符集。(推荐utf8,以免导致乱码)
    
    log-error=/data/3306/mysql_xuliangwei.err
     #mysql错误日志存放路径及名称(启动出现错误一定要看错误日志,百分之百都能通过错误日志排插解决。)
    
    pid-file=/data/3306/mysql_xuliangwei.pid  #MySQL_pid文件记录的是当前mysqld进程的pid,pid亦即
    ProcessID。
    
    skip-locking
     #避免MySQL的外部锁定,减少出错几率,增强稳定性。
    
    skip-name-resolv
     #禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时候。但是需要注意的是,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式了,否则MySQL将无法正常处理连接请求!
    
    skip-networking  #开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果Web服务器是以远程连接的方式访问MySQL数据库服务器的,则不要开启该选项,否则无法正常连接!
    
    open_files_limit    = 1024#MySQLd能打开文件的最大个数,如果出现too mant
    open files之类的就需要调整该值了。
    
    back_log = 384  #back_log参数是值指出在MySQL暂时停止响应新请求之前,短时间内的多少个请求可以被存在堆栈中。如果系统在短时间内有很多连接,则需要增加该参数的值,该参数值指定到来的TCP/IP连接的监听队列的大小。不同的操作系统在这个队列的大小上有自己的限制。如果试图将back_log设置得高于操作系统的限制将是无效的,其默认值为50.对于Linux系统而言,推荐设置为小于512的整数。
    
    max_connections = 800 #指定MySQL允许的最大连接进程数。如果在访问博客时经常出现 Too Many Connections的错误提示,则需要增大该参数值。
    
    max_connect_errors = 6000  #设置每个主机的连接请求异常中断的最大次数,当超过该次数,MySQL服务器将禁止host的连接请求,直到MySQL服务器重启或通过flush hosts命令清空此host的相关信息。
    
    wait_timeout = 120  #指定一个请求的最大连接时间,对于4GB左右内存的服务器来说,可以将其设置为5~10。
    
    table_cache = 614K  #table_cache指示表高速缓冲区的大小。当MySQL访问一个表时,如果在MySQL缓冲区还有空间,那么这个表就被打开并放入表缓冲区,这样做的好处是可以更快速地访问表中的内容。一般来说,可以查看数据库运行峰值时间的状态值Open_tables和Open_tables,用以判断是否需要增加table_cache的值,即如果Open_tables接近table_cache的时候,并且Opened_tables这个值在逐步增加,那就要考虑增加这个值的大小了。
    
    external-locking = FALSE  #MySQL选项可以避免外部锁定。True为开启。
    
    max_allowed_packet =16M  #服务器一次能处理最大的查询包的值,也是服务器程序能够处理的最大查询
    
    sort_buffer_size = 1M  #设置查询排序时所能使用的缓冲区大小,系统默认大小为2MB。
    
    注意:该参数对应的分配内存是每个连接独占的,如果有100个连接,那么实际分配的总排序缓冲区大小为100 x6=600MB。所以,对于内存在4GB左右的服务器来说,推荐将其设置为6MB~8MB
    
    join_buffer_size = 8M #联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。
    
    thread_cache_size = 64 #设置Thread Cache池中可以缓存的连接线程最大数量,可设置为0~16384,默认为0.这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中;如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多线程,增加这个值可以改善系统性能。通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。我们可以根据物理内存设置规则如下:1GB内存我们配置为8,2GB内存我们配置为16,3GB我们配置为32,4GB或4GB以上我们给此值为64或更大的值。
    
    thread_concurrency = 8  #该参数取值为服务器逻辑CPU数量x 2,在本例中,服务器有两个物理CPU,而每个物理CPU又支持H.T超线程,所以实际取值为4 x 2 = 8。这也是双四核主流服务器的配置。
    
    query_cache_size = 64M #指定MySQL查询缓冲区的大小。可以通过在MySQL控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用得非常频繁。另外如果改值较小反而会影响效率,那么可以考虑不用查询缓冲。对于Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。
    
    query_cache_limit = 2M  #只有小于此设置值的结果才会被缓存
    
    query_cache_min_res_unit = 2k  #设置查询缓存分配内存的最小单位,要适当第设置此参数,可以做到为减少内存快的申请和分配次数,但是设置过大可能导致内存碎片数值上升。默认值为4K,建议设置为1K~16K。
    
    default_table_type = InnoDB  #默认表的类型为InnoDB
    
    thread_stack = 256K  #设置MySQL每个线程的堆栈大小,默认值足够大,可满足普通操作。可设置范围为128KB至4GB,默认为192KB
    
    #transaction_isolation = Level #数据库隔离级别 (READ UNCOMMITTED(读取未提交内容) READ COMMITTED(读取提交内容) REPEATABLE
    READ(可重读) SERIALIZABLE(可串行化))
    
    tmp_table_size = 64M  #设置内存临时表最大值。如果超过该值,则会将临时表写入磁盘,其范围1KB到4GB。
    
    max_heap_table_size = 64M  #独立的内存表所允许的最大容量。
    
    table_cache = 614 #给经常访问的表分配的内存,物理内存越大,设置就越大。调大这个值,一般情况下可以降低磁盘IO,但相应的会占用更多的内存,这里设置为614。
    
    table_open_cache = 512  #设置表高速缓存的数目。每个连接进来,都会至少打开一个表缓存。因此, table_cache 的大小应与 max_connections 的设置有关。例如,对于 200 个并行运行的连接,应该让表的缓存至少有 200 × N ,这里 N 是应用可以执行的查询的一个联接中表的最大数量。此外,还需要为临时表和文件保留一些额外的文件描述符。
    
    long_query_time = 1  #慢查询的执行用时上限,默认设置是10s,推荐(1s~2s)
    
    log_long_format  #没有使用索引的查询也会被记录。(推荐,根据业务来调整)
    
    log-slow-queries = /data/3306/slow.log  #慢查询日志文件路径(如果开启慢查询,建议打开此日志)
    
    log-bin = /data/3306/mysql-bin  #logbin数据库的操作日志,例如update、delete、create等都会存储到binlog日志,通过logbin可以实现增量恢复
    
    relay-log = /data/3306/relay-bin  #relay-log日志记录的是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器
    
    relay-log-info-file = /data/3306/relay-log.info  #从服务器用于记录中继日志相关信息的文件,默认名为数据目录中的relay-log.info。
    
    binlog_cache_size = 4M  #在一个事务中binlog为了记录sql状态所持有的cache大小,如果你经常使用大的,多声明的事务,可以增加此值来获取更大的性能,所有从事务来的状态都被缓冲在binlog缓冲中,然后再提交后一次性写入到binlog中,如果事务比此值大,会使用磁盘上的临时文件来替代,此缓冲在每个链接的事务第一次更新状态时被创建。
    
    max_binlog_cache_size = 8M  #最大的二进制Cache日志缓冲尺寸。
    
    max_binlog_size = 1G  #二进制日志文件的最大长度(默认设置1GB)一个二进制文件信息超过了这个最大长度之前,MySQL服务器会自动提供一个新的二进制日志文件接续上。
    
    expire_logs_days = 7  #超过7天的binlog,mysql程序自动删除(如果数据重要,建议不要开启该选项)
    
    key_buffer_size = 256M  #指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器来说,该参数可设置为256MB或384MB。
    
    注意:如果该参数值设置得过大反而会使服务器的整体效率降低!
    
    read_buffer_size = 4M  #读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。
    
    read_rnd_buffer_size = 16M #设置进行随机读的时候所使用的缓冲区。此参数和read_buffer_size所设置的Buffer相反,一个是顺序读的时候使用,一个是随机读的时候使用。但是两者都是针对与线程的设置,每个线程都可以产生两种Buffer中的任何一个。默认值256KB,最大值4GB。
    
    bulk_insert_buffer_size = 8M  #如果经常性的需要使用批量插入的特殊语句来插入数据,可以适当调整参数至16MB~32MB,建议8MB。
    
    #myisam_sort_buffer_size = 8M #设置在REPAIR Table或用Create
    index创建索引或 Alter table的过程中排序索引所分配的缓冲区大小,可设置范围4Bytes至4GB,默认为8MB
    
    lower_case_table_names = 1  #实现MySQL不区分大小。(发开需求-建议开启)
    
    slave-skip-errors = 1032,1062  #从库可以跳过的错误数字值(mysql错误以数字代码反馈,全的mysql错误代码大全,以后会发布至博客)。
    
    replicate-ignore-db=mysql  #在做主从的情况下,设置不需要同步的库。
    
    server-id = 1  #表示本机的序列号为1,如果做主从,或者多实例,serverid一定不能相同。
    
    myisam_sort_buffer_size = 128M
    #当需要对于执行REPAIR, OPTIMIZE, ALTER 语句重建索引时,MySQL会分配这个缓存,以及LOAD DATA INFILE会加载到一个新表,它会根据最大的配置认真的分配的每个线程。 
    
    myisam_max_sort_file_size = 10G #当重新建索引(REPAIR,ALTER,TABLE,或者LOAD,DATA,TNFILE)时,MySQL被允许使用临时文件的最大值。
    
    myisam_repair_threads = 1 #如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
    
    myisam_recover #自动检查和修复没有适当关闭的 MyISAM 表.
    
    innodb_additional_mem_pool_size = 4M  #用来设置InnoDB存储的数据目录信息和其他内部数据结构的内存池大小。应用程序里的表越多,你需要在这里面分配越多的内存。对于一个相对稳定的应用,这个参数的大小也是相对稳定的,也没有必要预留非常大的值。如果InnoDB用广了这个池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息。默认为1MB,当发现错误日志中已经有相关的警告信息时,就应该适当的增加该参数的大小。
    
    innodb_buffer_pool_size = 64M  #InnoDB使用一个缓冲池来保存索引和原始数据,设置越大,在存取表里面数据时所需要的磁盘I/O越少。强烈建议不要武断地将InnoDB的Buffer Pool值配置为物理内存的50%~80%,应根据具体环境而定。
    
    innodb_data_file_path = ibdata1:128M:autoextend  #设置配置一个可扩展大小的尺寸为128MB的单独文件,名为ibdata1.没有给出文件的位置,所以默认的是在MySQL的数据目录内。
    
    innodb_file_io_threads = 4  #InnoDB中的文件I/O线程。通常设置为4,如果是windows可以设置更大的值以提高磁盘I/O
    
    innodb_thread_concurrency = 8  #你的服务器有几个CPU就设置为几,建议用默认设置,一般设为8。
    
    innodb_flush_log_at_trx_commit = 1  #设置为0就等于innodb_log_buffer_size队列满后在统一存储,默认为1,也是最安全的设置。
    
    innodb_log_buffer_size = 2M  #默认为1MB,通常设置为8~16MB就足够了。
    
    innodb_log_file_size = 32M  #确定日志文件的大小,更大的设置可以提高性能,但也会增加恢复数据库的时间。
    
    innodb_log_files_in_group = 3  #为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3。
    
    innodb_max_dirty_pages_pct = 90  #InnoDB主线程刷新缓存池中的数据。
    
    innodb_lock_wait_timeout = 120  #InnoDB事务被回滚之前可以等待一个锁定的超时秒数。InnoDB在它自己的锁定表中自动检测事务死锁并且回滚事务。InnoDB用locak tables 语句注意到锁定设置。默认值是50秒。
    
    innodb_file_per_table = 0  #InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。0关闭,1开启。
    
    独立表空间优点:
    
    1、每个表都有自己独立的表空间。
    
    2、每个表的数据和索引都会存在自己的表空间中。
    
    3、可以实现单表在不同的数据库中移动。
    
    4、空间可以回收(除drop table操作处,表空不能自己回收。)
    
    [mysqldump]
    
    quick
    
    max_allowed_packet = 2M  #设定在网络传输中一次消息传输量的最大值。系统默认值为1MB,最大值是1GB,必须设置为1024的倍数。单位为字节。
    
     
    
    值得注意:
    
      强烈建议不要将InnoDB的Buffer Pool值配置为物理内存的50%~80%,应根据具体环境而定。
    
      如果key_reads太大,则应该把my.cnf中的key_buffer_size变大,保持key_reads/key_read_re-quests至少在1/100以上,越小越好。
    
      如果qcache_lowmem_prunes很大,就要增加query_cache_size的值。
    
    其他参数的变更可以等MySQL上线稳定一段时间后根据status值进行调整。

    占用CPU过高,可以做如下考虑:

    1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processlist语句,查找负荷最重的SQL语句,优化该SQL,比如适当建立某字段的索引;

    2)打开慢查询日志,将那些执行时间过长且占用资源过多的SQL拿来进行explain分析,导致CPU过高,多数是GroupBy、OrderBy排序问题所导致,然后慢慢进行优化改进。比如优化insert语句、优化group by语句、优化order by语句、优化join语句等等;

    3)考虑定时优化文件及索引;

    4)定期分析表,使用optimize table;

    5)优化数据库对象;

    6)考虑是否是锁问题;

    7)调整一些MySQL Server参数,比如key_buffer_size、table_cache、innodb_buffer_pool_size、innodb_log_file_size等等;

    8)如果数据量过大,可以考虑使用MySQL集群或者搭建高可用环境。

    9)可能由于内存latch(泄露)导致数据库CPU高

    10)在多用户高并发的情况下,任何系统都会hold不住的,所以,使用缓存是必须的,使用memcached或者redis缓存都可以;

    11)看看tmp_table_size大小是否偏小,如果允许,适当的增大一点;

    12)如果max_heap_table_size配置的过小,增大一点;

    13)mysql的sql语句睡眠连接超时时间设置问题(wait_timeout)

    14)使用show processlist查看mysql连接数,看看是否超过了mysql设置的连接数

    配置优化

    1使用 InnoDB 存储引擎

    如果你还在使用 MyISAM 存储引擎,那么是时候转换到 InnoDB 了。有很多的理由都表明 InnoDB 比 MyISAM 更有优势,如果你关注性能,那么,我们来看一下它们是如何利用物理内存的:

    MyISAM:仅在内存中保存索引。
    
    InnoDB:在内存中保存索引和数据。

    结论:保存在内存的内容访问速度要比磁盘上的更快。

    下面是如何在你的表上去转换存储引擎的命令:

    ALTER TABLE table_name ENGINE=InnoDB;

    注意:你已经创建了所有合适的索引,为了更好的性能,创建索引永远是第一优先考虑的事情。

    2 InnoDB 使用所有的内存

    你可以在 my.cnf 文件中编辑你的 MySQL 配置。使用 innodb_buffer_pool_size 参数去配置在你的服务器上允许 InnoDB 使用物理内存数量。

    对此(假设你的服务器仅仅运行 MySQL),公认的“经验法则”是设置为你的服务器物理内存的 80%。在保证操作系统不使用交换分区而正常运行所需要的足够内存之后 ,尽可能多地为 MySQL 分配物理内存。

    因此,如果你的服务器物理内存是 32 GB,可以将那个参数设置为多达 25 GB。

    innodb_buffer_pool_size = 25600M

    *注意:

    (1)如果你的服务器内存较小并且小于 1 GB。为了适用本文的方法,你应该去升级你的服务器。

    (2) 如果你的服务器内存特别大,比如,它有 200 GB,那么,根据一般常识,你也没有必要为操作系统保留多达 40 GB 的内存。 

    3 InnoDB 多任务运行

    如果服务器上的参数 innodb_buffer_pool_size 的配置是大于 1 GB,将根据参数 innodb_buffer_pool_instances 的设置, 将 InnoDB 的缓冲池划分为多个。

    拥有多于一个的缓冲池的好处有:

    在多线程同时访问缓冲池时可能会遇到瓶颈。你可以通过启用多缓冲池来最小化这种争用情况:

    对于缓冲池数量的官方建议是:

    为了实现最佳的效果,要综合考虑 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的设置,以确保每个实例至少有不小于 1 GB 的缓冲池。

    因此,在我们的示例中,将参数 innodb_buffer_pool_size 设置为 25 GB 的拥有 32 GB 物理内存的服务器上。一个合适的设置为 25600M / 24 = 1.06 GB

    innodb_buffer_pool_instances = 24

    连接超时

    mysql> show variables like 'wait_timeout'; 睡眠连接超时秒数
    
    +---------------+-------+
    
    | Variable_name | Value |
    
    +---------------+-------+
    
    | wait_timeout  | 120   |
    
    +---------------+-------+
    
    1 row in set (0.23 sec)

    连接数

    mysql> show variables like '%max_connections%'; mysql的最大连接数
    
    +-----------------+-------+
    
    | Variable_name   | Value |
    
    +-----------------+-------+
    
    | max_connections | 6000  |
    
    +-----------------+-------+
    
    1 row in set (0.25 sec)
    
    mysql> show global status like 'Max_used_connections'; 服务器响应的最大连接数3
    
    +----------------------+-------+
    
    | Variable_name        | Value |
    
    +----------------------+-------+
    
    | Max_used_connections | 45    |
    
    +----------------------+-------+
    
    1 row in set (0.24 sec)

    mysql服务器最大连接数值的设置范围比较理想的是:服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上,如果在10%以下,说明mysql服务器最大连接上限值设置过高.

    Max_used_connections / max_connections * 100% = 45/6000 *100% =0.0075

    增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等

    临时表

    mysql>  show global status like 'created_tmp%';
    
    +-------------------------+-------+
    
    | Variable_name           | Value |
    
    +-------------------------+-------+
    
    | Created_tmp_disk_tables | 21755 |
    
    | Created_tmp_files       | 94    |
    
    | Created_tmp_tables      | 56250 |
    
    +-------------------------+-------+
    
    3 rows in set (0.09 sec)

    每次创建临时表时,Created_tmp_table都会增加,如果磁盘上创建临时表,Created_tmp_disk_tables也会增加。Created_tmp_files表示MySQL服务创建的临时文件数,比较理想的配置是:

    Created_tmp_disk_tables / Created_tmp_files *100% <= 25%
    
    服务器
    
    Created_tmp_disk_tables / Created_tmp_files *100% =23%

    我们在看一下MySQL服务器对临时表的配置:

    mysql> show variables where Variable_name in ('tmp_table_size','max_heap_table_size');
    +---------------------+------------+
    | Variable_name       | Value      |
    +---------------------+------------+
    | max_heap_table_size | 1073741824 |
    | tmp_table_size      | 1073741824 |
    +---------------------+------------+
    2 rows in set

    打开表的情况

    Open_tables表示打开表的数量,Opened_tables表示打开过的表数量,我们可以用如下命令查看其具体情况:

    mysql> show global status like 'open%tables%';
    
    +---------------+-------+
    
    | Variable_name | Value |
    
    +---------------+-------+
    
    | Open_tables   | 1994  |
    
    | Opened_tables | 5132  |
    
    +---------------+-------+
    
    2 rows in set (0.23 sec)

    如果Opened_tables数量过大,说明配置中table_open_cache的值可能太小

    mysql> show variables like 'table_open_cache';
    
    +------------------+-------+
    
    | Variable_name    | Value |
    
    +------------------+-------+
    
    | table_open_cache | 2000  |
    
    +------------------+-------+
    
    1 row in set (0.12 sec)

    比较合适的值为:

    open_tables / opened_tables* 100% > = 85%
    
    1994 / 5132 *100% =38%
    
    open_tables / table_open_cache* 100% < = 95%
    
    1994 / 2000 *100% =99.7%

    进程使用情况

    MySQL服务器的配置文件中设置了thread_cache_size,当客户端断开时,服务器处理此客户请求的线程将会缓存起来以响应一下客户而不是销毁(前提是缓存数未达上线)Thread_created表示创建过的线程数,我们可以用如下命令查看:

    mysql>  show global status like 'thread%';
    
    +-------------------+-------+
    
    | Variable_name     | Value |
    
    +-------------------+-------+
    
    | Threads_cached    | 28    |
    
    | Threads_connected | 17    |
    
    | Threads_created   | 45    |
    
    | Threads_running   | 3     |
    
    +-------------------+-------+
    
    4 rows in set (0.28 sec)

    Threads_created的值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗费资源的,可以适当增大配置文件中thread_cache_size的值。查询服务器thread_cache_size配置如下:

    mysql> show variables like 'thread_cache_size';
    
    +-------------------+-------+
    
    | Variable_name     | Value |
    
    +-------------------+-------+
    
    | thread_cache_size | 68    |
    
    +-------------------+-------+
    
    1 row in set (0.31 sec)

    查询缓存

    query_cache_size是设置MySQL的Query Cache大小,query_cache_type是设置使用查询缓存的类型,我们可以用如下命令查看其具体情况:

    mysql> show global status like 'qcache%';
    
    +-------------------------+---------+
    
    | Variable_name           | Value   |
    
    +-------------------------+---------+
    
    | Qcache_free_blocks      | 1       |
    
    | Qcache_free_memory      | 1031832 |
    
    | Qcache_hits             | 0       |
    
    | Qcache_inserts          | 0       |
    
    | Qcache_lowmem_prunes    | 0       |
    
    | Qcache_not_cached       | 2181771 |
    
    | Qcache_queries_in_cache | 0       |
    
    | Qcache_total_blocks     | 1       |
    
    +-------------------------+---------+
    
    8 rows in set (0.29 sec)

    MySQL查询缓存变量的相关解释如下:

    Qcache_free_blocks: 缓存中相领内存快的个数。数目大说明可能有碎片。flush
    query cache会对缓存中的碎片进行整理,从而得到一个空间块。

    Qcache_free_memory:缓存中的空闲空间。

    Qcache_hits:多少次命中。通过这个参数可以查看到Query
    Cache的基本效果。

    Qcache_inserts:插入次数,没插入一次查询时就增加1。命中次数除以插入次数就是命中比率。

    Qcache_lowmem_prunes:多少条Query因为内存不足而被清楚出Query Cache。通过Qcache_lowmem_prunes和Query_free_memory相互结合,能够更清楚地了解到系统中Query Cache的内存大小是否真的足够,是否非常频繁地出现因为内存不足而有Query被换出的情况。   

    Qcache_not_cached:不适合进行缓存的查询数量,通常是由于这些查询不是select语句或用了now()之类的函数。

    Qcache_queries_in_cache:当前缓存的查询和响应数量。

    Qcache_total_blocks:缓存中块的数量。

    我们在查询一下服务器上关于query_cache的配置:

    mysql> show variables like 'query_cache%';
    
    +------------------------------+---------+
    
    | Variable_name                | Value   |
    
    +------------------------------+---------+
    
    | query_cache_limit            | 1048576 |
    
    | query_cache_min_res_unit     | 4096    |
    
    | query_cache_size             | 1048576 |
    
    | query_cache_type             | OFF     |
    
    | query_cache_wlock_invalidate | OFF     |
    
    +------------------------------+---------+
    
    5 rows in set (0.12 sec)

    字段解释如下:

    query_cache_limit:超过此大小的查询将不缓存。

    query_cache_min_res_unit:缓存块的最小值。

    query_cache_size:查询缓存大小。

    query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存select sql_no_cache查询。

    query_cache_wlock_invalidat:表示当有其他客户端正在对MyISAM表进行写操作,读请求是要等WRITE LOCK释放资源后再查询还是允许直接从Query Cache中读取结果,默认为OFF(可以直接从Query Cache中取得结果。)

    query_cache_min_res_unit的配置是一柄双刃剑,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。

    查询缓存碎片率 = Qcache_free_blocks /Qcache_total_blocks * 100%
    
    如果查询碎片率超过20%,可以用 flush query cache 整理缓存碎片,或者试试减少query_cache_min_res_unit,如果你查询都是小数据库的话。
    
    查询缓存利用率 = (Qcache_free_size –  Qcache_free_memory)/query_cache_size * 100%
    
    查询缓存利用率在25%一下的话说明query_cache_size设置得过大,可适当减少;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话则说明query_cache_size可能有点小,不然就是碎片太多。
    
    查询命中率 = (Qcache_hits - Qcache_insert)/Qcache)hits * 100%
    
    示例服务器中的查询缓存碎片率等于20%左右,查询缓存利用率在50%,查询命中率在2%,说明命中率很差,可能写操作比较频繁,而且可能有些碎片。

    排序使用情况

    它表示系统中对数据进行排序时所用的Buffer,我们可以用如下命令查看:

    mysql> show global status like 'sort%';
    
    +-------------------+---------+
    
    | Variable_name     | Value   |
    
    +-------------------+---------+
    
    | Sort_merge_passes | 37      |
    
    | Sort_range        | 110404  |
    
    | Sort_rows         | 1122189 |
    
    | Sort_scan         | 795334  |
    
    +-------------------+---------+
    
    4 rows in set (0.26 sec)

    Sort_merge_passes包括如下步骤:MySQL首先会尝试在内存中做排序,使用的内存大小由系统变量sort_buffer_size来决定,如果它不够大则把所有的记录都读在内存中,而MySQL则会把每次在内存中排序的结果存到临时文件中,等MySQL找到所有记录之后,再把临时文件中的记录做一次排序。这次再排序就会增加sort_merge_passes。实际上,MySQL会用另外一个临时文件来存储再次排序的结果,所以我们通常会看到sort_merge_passes增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增大sort_buffer_size会减少sort_merge_passes和创建临时文件的次数,但盲目地增大sort_buffer_size并不一定能提高速度。

    打开文件数(open_files)

    我们现在处理MySQL故障时,发现当Open_files大于open_files_limit值时,MySQL数据库就会发生卡住的现象,导致Nginx服务器打不开相应页面。这个问题大家在工作中应注意,我们可以用如下命令查看其具体情况:

    mysql> show global status like 'open_files';
    
    +---------------+-------+
    
    | Variable_name | Value |
    
    +---------------+-------+
    
    | Open_files    | 18    |
    
    +---------------+-------+
    
    1 row in set (0.30 sec)
    比较合适的设置是:Open_files / Open_files_limit * 100% < = 75%
  • 相关阅读:
    【ybtoj】【kmp】公共子串
    【ybtoj】【Hash】最大分离度
    【哈希表模板(链前版本)】【ybtoj】【特殊序列】
    【ybtoj】【单调队列】出题方案
    【ybtoj】【单调队列】写博客
    【ybtoj】【线段树】魔法传输
    【ybtoj】【单调队列入门专题】
    OS:3-存储管理
    OS:2-处理器管理
    OS:1-操作系统概观
  • 原文地址:https://www.cnblogs.com/FireLL/p/11641730.html
Copyright © 2011-2022 走看看