您现在的位置是:首页 >学习教程 > 观察MySQL状态网站首页学习教程
观察MySQL状态
MySQL的运行状态是我们排查性能问题的第一步。通过查看全局状态变量,我们可以获取系统的整体运行情况。以下是一些关键的状态变量和信息:
Threads_running 和 Threads_connected
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
Threads_running 表示当前正在执行的线程数量。
Threads_connected 表示当前已连接到MySQL的线程数量。
如果 Threads_running 较高,而 Threads_connected 较低,可能表明存在某些长时间运行的查询,或者可能是由于连接池配置不当导致连接被频繁创建和销毁。
InnoDB 相关状态
SHOW ENGINE INNODB STATUS;
查看InnoDB引擎状态,关注以下信息:
Innodb_row_lock_current_waits:表示当前正在等待的行锁数量。
Innodb_deadlocks:显示发生的死锁次数。
高的行锁等待和死锁次数可能表明业务逻辑或查询需要优化,或者存在并发访问冲突。
Key_reads 和 Key_writes
SHOW GLOBAL STATUS LIKE 'Key_reads';
SHOW GLOBAL STATUS LIKE 'Key_writes';
Key_reads:表示从磁盘读取索引块的次数。
Key_writes:表示向磁盘写入索引块的次数。
高的 Key_reads 可能暗示着索引未能完全放入内存中,需要调整 key_buffer_size 参数。而频繁的 Key_writes 可能表明索引的写入操作较为频繁,需要考虑索引的优化。
Created_tmp_disk_tables
SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';
表示在磁盘上创建的临时表的数量。过多的磁盘临时表可能表明某些查询需要优化,或者 tmp_table_size 参数设置过小。
SHOW STATUS LIKE 'Uptime';
表示MySQL服务的运行时间。如果CPU问题突然发生,检查这个值,看是否与问题的时间点相关。
其他关键状态变量
浏览MySQL官方文档以获取更多有关全局状态变量的信息,根据具体情况添加监控和分析。
通过这些状态变量,我们可以初步了解MySQL的整体运行情况,从而有针对性地继续深入排查问题。在分析状态时,可以使用各种监控工具,如pt-mysql-summary或MySQL Enterprise Monitor,以更方便地查看和理解MySQL的状态信息。
Mysql参数设置
数据库属于IO密集型的应用程序,其主职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个 IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是IO,尽可能将磁盘IO转化为内存IO。
SELECT version(); // 版本:8.0.30
// 索引块的缓冲区大小,增加它可得到更好处理的索引
show global variables like 'key_buffer_size'; // 默认值:8M
set global key_buffer_size=1024*1024*64
show global variables like 'max_allowed_packet'; // 默认值:64M
show global variables like 'table_open_cache'; // 默认值:4000
set global table_open_cache=16000
// sort_buffer_size是MySql执行排序使用的缓冲大小
show global variables like 'sort_buffer_size'; // 默认值:256KB
set global sort_buffer_size=1024*1024*16
show global variables like 'net_buffer_length'; // 默认值:16KB
//read_buffer_size 是MySql读入缓冲区大小。
show global variables like 'read_buffer_size'; // 默认值:128KB
set global read_buffer_size=1024*1024*8
// tmp_table_size是MySql的heap (堆积)表缓冲大小
show global variables like 'tmp_table_size'; // 默认值:16M
set global tmp_table_size=1024*1024*128
// read_rnd_buffer_size 是MySql的随机读缓冲区大小
show global variables like 'read_rnd_buffer_size'; // 默认值:256KB
set global read_rnd_buffer_size=1024*1024*4
// thread_cache_size可以重新利用保存在缓存中线程的数量
show global variables like 'thread_cache_size'; // 默认值:8
set global thread_cache_size=64
// MySql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,
// 当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySql会为每个连接提供连接缓冲区,就会开销越多的内存
show global variables like 'max_connections'; // 最多连接数, 默认:151
set global max_connections=5000;
show global variables like 'max_connect_errors'; // 默认值:100
set global max_connect_errors=1000;
show global variables like 'open_files_limit'; // 默认值:1M
show global variables like 'innodb_data_file_path';
// InnoDB
// 对InnoDB表性能影响最大的一个参数。InnoDB缓冲池用于缓存数据和索引,对于读取频繁的表,适当调整缓冲池大小可以显著提升性能。
将
// innodb_buffer_pool_size设置为系统中Mysql可用内存的70%左右。这确保了大部分数据和索引都可以在内存中缓存,减少磁盘I/O操作。
show global variables like 'innodb_buffer_pool_size'; // 默认值:128M
set global innodb_buffer_pool_size=1024*1024*1024*32 //32G
//InnoDB事务日志文件大小
show global variables like 'innodb_log_file_size';
// InnoDB存储引擎的事务日志所使用的缓冲区
show global variables like 'innodb_log_buffer_size'; // 默认值:16M
set global innodb_log_buffer_size=1024*1024*128
show global variables like 'sync_binlog';
set global sync_binlog=1000