数据库
2021-07-22 19:37:39 33 举报
AI智能生成
数据库基本语法,索引以及锁的汇总
作者其他创作
大纲/内容
垂直拆分
水平拆分
分库分表
如果没有索引会锁表
lock in share mode
共享锁
delete update都会自动上排他锁
for update
排他锁
行锁可以避免锁冲突,但是会出现死锁
Innodb的行锁
Myism的表锁
Innodb也支持页锁
锁粒度
在没有通过索引进查询的时候,Innodb使用的是表锁
行锁是针对索引加锁,而不是针对记录加锁,所以如果使用相同的索引键,会出现锁冲突
概要
利用版本号来控制,写之前读取版本号,写之后读取版本号并进行判断
乐观锁
事务A对数据进行写操作时,会加上排他锁,如果数据正在被其他事务update,那么事务A等待或者抛出异常,这个根据业务情景而定
悲观锁
锁思想
Recod Lock
由于主键(聚集)索引或者唯一索引都有唯一性,所以对当前查询语句的查询条件做等值判断,在加排他锁的时候,加的不是间隙锁
如果普通索引,或者主键/唯一索引做范围查询,加的排他锁是间隙锁
主键/唯一索引在做等值查询或者范围查询,查不到内容的时候,会加上间隙锁
Gap Lock
锁住记录本身,还锁住索引之间的间隙
Next-key lock
Innodb行锁的类型
事务A获得主键,等待其他索引
事务B获得其他索引,等待主键
会什么会发生死锁
顺序访问表
加大表的锁粒度
如何避免死锁
数据库相关的锁
确保数据库慢查询状态要开启,设定慢查询的时间,以及慢查询日志地址
查询日志,定位sql
慢查询
使用explain分析优化
索引覆盖
最左前缀法则
主键索引查询
select * from tablename where name like xx% and size = 22 and age = 30
索引下推
change buffer
当通过唯一索引对数据页进行更新时,如果数据页在内存中,就直接更新
如果数据页不在内存中,在不影响数据一致性的前提下,会将更新操作放到change buffer缓冲区中
在下一次遇到读数据页,需要将数据页加载到内存上时,会先执行缓冲区里的更新操作,在进行读,这个步骤叫做merge
change buffer是可持久化的
唯一索引要确保更新的数据的唯一性,所以要先查索引值是否存在,这是读操作,然后再进行更新,这就会将数据页的数据加载到内存中,加载到内存中后,可以直接进行更新操作,所以不需要缓冲区
而普通索引,不需要读数据页,可以直接更新,所以等待数据页进入内存后再更新缓冲区的操作就可
唯一索引和普通索引的区别
优化手段
优点是,减少磁盘的io,,也可以减少读操作占用的内存
怎么优化sql
操作数据库的create, drop, alter, use, show create
where
distinct
gropu by
having
order by
limit
查询语句
sql
原子性
一致性
隔离性
持久化
ACID
事务A读取并改共享数据,还没有写回磁盘,事务B就读取数据,造成脏读
脏读
一个事务对数据多次读取,两次读取之间有其他事务对该数据做了改动,每次都取的数据不一致
不可重复读
事务B对数据进行多次读取,事务A在事务B执行过程中
幻读
解决脏写,脏读
读已提交
解决脏写
读未提交
解决脏写,脏读,不可重复读
可重复读
解决脏写,脏读,不可重复读,幻读
可串行化
隔离级别
事务
创建唯一约束时会创建唯一索引
约束是确保数据的完整性,索引是优化查询效率
子主题
主键和索引的区别
约束和索引
支持事务
支持行锁
索引结构
Innodb
不支持事务
支持表锁
myism
存储引擎
需要避免回表
可以强制走索引,或者删除索引
什么情况下执行器走错索引
主键索引中的叶子节点存放了某一行的整个记录信息
非主键索引,联合索引或者是其他唯一索引叶子节点存放的是主键索引信息
如果根据非主键索引联合索引或者唯一索引,去查询其他不在索引内的字段的值,就会回表
因为查到的是主键索引,再根据主键索引去表中查记录
什么是回表
使用主键查询
或者索引覆盖
如何避免回表
回表
主键是加了唯一性约束的聚集索引
如果不创建聚集索引,也就是主键索引,数据库会自动创建一个隐藏的聚集索引用来物理排序存储
主键索引
聚集索引
创建唯一约束的列,会将该列自动创建成一个唯一索引,但是如果创建唯一索引,不会创建唯一约束
唯一索引
尽量索引覆盖
联合索引
非聚集索引
索引类别
索引
数据库
0 条评论
回复 删除
下一页