Mysql状态查询及调优

本文介绍了如何查询MySQL的状态,包括连接数和数据库状态,并详细讲解了MySQL的调优方法,如开启慢查询日志、并发及连接控制、缓存参数调整等,旨在提升MySQL的性能和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、MySQL状态查询

1、查看MySQL连接数 show full processlist

2、查看MySQL数据库状态 show status

二、MySQL调优 

1、开启慢查询日志

2、并发及连接控制

3、缓存参数控制 

3.1 key_buffer_size 

3.2 Key_reads 

3.3  Key_blocks_used

3.4  sort_buffer_size

3.5 read_buffer_size

3.6 thread_cache_size

3.7 table_open_cache

3.8 query_cache_size

3.9 innodb_buffer_pool_size

3.10 innodb_buffer_pool_instances

3.11 innodb_lock_wait_timeout

3.12 innodb_flush_log_at_trx_commit

3.13  sync_binlog

4、临时表

5、表锁、表扫描

6、打开文件数


一、MySQL状态查询

1、查看MySQL连接数 show full processlist

  1. 如果连接数很多,可将信息打印出来
  2. [root@mysql ~]# mysql -uroot -p123456 -e 'show full processlist' > /processlist.txt
  3. 若不加上full选项,则最多显示100条记录
  4. 若以root帐号登录,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。
  5. 在调试程序时,如怀疑应用程序中存在申请DB连接未释放的情况,可以通过该命令查询连接数(以应用程序中的user登录)。如程序运行过程中连接数越来越多,则可以判断程序中有DB资源未释放。
  6. 修改允许建立的最大连接数:
  7. set-variable=max_user_connections=30                    //单用户的连接数
  8. set-variable=max_connections=800                           //全局的限制连接数

2、查看MySQL数据库状态 show status

  • show status like '%变量名称%';  
  • 常用变量有:
  1. Aborted_clients    由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
  2. Aborted_connects    尝试已经失败的MySQL服务器的连接的次数。
  3. Connections    试图连接MySQL服务器的次数。
  4. Created_tmp_tables    当执行语句时,已经被创造了的隐含临时表的数量。
  5. Delayed_insert_threads    正在使用的延迟插入处理器线程的数量。
  6. Delayed_writes    用INSERT DELAYED写入的行数。
  7. Delayed_errors    用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
  8. Flush_commands    执行FLUSH命令的次数。
  9. Handler_delete    请求从一张表中删除行的次数。
  10. Handler_read_first    请求读入表中第一行的次数。
  11. Handler_read_key    请求数字基于键读行。
  12. Handler_read_next    请求读入基于一个键的一行的次数。
  13. Handler_read_rnd    请求读入基于一个固定位置的一行的次数。
  14. Handler_update    请求更新表中一行的次数。
  15. Handler_write    请求向表中插入一行的次数。
  16. Key_blocks_used    用于关键字缓存的块的数量。
  17. Key_read_requests    请求从缓存读入一个键值的次数。
  18. Key_reads    从磁盘物理读入一个键值的次数。
  19. Key_write_requests    请求将一个关键字块写入缓存次数。
  20. Key_writes    将一个键值块物理写入磁盘的次数。
  21. Max_used_connections    同时使用的连接的最大数目。
  22. Max_used_connections    响应的连接数,(max_used_connections / max_connections) * 100% = (理想值 ≈ 85%)
  23. Not_flushed_key_blocks    在键缓存中已经改变但是还没被清空到磁盘上的键块。
  24. Not_flushed_delayed_rows    在INSERT DELAY队列中等待写入的行的数量。
  25. Open_tables    打开表的数量。
  26. Open_files    打开文件的数量。
  27. Open_streams    打开流的数量(主要用于日志记载)
  28. Opened_tables    已经打开的表的数量。
  29. Questions    发往服务器的查询的数量。
  30. Slow_queries    要花超过long_query_time时间的查询数量。
  31. Threads_connected    当前打开的连接的数量。
  32. Threads_running     代表当前并发数,这个数值一般远低于connected数值。
  33. Uptime    服务器工作了多少秒。

二、MySQL调优 

1、开启慢查询日志

  • 查看MYSQL服务器的慢查询状态是否开启:
  1. mymsql [(none)]> show variables like '%quer%'; 
  2. log_slow_queries              | OFF     //当前log_slow_queries状态为OFF, 说明当前并没有开启慢查询       
  3. long_query_time               | 10.000000        //查询最长时间默认10秒
  • 在mysql的配置文件my.cf,,在mysqld下方加入慢查询的配置语句:
  1. vim /etc/my.cnf
  2. [mysqld]
  3. .. ..
  4. slow_query_log=1    //启用慢查询
  5. slow_query_log_file=/var/lib/mysql/mysql-slow.log    //指定慢查询日志
  6. long_query_time=5    //指定查询的最长时间,超过此时间会被记录
  7. log_queries_not_using_indexes=1    //记录未使用索引的查询
  • 查看慢查询日志:mysqldumpslow /var/lib/mysql/mysql-slow.log

2、并发及连接控制

  1. show global status like 'max%connections';    查看当前已使用的连接数
  2. show variables like 'max_connections';      查看默认的最大连接数
  3. max_used_connections / max_connections) * 100% = (理想值 <= 85%)
  • 修改默认MYSQL连接数的方法有两个:
  1. mysql> set global max_connections=200;
  2. 配置文件my.cnf 中添加max_connections=200 重起MYSQL即可
mysql > show global status like 'max%connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 3     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql > show variables like 'max_connections';    
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.00 sec)

3、缓存参数控制 

3.1 key_buffer_size 

  1. key_buffer_size 是对MyISAM表性能影响最大的一个参数,默认为8M,指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。一般我们设为16M。不过数据库中多为Innodb表。
  2. 如图一共有25629497个索引读取请求,有66071个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率: key_cache_miss_rate = Key_reads / Key_read_requests * 100% = 0.27%,适当加大此key_buffer_size缓存值。
  • 修改默认key_buffer_size的方法有两个:
  1. mysql> set global key_buffer_size=268435456;
  2. 配置文件my.cnf 中添加 key_buffer_size=67108864 重起MYSQL即可

 

mysql> show variables like 'key_buffer_size';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| key_buffer_size | 67108864 |
+-----------------+----------+
 
mysql> show global status like 'key_read%';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| Key_read_requests | 25629497 |
| Key_reads         | 66071    |
+-------------------+----------+

3.2 Key_reads 

  • 虽说Key_read_requests大比小好,但是对于系统调优而言,更有意义的应该是单位时间内的Key_reads,即:Key_reads / Uptime
  • 注:命令里的mysqladmin ext其实就是mysqladmin extended-status,你甚至可以简写成mysqladmin e。其中第一行表示的是汇总数值,下面的每行数值都表示10秒内的数据变化,从这份数据可以看出每10秒系统大约会出现600次Key_reads访问,折合到每1秒就是60次左右,至于这个数值到底合理与否,就由服务器的磁盘能力而定了。(注:我这里之所以数据变化较大,是因为有update等语句造成了表锁而导致下个时间段内的查询数猛增。)
    为什么数据按10秒取样,而不是直接按1秒取样?由于时间段过小,数据变化比较剧烈,不容易直观估计大小,所以通常数据按照10秒或者60秒之类的时间段来取样是更好的。
[root@mysql ~]# mysqladmin ext -uroot -p -ri10 | grep Key_reads        
Enter password: 
| Key_reads                                | 315648           |
| Key_reads                                | 672           |
| Key_reads                                | 368           |
| Key_reads                                | 756           |

3.3  Key_blocks_used

  • Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 18% (理想值 ≈ 80%)
  • Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。
mysql> show global status like 'key_blocks_u%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Key_blocks_unused | 10285  |
| Key_blocks_used   | 47705  |
+-------------------+--------+
2 rows in set (0.00 sec)

3.4  sort_buffer_size

  1.  sort_buffer_size 是一个connection级参数,在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存。
  2.  sort_buffer_size 默认为256K,增大此值可提高 ORDER 和 GROUPBY 的速度,但是并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。
  • 修改默认sort_buffer_size da大小的方法有以下两种:
  1. mysql> set global sort_buffer_size=4194304;
  2. 配置文件my.cnf 中添加 sort_buffer_size=4194304 重起MYSQL即可
mysql> show variables like "sort_buffer_size";
+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| sort_buffer_size | 2097152 |
+------------------+---------+

3.5 read_buffer_size

  1.  read_buffer_size 是一个connection级参数,为需要全表扫描的MYISAM数据表线程指定缓存。
  2. read_buffer_size 是MySQL读入缓冲区大小,默认为16KB,这个变量的值是4KB的倍数。
  • 修改默认sort_buffer_size da大小的方法有以下两种:
  1. mysql> set global read_buffer_size=262144;
  2. 配置文件my.cnf 中添加 read_buffer_size=262144 重起MYSQL即可
mysql> show variables like "read_%_size";
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| read_buffer_size     | 131072 |
| read_rnd_buffer_size | 262144 |
+----------------------+--------+

3.6 thread_cache_size

  • thread_cache_size 可重用线程数,默认为0。如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。
  • 修改默认sort_buffer_size da大小的方法有以下两种:
  1. mysql> set global thread_cache_size=16;
  2. 配置文件my.cnf 中添加  thread_cache_size=16 重起MYSQL即可
mysql> show variables like "thread_cache_size";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 16    |
+-------------------+-------+
  • 查看当前线程的重用状态,Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明 MySQL服务器一直在创建线程,这也比较耗资源,可以适当增加配置文件中thread_cache_size值。

mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 31    |
| Threads_connected | 239   |
| Threads_created   | 1876  |
| Threads_running   | 18    |
+-------------------+-------+

3.7 table_open_cache

  • 查看可缓存多少个打开的表
  • 如果opened_tables很大并且不经常使用flush tables,官方建议我们增加该参数的大小。这个值并不是越大越好,需要根据实际情况下open_tables和opened_tables的综合进行调整
  • 修改默认sort_buffer_size da大小的方法有以下两种:
  1. mysql> set global table_open_cache=1024;
  2. 配置文件my.cnf 中添加 table_open_cache=1024  重起MYSQL即可
mysql> show variables like "table_open_cache";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 1024  |
+------------------+-------+
  •  查看已打开、打开过多少个表 
  1. Open_tables 表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中 table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小。
  2.  理想值 (>= 85%) Open_tables / table_cache * 100% = 100% 理想值 (<= 95%)
mysql> show global status like "open%tables";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 1024  |
| Opened_tables | 1256  |
+---------------+-------+

3.8 query_cache_size

  • query_cache_size:分配给查询缓存的内存大小,要配合query_cache_type使用,默认不开启。
  • 查询缓存的工作原理:一个select语句请求查询发生后,数据库将查询结果缓存到cache中,等同样的select查询过来后,如果这段时间内该查询结果没有发生变化时,数据库将cache中将缓存结果返回,但是假如查询的相关数据表增删改特别多的话,数据表变更的这段时间内,要将cache失效,然后再更新数据,对于增删改来说,花费的时间就很多了,所以要有所权衡。
  • 查询一下数据库关于查询缓存的相关配置:
  1. query_cache_limit:超过此大小的查询将不缓存
  2. query_cache_min_res_unit:缓存块的最小值 
  3. query_cache_size:查询缓存大小
  4. query_cache_type:缓存类型,决定缓存什么样的查询,0或者OFF表示不缓存,1或者ON表示缓存所有查询,2或者DEMAND 表示”按需分配”模式,只响应SELECT SQL_CACHE命令。示例中表示缓存所有除了 select sql_no_cache 查询。
  5. query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
  6. query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
  7. 查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
  8. 如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
  9. 查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
  10. 查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。
  11. 查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
  12. 示例服务器 查询缓存碎片率 = 20.46%,查询缓存利用率 = 62.26%,查询缓存命中率 = 1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。

 


mysql> show variables like 'query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 33554432 |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
  • 查询数据库缓存情况
  1. Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。
  2. FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
  3. Qcache_free_memory:缓存中的空闲内存。
  4. Qcache_hits:每次查询在缓存中命中时就增大。
  5. Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
  6. Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
  7. Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
  8. Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
  9. Qcache_total_blocks:缓存中块的数量。 

mysql> show global status like 'qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 2226     |
| Qcache_free_memory      | 10794944 |
| Qcache_hits             | 5385458  |
| Qcache_inserts          | 1806301  |
| Qcache_lowmem_prunes    | 433101   |
| Qcache_not_cached       | 4429464  |
| Qcache_queries_in_cache | 7168     |
| Qcache_total_blocks     | 16820    |
+-------------------------+----------+

3.9 innodb_buffer_pool_size

Innodb Buffer Pool 不仅缓存索引,同时还会缓存实际的数据,它的大小直接影响数据库的性能,随着缓冲池的增大,TPS会线性增长;直到缓冲池的大小大于数据文件本身的大小为止,最好的情况是将全部的数据和索引都放入到这个缓存里面,这样mysql的查询操作都从内存里取数据,大大提高了读取效率。对于繁忙的服务器,buffer pool 将划分为多个实例以提高系统并发性,减少线程间读写缓存的争用。

  • SELECT @@innodb_buffer_pool_size;
  • 一般将这个值设置为整个系统物理内存的 80% 左右,默认134217728 Bytes,128M。
  • 修改默认innodb_buffer_pool_size大小的方法有以下两种:
  1. set global innodb_buffer_pool_size = 8589934590
  2. 配置文件my.cnf 中添加 innodb_buffer_pool_size=8589934590  重起MYSQL即可
mysql> show variables like "%innodb_buffer_pool%";
+---------------------------------------+-----------+
| Variable_name                         | Value     |
+---------------------------------------+-----------+
| innodb_buffer_pool_instances          | 8         |
| innodb_buffer_pool_populate           | OFF       |
| innodb_buffer_pool_restore_at_startup | 0         |
| innodb_buffer_pool_shm_checksum       | ON        |
| innodb_buffer_pool_shm_key            | 0         |
| innodb_buffer_pool_size               | 8589934590|
+---------------------------------------+-----------+

3.10 innodb_buffer_pool_instances

innodb_buffer_pool_instances可以开启多个innodb_buffer_pool内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的进行内存读写(取值范围为1-64),每个缓存池的大小为innodb_buffer_pool_size/innodb_buffer_pool_instances,通常单个innode_buffer_pool缓存池的大小不能小于1GB。使用这个参数的前提是:高并发读写。

3.11 innodb_lock_wait_timeout

 innodb_lock_wait_timeout 指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒,默认为50s。

  • 修改默认innodb_lock_wait_timeout大小的方法有以下两种:
  1. set global innodb_lock_wait_timeout=10;
  2. 配置文件my.cnf 中添加 innodb_lock_wait_timeout=10  重起MYSQL即可
mysql> show variables like "%innodb_lock%";
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_lock_wait_timeout       | 50    |
| innodb_locks_unsafe_for_binlog | OFF   |
+--------------------------------+-------+

3.12 innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit和sync_binlog是MySQL innodb引擎的两个重要的参数,其中innodb_flush_log_at_trx_commit是将事务日志从innodb log buffer写入到redo log中,sync_binlog是将二进制日志文件刷新到磁盘上。

  • 修改默认innodb_flush_log_at_trx_commit 大小的方法有以下两种:
  1. set global innodb_flush_log_at_trx_commit=0/1/2;
  2. 配置文件my.cnf 中添加 innodb_flush_log_at_trx_commit=0/1/2  重起MYSQL即可
  • innodb事务日志redo,binlog逻辑过程如下:
  1. 事务写入redo log buffer中;
  2. 将log buffer刷新到redo log中,不过会先写一个TX PREPARE标记;
  3. 写binlog
  4. 在redo log中写入TX COMMIT标记;
  5. 将写binlog成功的标记写入redo log。


参数解析如下: 
innodb_flush_log_at_trx_commit = N: 

N=0    每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;
   log buffer 会 每秒写入到日志文件并刷写(flush)到磁盘。但每次事务提交不会有任何影响,也就是 log buffer 的刷写操作和事务提交操作没有关系。在这种情况下,MySQL性能最好,但如果 mysqld 进程崩溃,通常会导致最后 1s 的日志丢失。
   
N=1    每个事务提交时候,把事务日志从缓存区写到日志文件中,并且刷新日志文件的数据到磁盘上; 
    当取值为 1 时,每次事务提交时,log buffer 会被写入到日志文件并刷写到磁盘。这也是默认值。这是最安全的配置,但由于每次事务都需要进行磁盘I/O,所以也最慢。

N=2    每事务提交的时候,把事务日志数据从缓存区写到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盘上,而是取决于操作系统的调度; 
    当取值为 2 时,每次事务提交会写入日志文件,但并不会立即刷写到磁盘,日志文件会每秒刷写一次到磁盘。这时如果 mysqld 进程崩溃,由于日志已经写入到系统缓存,所以并不会丢失数据;在操作系统崩溃的情况下,通常会导致最后 1s 的日志丢失。 
上面说到的「最后 1s」并不是绝对的,有的时候会丢失 更多数据。有时候由于调度的问题,每秒刷写(once-per-second flushing)并不能保证 100% 执行。

  1. 对于一些数据一致性和完整性要求不高的应用,配置为 2 就足够了
  2. 如果为了最高性能,可以设置为 0。有些应用,如支付服务
  3. 对一致性和完整性要求很高,所以即使最慢,也最好设置为 1. 

   

mysql> show variables like "%innodb_flush%";
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_timeout    | 1     |
| innodb_flush_log_at_trx_commit | 1     |
| innodb_flush_method            |       |
| innodb_flush_neighbors         | 1     |
| innodb_flush_sync              | ON    |
| innodb_flushing_avg_loops      | 30    |
+--------------------------------+-------+

3.13  sync_binlog

该参数控制着二进制日志写入磁盘的过程,有效值为0 、1、N:

0:事务提交后,将二进制日志从缓冲写入磁盘,但是不进行刷新操作(fsync()),此时只是写入了操作系统缓冲,若操作系统宕机则会丢失部分二进制日志。

1:默认值。事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。

N:每写N次操作系统缓冲就执行一次刷新操作。

二进制日志文件涉及到数据的恢复,以及想在主从之间获得最大的一致性,那么应该将该参数设置为1,但同时也会造成一定的性能损耗。

通常,会将这两个参数都设置成1来保证数据的安全,但是如果在某些情况下性能更重要,那么可以考虑将其设为其他值来获得最大的性能。

  • 修改默认sync_binlog大小的方法有以下两种:
  1. set global sync_binlog=10;
  2. 配置文件my.cnf 中添加 global sync_binlog=10  重起MYSQL即可
mysql> show variables like "sync_binlog";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+

4、临时表

  1. 每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数: (Created_tmp_disk_tables / Created_tmp_tables) * 100% = 99% (理想值<= 25%),此时需要增加tmp_table_size。
  • 修改默认tmp_table_size的方法有两个:
  1. mysql>set  tmp_table_size=33554432; 
  2. 配置文件my.cnf 中添加 tmp_table_size=33554432 重起MYSQL即可

mysql> show global status like 'created_tmp%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Created_tmp_disk_tables | 3689542 |
| Created_tmp_files       | 3389    |
| Created_tmp_tables      | 3468575 |
+-------------------------+---------+

5、表锁、表扫描

  • 查看表索情况:Table_locks_immediate 表示立即释放表锁数,Table_locks_waited表示需要等待的表锁数,如果 Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。
mysql> show global status like 'table_locks%';
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
| Table_locks_immediate | 36845617|
| Table_locks_waited    | 32428   |
+-----------------------+---------+
  • 查看表扫描情况:

mysql> show global status like 'handler_read%';
+-----------------------+-----------+
| Variable_name         | Value     |
+-----------------------+-----------+
| Handler_read_first    | 108763    |
| Handler_read_key      | 92813521  |
| Handler_read_next     | 486650793 |
| Handler_read_prev     | 688726    |
| Handler_read_rnd      | 9321362   |
| Handler_read_rnd_next | 153086384 |
+-----------------------+-----------+
  • 查看数据库完成的查询请求次数:
  • 表扫描率 = Handler_read_rnd_next / Com_select
    如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。 
mysql> show global status like 'com_select';
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Com_select    | 1964256 |
+---------------+---------+

 

6、打开文件数

  • open_files_limit 默认是最小1024,open_files_limit 是mysql 中的一个全局变量且不可动态修改。它控制着mysqld进程能使用的最大文件描述(FD)符数量。需要注意的是这个变量的值并不一定是你设定的值,mysqld会在系统允许的情况下尽量获取更多的FD数量。
  • 比较合适的设置:Open_files / open_files_limit * 100% <= 75%
  • 修改默认open_file_limie 的方法:
  1. 配置文件 my.cnf 中 [mysqld_safe] 下添加 open_files_limit = 65535 重起MYSQL即可
mysql> show global status like 'open_files';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files    | 261   |
+---------------+-------+
1 row in set (0.01 sec)

mysql> show variables like 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 65535 |
+------------------+-------+
1 row in set (0.00 sec)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值