MySQL常用易忘个人总结
1。每一页大小为16K
1G大概10亿个比特
explain :
key 所用到的索引
row 这次查询所扫描的行数(时机上为内循环数)
type:连接类型
mysql的锁
根本上上是要保证加锁的顺序。
InnoDB做了死锁预防的策略:持有事务锁(行锁、表锁),可以等待获取页面锁;但反之,持有页面锁,不能等待持有事务锁。根据死锁预防策略,在持有页面锁,加行锁的时候,如果行锁需要等待。则释放页面锁,然后等待行锁。此时,行锁获取没有任何锁保护,因此加上行锁之后,记录可能已经被并发修改。
————————————————
版权声明:本文为CSDN博主「weixin_39608680」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39608680/article/details/113126180
in/not in exists/not exists 区别?,是否走索引?
in与exists的区别:
- not in 要保证子查询的匹配字段是非空的,否则会导致not in返回整个结果集为空
- 语法不同
not in 的快速扫描全表也就比遍历快一点。使用 left join 或 not exists 来优化 not in 操作
因为insert语句对于主键来说,插入的行不管有没有存在,都会只有行锁。
insert...on duplicate key update...
防止互相gap导致的死锁
多个索引冲突的时候只有一个数据修改
行级锁不是锁记录,而是锁索引。
如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引
重构索引:
如果频繁的删除导致数据过于稀疏
用declear命令看扫描粒度
rebuild
with [名字] as ( select... ) :定义一个sql语句片段
over关键字:over(partition by columnname1 order by columnname2),不能单独使用,要跟四个排序函数一起使用
一、ROW_NUMBER():序号 连续 不重复
二、rank():要求排序的值相同的归为一组且每组序号一样,排序不会连续执行
三、dense_rank(): 排序是连续的,也会把相同的值分为一组且每组排序号一样(可以和rank()对比记)
四、ntile():Ntile(group_num) 将所有记录分成group_num个组,每组序号一样