性能监控工具
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS LIKE 'Uptime';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Innodb_rows_read';
SHOW GLOBAL STATUS LIKE 'Innodb_rows_inserted';
SHOW GLOBAL STATUS LIKE 'Innodb_rows_updated';
SHOW GLOBAL STATUS LIKE 'Innodb_rows_deleted';
SHOW GLOBAL STATUS LIKE 'Com_select';
SHOW GLOBAL STATUS LIKE 'Com_insert';
SHOW GLOBAL STATUS LIKE 'Com_update';
SHOW GLOBAL STATUS LIKE 'Com_delete';
统计sql执行扫描页数
SELECT student_id, class_id, NAME, create_time FROM student_info
WHERE id = 900001;
SHOW STATUS LIKE 'last_query_cost';
SELECT student_id, class_id, NAME, create_time FROM student_info
WHERE id BETWEEN 900001 AND 900100;
SHOW STATUS LIKE 'last_query_cost';
慢查询日志
show GLOBAL variables like 'slow_query_log%'
set global slow_query_log='ON';
show variables like '%long_query_time%';
set global long_query_time = 1
SHOW GLOBAL STATUS LIKE '%Slow_queries%';
[mysqld]
slow_query_log=NO
slow_query_log_file=/var/mysql/slow.log
long_query_time=3
log_output=FILE
查看sql执行成本
show variables like 'profiling';
set profiling = 'ON';
show profiles;
show profile for query 57;
show profile
EXPLAIN ,sql的执行计划, 工具参数说明
参数 | 描述 |
---|
table | 对应几张表 |
id | 每个select 对应一个ID,有时候我们写的子查询优化器直接给我吗优化成对表连接了, ID越大表示越先被执行, ID相同按照顺序执行 |
selectType | 查询中不包含Union 或者 子查询的都叫 Simple; 不相关子查询里面的叫 SubQuery; 相关子查询叫 DEPENDENT SUBQUERY;外面的叫PRIMARY |
type* | system; cons(参数为常量级别, 并且列有唯一索引); eq_ref(多表连接, 被驱动表是主键关联或有索引); ref当一个普通索引与常量查询的时候;index_merge (当两个列都有索引 都为单值索引的时候这两个索引都可以使用到);range (当我们使用 in 或者>< 的时候); index(当我们查询的字段再这个二级索引的时候就是遍历索引, 不用回表就能找到数据); all(全表扫描) |
possible_keys | 可能用到的索引 |
key | 实际用到的索引 |
key_len | 实际用到索引的长度字节, 主要针对联合索引, 越大越好, 列没有非空限制会多加一个字节记录非空状态, 列如果是变长字段会加2个字节记录变长字段列表(最大表示65535 长度 varchar最长为 65535 ) |
ref | 表示查询的参数是什么有 const, func等 |
rows | 预估找到行记录 |
filtered | 根据过滤条件过滤后有多少百分比符合这个条件, 在多表连接中可以看出外部查询记录查询了多少, 预估内部查询需要执行多少次 |
extra | Using index(没有回表查询,直接从索引获得数据很好);Using filesort(没有使用索引的排序性能差) Using temporary(使用临时表了, 非常耗用性能) |
其他工具
- 可以查询到执行计划的成本和详细信息
EXPLAIN FORMAT=JSON SELECT * from table; - 可以使用 Workbench 可以以图形化界面的方式进行sql的查询
- 展示查询优化器优化过后的sql语句
SHOW WARNINGS\G
在使用 EXPLAIN 分析后执行上面的语句可以查看执行优化器优化后的sql语句 - 分析优化器执行计划:trace
SET optimizer_trace="enabled=on",end_markers_in_json=on;
set optimizer_trace_max_mem_size=1000000;
select * from student where id < 10;
select * from information_schema.optimizer_trace\G
select * from sys.schema_redundant_indexes;
select * from sys.schema_unused_indexes;
select index_name,rows_selected,rows_inserted,rows_updated,rows_deleted
from sys.schema_index_statistics where table_schema='dbname' ;
select table_schema,table_name,sum(io_read_requests+io_write_requests) as io from sys.schema_table_statistics group by table_schema,table_name order by io desc;
select object_schema,object_name,allocated,data
from sys.innodb_buffer_stats_by_table order by allocated limit 10;
select * from sys.statements_with_full_table_scans where db='dbname';
select db,exec_count,query from sys.statement_analysis order by exec_count desc;
select db,exec_count,first_seen,last_seen,query
from sys.statements_with_sorting limit 1;
select db,exec_count,tmp_tables,tmp_disk_tables,query
from sys.statement_analysis where tmp_tables>0 or tmp_disk_tables >0 order by (tmp_tables+tmp_disk_tables) desc;
select file,avg_read,avg_write,avg_read+avg_write as avg_io
from sys.io_global_by_file_by_bytes order by avg_read limit 10;
select * from sys.innodb_lock_waits;