MySQL相关性能查询语句

MySQL相关性能查询语句

复制代码
SELECT * FROM fims.base_airlines where id='2001932029704278018'


SELECT * FROM orms.base_airlines where id='2001932029704278018'


select count(*) from fims.base_airlines ;


##
show variables like '%control%'
show plugins;

##查询所有会话
SELECT * FROM information_schema.processlist order by time desc;
##查询活跃会话
SELECT * FROM information_schema.processlist WHERE command != 'Sleep';
##查询system user系统用户会话
SELECT * FROM information_schema.processlist WHERE user = 'system user';
##查询非系统用户会话
SELECT * FROM information_schema.processlist WHERE user != 'system user';
##统计各个用户的会话量
select user,command,count(1) from information_schema.processlist group by user,command
order by COMMAND desc,count(1) desc;

##查看mysql总内存消耗
select * from sys.memory_global_total;

##查看总内存使用
    SELECT 
SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  )  as used_memory_mb
FROM sys.memory_global_by_current_bytes
WHERE current_alloc like '%MiB%';

##检查内存使用
 SELECT @@key_buffer_size,
     @@innodb_buffer_pool_size ,
     @@innodb_log_buffer_size ,
     @@tmp_table_size ,
     @@read_buffer_size,
     @@sort_buffer_size,
     @@join_buffer_size ,
     @@read_rnd_buffer_size,
     @@binlog_cache_size,
     @@thread_stack,
     (SELECT COUNT(host) FROM  information_schema.processlist where command<>'Sleep');
   
##查看 Buffer Pool 使用情况
SELECT 
    FORMAT(@@innodb_buffer_pool_size / 1024 / 1024 / 1024, 2) AS buffer_pool_size_gb,
    #FORMAT(@@innodb_buffer_pool_size * @@innodb_buffer_pool_instances / 1024 / 1024 / 1024, 2) AS total_buffer_pool_gb,
    VARIABLE_VALUE AS free_pages
FROM performance_schema.global_status 
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_free';



##分事件统计内存
 SELECT event_name,
    SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  ) used_memory_mb
    FROM sys.memory_global_by_current_bytes
    WHERE current_alloc like '%MiB%' GROUP BY event_name  
     ORDER BY SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  ) DESC ;
    

##按用户统计内存使用(需要 MySQL 5.7+)
SELECT 
    USER,
    HOST,
    EVENT_NAME,
    round(CURRENT_NUMBER_OF_BYTES_USED / 1024 / 1024,2) as CURRENT_USED_MB, #当前‌该事件已分配但尚未释放的内存字节数。这是判断实时内存占用的关键指标。‌
    COUNT_ALLOC, #该事件累计分配内存的次数。
    COUNT_FREE, #该事件累计释放内存的次数。
    SUM_NUMBER_OF_BYTES_ALLOC, #该事件累计分配的内存字节数总和。
    SUM_NUMBER_OF_BYTES_FREE, #该事件累计释放的内存字节数总和。
    CURRENT_COUNT_USED,
    HIGH_COUNT_USED,
    round(HIGH_NUMBER_OF_BYTES_USED / 1024 / 1024,2) as high_mb
FROM performance_schema.memory_summary_by_account_by_event_name
WHERE USER IS NOT NULL
ORDER BY CURRENT_NUMBER_OF_BYTES_USED desc limit 20;


##账号级别统计
SELECT user,host,event_name,round(current_number_of_bytes_used/1024/1024,2) as MB_CURRENTLY_USED
FROM performance_schema.memory_summary_by_account_by_event_name
WHERE host<>"localhost"
ORDER BY  current_number_of_bytes_used DESC LIMIT 10;

##按照线程统计
select thread_id,event_name,round(CURRENT_NUMBER_OF_BYTES_USED/1024/1024 ,2) as CURRENT_NUMBER_OF_BYTES_USED
from performance_schema.memory_summary_by_thread_by_event_name 
order by CURRENT_NUMBER_OF_BYTES_USED desc limit 10;

## 查看每个连接的 buffer pool 使用情况
SELECT 
    p.ID as process_id,
    p.USER,
    p.HOST,
    p.DB,
    p.COMMAND,
    p.TIME,
    p.STATE,
    p.INFO,
    FORMAT(mt.COUNT_ALLOC, 0) as alloc_count,
    FORMAT(mt.CURRENT_NUMBER_OF_BYTES_USED / 1024 / 1024, 2) as current_mb,
    FORMAT(mt.HIGH_NUMBER_OF_BYTES_USED / 1024 / 1024, 2) as high_mb
FROM performance_schema.threads t
JOIN information_schema.PROCESSLIST p ON t.PROCESSLIST_ID = p.ID
JOIN performance_schema.memory_summary_by_thread_by_event_name mt ON t.THREAD_ID = mt.THREAD_ID
WHERE mt.EVENT_NAME LIKE 'memory/innodb/%'
    AND mt.CURRENT_NUMBER_OF_BYTES_USED > 0
ORDER BY mt.CURRENT_NUMBER_OF_BYTES_USED desc limit 20;

##查看参数配置
show variables like 'wait_timeout'; --28800

show variables like 'innodb_buffer_pool_size';  --85899345920 80GB

##查看session级别的buffer和cache占用内存大小
show variables where variable_name in ('binlog_cache_size','join_buffer_size','query_cache_size','read_buffer_size','read_rnd_buffer_size','sort_buffer_size')

##查看tmp_table_size临时表配置的内存大小: 8589934592 8GB
##如果内存中的临时表超出限制,MySQL自动将其转换为磁盘上的MyISAM表。如果要执行许多 GROUP BY查询,可以增加tmp_table_size的值(或如有必要,也可以使用max_heap_table_size)
show variables where variable_name in ('tmp_table_size','max_heap_table_size')

##查看当前是否有临时表产生
##发现频繁使用了临时表,并且出现了因内存临时表不够而使用到磁盘临时表。由于临时表占用的内存具体大小可能无法准确计算得出(因为使用完会回收,但是肯定存在当前未被回收情况)
show global status like '%tmp%'


##查看 MGR 组成员信息                                                                                                                       
SELECT * FROM performance_schema.replication_group_members;   


--查看数据库大小                                                                                                                        
select                                                                                                                           
table_schema as '数据库',                                                                                                           
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',                                                                           
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'                                                                           
from information_schema.tables                                                                                                   
group by table_schema                                                                                                            
order by sum(data_length) desc, sum(index_length) desc;   




table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
where table_schema='fims'
order by data_length desc, index_length desc;

show variables like '%character%'



SHOW GLOBAL STATUS LIKE 'Table_locks_%';

----数据库性能相关指标------------
/**
 * 

-- 连接使用率
SELECT 
    '连接使用率' AS 指标名称,
    VARIABLE_VALUE AS 当前连接数,
    @@max_connections AS 最大连接数,
    ROUND((VARIABLE_VALUE / @@max_connections) * 100, 2) AS 使用率百分比,
    CASE 
        WHEN (VARIABLE_VALUE / @@max_connections) >= 0.8 THEN '警告:连接使用率超过80%'
        WHEN (VARIABLE_VALUE / @@max_connections) >= 0.9 THEN '严重:连接使用率超过90%'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status 
WHERE VARIABLE_NAME = 'Threads_connected'
union all
## 线程缓存命中率
SELECT 
    '线程缓存命中率' AS 指标名称,
    s1.VARIABLE_VALUE AS 已创建线程数,
    s2.VARIABLE_VALUE AS 总连接数,
    ROUND((1 - s1.VARIABLE_VALUE / s2.VARIABLE_VALUE) * 100, 2) AS 命中率百分比,
    CASE 
        WHEN (1 - s1.VARIABLE_VALUE / s2.VARIABLE_VALUE) * 100 < 95 THEN '警告:命中率低于95%'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status s1
JOIN performance_schema.global_status s2 
WHERE s1.VARIABLE_NAME = 'Threads_created' 
  AND s2.VARIABLE_NAME = 'Connections'
 union all
-- 慢查询比例
SELECT 
    '慢查询比例' AS 指标名称,
    s1.VARIABLE_VALUE AS 慢查询数,
    s2.VARIABLE_VALUE AS 总查询数,
    ROUND((s1.VARIABLE_VALUE / NULLIF(s2.VARIABLE_VALUE, 0)) * 100, 4) AS 慢查询百分比,
    CASE 
        WHEN (s1.VARIABLE_VALUE / NULLIF(s2.VARIABLE_VALUE, 0)) * 100 > 1 THEN '警告:慢查询比例超过1%'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status s1
JOIN performance_schema.global_status s2 
WHERE s1.VARIABLE_NAME = 'Slow_queries' 
  AND s2.VARIABLE_NAME = 'Queries'
  union all
-- 临时表使用情况
SELECT 
    '临时表使用情况' AS 指标名称,
    s1.VARIABLE_VALUE AS 磁盘临时表数,
    s2.VARIABLE_VALUE AS 总临时表数,
    CASE 
        WHEN s2.VARIABLE_VALUE = 0 THEN 0
        ELSE ROUND((s1.VARIABLE_VALUE / s2.VARIABLE_VALUE) * 100, 2)
    END AS 磁盘临时表百分比,
    CASE 
        WHEN s2.VARIABLE_VALUE = 0 THEN '正常:无临时表'
        WHEN (s1.VARIABLE_VALUE / s2.VARIABLE_VALUE) * 100 > 5 THEN '警告:磁盘临时表超过5%'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status s1
JOIN performance_schema.global_status s2 
WHERE s1.VARIABLE_NAME = 'Created_tmp_disk_tables' 
  AND s2.VARIABLE_NAME = 'Created_tmp_tables'
  
  union all
  
-- InnoDB缓冲池命中率

SELECT 
    'InnoDB缓冲池命中率' AS 指标名称,
    s1.VARIABLE_VALUE AS 逻辑读次数,
    s2.VARIABLE_VALUE AS 物理读次数,
    CASE 
        WHEN (s1.VARIABLE_VALUE + s2.VARIABLE_VALUE) = 0 THEN 0
        ELSE ROUND((1 - s2.VARIABLE_VALUE / (s1.VARIABLE_VALUE + s2.VARIABLE_VALUE)) * 100, 2)
    END AS 命中率百分比,
    CASE 
        WHEN (1 - s2.VARIABLE_VALUE / (s1.VARIABLE_VALUE + s2.VARIABLE_VALUE)) * 100 < 99 THEN '警告:命中率低于99%'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status s1
JOIN performance_schema.global_status s2 
WHERE s1.VARIABLE_NAME = 'Innodb_buffer_pool_read_requests' 
  AND s2.VARIABLE_NAME = 'Innodb_buffer_pool_reads'
  
  union all
  
-- InnoDB缓冲池使用率
##MySQL InnoDB缓冲池是数据库内存中的一块区域,用于缓存最近使用的数据和索引。
##合理地管理InnoDB缓冲池可以显著提高读写性能和响应速度,因为将数据保存在内存中比从磁盘读取要快得多。
##较大的缓冲池可以容纳更多的数据和索引,从而减少磁盘IO操作。通常建议将物理内存的70-80%分配给InnoDB缓冲池。
##为了提高性能,应确保在InnoDB缓冲池中有足够的空闲空间。当缓冲池使用率超过90%时,容易导致数据的频繁淘汰和IO操作增加。

SELECT 
    'InnoDB缓冲池使用率' AS 指标名称,
    FORMAT(s1.VARIABLE_VALUE * @@innodb_page_size / 1024 / 1024, 0) AS 已使用_MB,
    FORMAT(s2.VARIABLE_VALUE * @@innodb_page_size / 1024 / 1024, 0) AS 总大小_MB,
    ROUND((s1.VARIABLE_VALUE / s2.VARIABLE_VALUE) * 100, 2) AS 使用率百分比,
    CASE 
        WHEN (s1.VARIABLE_VALUE / s2.VARIABLE_VALUE) * 100 < 70 THEN '注意:使用率低于70%,可能配置过大'
        WHEN (s1.VARIABLE_VALUE / s2.VARIABLE_VALUE) * 100 > 95 THEN '警告:使用率超过95%'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status s1
JOIN performance_schema.global_status s2 
WHERE s1.VARIABLE_NAME = 'Innodb_buffer_pool_pages_data' 
  AND s2.VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'
  
  union all
  
 -- 锁等待情况
SELECT 
    'InnoDB行锁等待情况' AS 指标名称,
    s1.VARIABLE_VALUE AS 等待次数,
    s2.VARIABLE_VALUE AS 总等待时间_ms,
    CASE 
        WHEN s1.VARIABLE_VALUE = 0 THEN 0
        ELSE ROUND(s2.VARIABLE_VALUE / s1.VARIABLE_VALUE, 2)
    END AS 平均等待时间_ms,
    CASE 
        WHEN s1.VARIABLE_VALUE > 1000 THEN '警告:锁等待次数过多'
        WHEN s2.VARIABLE_VALUE / NULLIF(s1.VARIABLE_VALUE, 0) > 100 THEN '警告:平均等待时间过长'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status s1
JOIN performance_schema.global_status s2 
WHERE s1.VARIABLE_NAME = 'Innodb_row_lock_waits' 
  AND s2.VARIABLE_NAME = 'Innodb_row_lock_time'
  
  union all 
 
-- 表锁情况
SELECT 
    '表锁等待情况' AS 指标名称,
    s1.VARIABLE_VALUE AS 等待的表锁数,
    s2.VARIABLE_VALUE AS 立即获得的表锁数,
    CASE 
        WHEN (s1.VARIABLE_VALUE + s2.VARIABLE_VALUE) = 0 THEN 0
        ELSE ROUND((s1.VARIABLE_VALUE / (s1.VARIABLE_VALUE + s2.VARIABLE_VALUE)) * 100, 4)
    END AS 表锁等待百分比,
    CASE 
        WHEN (s1.VARIABLE_VALUE / (s1.VARIABLE_VALUE + s2.VARIABLE_VALUE)) * 100 > 1 THEN '警告:表锁等待比例过高'
        ELSE '正常'
    END AS 状态
FROM performance_schema.global_status s1
JOIN performance_schema.global_status s2 
WHERE s1.VARIABLE_NAME = 'Table_locks_waited' 
  AND s2.VARIABLE_NAME = 'Table_locks_immediate';
  
 **/
相关推荐
jiunian_cn2 小时前
【Redis】set数据类型相关指令
数据库·redis·缓存
一起养小猫2 小时前
Flutter for OpenHarmony 进阶:Timer组件与倒计时系统深度解析
android·网络·笔记·flutter·json·harmonyos
松涛和鸣2 小时前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
咩咩不吃草2 小时前
Linux环境下MySQL的安装与使用与Navicat
linux·运维·数据库·mysql·navicat
Aloudata2 小时前
NoETL 指标平台如何保障亿级明细查询的秒级响应?——Aloudata CAN 性能压测深度解析
数据库·数据分析·自动化·指标平台
maoku662 小时前
从关键词到语义:向量数据库如何让AI真正理解你的需求
数据库·人工智能
符哥20082 小时前
Fastjson2.X 使用详解
android·java
寻道码路2 小时前
【MCP探索实践】Google GenAI Toolbox:Google开源的企业级AI数据库中间件、5分钟搞定LLM-SQL安全互联
数据库·人工智能·sql·开源·aigc
数据知道2 小时前
PostgreSQL 核心原理:一文掌握 WAL 缓冲区与刷盘策略(性能与数据安全的权衡)
数据库·postgresql