MySQL相关

索引失效场景

  1. 没有遵循最左原则;
  2. 加了索引的字段进行数学运算或者使用了sql函数或者自动或手动进行了类型转换
  3. 范围之后全失效;比如 a、b、c复合索引 a=x and b>20 and c=x,这样c没有使用到索引
  4. 尽量使用覆盖索引(索引列与查询列一致)减少select *
  5. 使用!= 或者 <> 导致索引失效,扫描全表
  6. is null、is not null导致索引失效,扫描全表
  7. like模糊匹配%xx%,或导致索引失效,但%放在最右边(xx%)可以避免索引失效,如果非要使用%xx%,可以建复合索引,当查询列和索引列匹配时可以避免索引失效,比如 a、b复合索引,select Id / select id, a / select id, a, b / select a / select a, b / select b/ 都能使用到索引,但上面任何一种查询中增加字段 c 就会导致索引失效,select * 也会导致索引失效。(因为没有使用覆盖索引)
  8. 字符串不加单引号导致索引失效

慢SQL

MySQL默认没有开启慢sql日志,查看是否开启:
SHOW VARIABLES LIKE '%slow_query_log%'

在这里插入图片描述

开启命令:
SET GLOBAL slow_query_log = 1;

在这里插入图片描述

开启慢查询日志只对当前数据库生效,MySQL重启后会失效,相当于本此开启了,如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此);
MySQL判定慢查询的为10s,可以通过命令查看:
SHOW VARIABLES LIKE 'LONG_QUERY_TIME%'

在这里插入图片描述

设置慢查询阙值命令:
SET GLOBAL long_query_time = 3;
查询当前系统中有多少条慢查询记录:
SHOW GLOBAL STATUS LIKE '%slow_queries%'

使用show profile进行sql分析

查看状态:
SHOW VARIABLES LIKE 'PROFILING'

在这里插入图片描述

开启命令:
SET profiling = ON
查看最近执行的sql(只保留15条):
SHOW PROFILES;

在这里插入图片描述

诊断sql:
SHOW PROFILE cpu,block io FOR QUERY 75(数字是Query Id)

在这里插入图片描述

分析数据中需要注意的点:

在这里插入图片描述

MySQL 锁

给表加锁命令:
LOCK TABLE student read;(读锁);
LOCK TABLE student WRITE(写锁);
查询哪些表被锁了:
SHOW OPEN TABLES
释放锁:
UNLOCK TABLES

MyISAM引擎下:

在这里插入图片描述

分析表锁定:
SHOW STATUS LIKE 'TABLE%'

在这里插入图片描述

事务

  1. A:原子性
  2. C:一致性
  3. I: 隔离性
  4. D:持久性

并发事务带来的问题

  1. 更新丢失 当一个或多个事务对同一数据做修改时,由于事务之间互相不知道,最后做修改的事务会把之前事务的修改覆盖;解决:当一事务未提交是,另一事务不可访问。
  2. 脏读 当A事务更改但未提交时,B事务读取到了更改未提交的值,并在此基础上做了操作,当A事务回滚B事务读取到的数据无效,不符合数据一致性。
  3. 不可重复读 事务A读取到了事务B已经提交修改的数据,不符合事务的隔离性。
  4. 幻读 事务A读取到了事务B插入的数据,不符合隔离性。

事务的隔离级别

MySQL默认可重复读

在这里插入图片描述

索引失效会导致行锁变表锁

间隙锁

概念:当sql进行范围查找或修改时(where xx > 1 and xx < 6),InnoDB会给符合条件的数据记录的索引项加锁,对于键值在条件范围内但不存在的数据,叫做“间隙”(GAP),假如没有 x = 2这条记录,也会给这条记录加锁,这种锁机制叫做间隙锁(Next-Key锁)。

行锁分析命令

SHOW STATUS LIKE 'innodb_row_lock%'

在这里插入图片描述
在这里插入图片描述

行锁优化建议

  1. 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  2. 合理设计索引,尽量缩小锁的范围
  3. 尽可能较少检索条件,避免间隙锁
  4. 尽量控制事务大小,减少锁定资源量和时间长度 尽可能低级别事务隔离
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值