十,数据库 - 348052148/learnGraph GitHub Wiki
mysql
- 一,sql 执行计划 explain
- 作用,用于预算sql执行的效率。
- explain输出字段
- id 查询语句标识
- select_type 查询的类型
- table 当前行所查的表
- partition 匹配分区
- type 访问类型
- possible_keys 查询可能用到的索引
- key mysql决定采用的索引来优化查询
- key_len 索引key的长度
- ref 显示了之前表在key列记录的索引中查找值所用的列或常量
- rows 查询扫描的行数,不一定准确 11 fitered 查询表行占表的百分百
- extra 额外的查询辅助信息
select_type:
- simple 简单的select (不使用union或子查询
- pramary 最外面的select
- union union中第二个或更高的select语句,取决于外部查询
- dependent union union中第二个或更高的select语句,取决于外部查询
- union result union的结果
- subquery 在子查询中首先选择select
- dependent subquery 子查询中第一个select,取决于外部查询
- derived 派生表
- uncacheable subquery 无法缓存结果的子查询
- uncacheable union 咋子union中第二个或更晚的选择属于不可缓存的子查询
type :
- system 表中只有1行数据
- const 确定最多只会匹配一行数据,使用主键查询就是这种情况
- eq_ref 最多返回一条符合条件的记录,通过使用再2个表有关联字段的时候
- fulltext 全文索引
- ref_or_null 和ref一样只不过不能为null
- index_merge 此连接类型表示使用了索引合并优化
- unique_subquery 再使用in查询的情况下取代eq_ref
- range 范围扫描
- index 类似全表扫描
- all 全表扫描

mysql 事务隔离级别
- 读未提交
- 读已提交
- 可重复读
- 可串行化
mysql 事务
A 原子性 C 一致性 I 隔离性 D 持久性
产生的问题
- 脏读 事务1 读到了事务2 还未提交的数据
- 不可重复读 事务1 最开始读到 1,但是 事务2 修改值为 2,并提交,事务 1 再次读取数据,导致事务2次读取数据不一样。 一个事务多次读取某条数据,发现读取的数据不完全相同。(使用快照读。 再事务开始的时候读取固定版本的数据。
- 幻读 事务1 读取到1条数据 事务2 插入1条数据并提交,事务1再次读取 读取到2条数据。 (innodb 利用 临界锁 根据情况会退化为间隙锁 来保证事务读取不可插入。
mysql的2种读
- 快照读 select * from where xxx 这种形式的都是快照读。
- 当前读 update , insert ,delete ,select xx from xx for update , in share mode 都是当前读
mysql中 InnoDB锁的类型
- 排他锁 和 共享锁
- 意向锁
- Next-Key Locks Next-Key锁是索引记录上的记录锁和在索引记录之前的间隙锁的组合。
- 间隙锁 间隙锁要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索引记录后面的值。
- 行锁 (一般主建索引查,和唯一索引查,唯一索引可能线辅助锁定到主键,有2次过程
- 插入意向锁 (和间隙锁类似,锁住要插入数据的范围。不会导致其他并发插入竞争
- 自增锁 (保证并发插入数据时的id自增吧 表锁。
关于间隙锁
- 间隙锁阻止其他事务对间隙数据的并发插入,这样可有有效的解决幻读问题(Phantom Problem)。正因为如此,并不是所有事务隔离级别都使用间隙锁,MySQL InnoDB引擎只有在Repeatable Read(默认)隔离级别才使用间隙锁。
- 间隙锁的作用只是用来阻止其他事务在间隙中插入数据,他不会阻止其他事务拥有同样的的间隙锁。这就意味着,除了insert语句,允许其他SQL语句可以对同样的行加间隙锁而不会被阻塞。
- 对于唯一索引的加锁行为,间隙锁就会失效,此时只有记录锁起作用。
关于锁的文章
锁粒度
- 行锁
- 表锁
- 页锁
myisam 和 innodb 区别
- 主要区别,innodb行锁,极端情况下可能退化为表锁, myisam 表锁。
- myisam不支持外建,不支持事务。
索引相关
myisam 索引和数据分开存,innodb在以前 myisam 非聚集索引,主键和普通索引都是记录行的引用 innodb 聚集索引,主键索引记录行记录。普通索引指向主键 (除主键索引,其他索引都需要查询2次
关于查询索引原理。
- hash
- b+tree
关于查询排序
https://blog.csdn.net/eagle89/article/details/81315981