MySQL性能优化

查询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';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值