查询SQL语句执行频率
show global status like 'Com_%';
能够查看整个数据库中执行的SQL次数,如增删查改、创库创表等
慢查询日志
慢查询日志是由MySQL提供的慢SQL日志,如果一个SQL执行超过指定时间,那么这个SQL会被记录在慢查询日志之中,慢查询日志默认是关闭的,可以通过以下指令即可查看是否打开慢查询日志。
#查看慢查询日志开关 show variables like 'slow_query_log';
如果返回的值为ON,表示慢查询日志已开启;如果返回的值为OFF,表示慢查询日志未开启。
如果没有开启需要在my.ini配置文件中添加配置
# 开启慢查询日志 slow_query_log = 1 # 慢查询日志文件位置 slow_query_log_file = "C:\Program Files\MySQL\MySQL Server 8.0/Data/mysql_slow.log" # 慢查询时间 long_query_time = 2
profile性能分析
#查看是否开启性能分析 select @@profiling;
#开启性能分析 set session profiling = 1;
#关闭性能分析 set session profiling = 0;
#查看性能分析 show profiles;
数据评估
1. 索引选择性(Index Selectivity)
索引选择性是指索引列中不同值的数量与表中总行数的比率。选择性越高(即索引列中不同值越多),索引的效率通常越高。
如果一个字段的值大部分是相同的(例如,
name IS NULL
的数据占比很高),那么这个字段的选择性就比较低。在这种情况下,MySQL可能会认为使用索引的代价比全表扫描更高,从而选择全表扫描。2. 关于
NULL
值的索引处理
在MySQL中,
NULL
值是特殊的。对于B树索引,NULL
值会被存储在索引中,但它们的处理方式可能与普通值不同。如果一个字段中
NULL
值的数量非常多(例如超过70%),MySQL可能会认为使用索引进行过滤的效率不如直接扫描全表。因为索引的过滤效果很差,扫描索引的成本可能与扫描全表的成本相当甚至更高。
索引提示
当联合索引和单列索引都存在的时候,查询多索引列的时候,MySQL可能不会走联合索引,而是在单列索引中选择一个,从而造成回表查询,而解决方案就是告诉MySQL我需要用哪个索引。
这里我创建了用户和密码的单列索引和联合索引,先看一下不指定索引MySQL会怎么选择
通过explain关键字查看,发现可能会用到的索引有三个,而实际用的索引只有idx_name,所以拿不到password从而回表查询
explain select * from user where username = 'Jack' and password = '$2a$10$6ptTq3V9XfaJmFYwYT2W9ud377BUkEWk.whf.iQ.0sX5F.L497rAC';
为了解决回表,我应该指定索引
explain select * from user use index (idx_name_age) where username = 'Jack' and password = '$2a$10$6ptTq3V9XfaJmFYwYT2W9ud377BUkEWk.whf.iQ.0sX5F.L497rAC';
MySQL性能优化
于 2025-03-12 20:49:22 首次发布