十,数据库 - 348052148/learnGraph GitHub Wiki

mysql

  • 一,sql 执行计划 explain
  • 作用,用于预算sql执行的效率。
  • explain输出字段
  1. id 查询语句标识
  2. select_type 查询的类型
  3. table 当前行所查的表
  4. partition 匹配分区
  5. type 访问类型
  6. possible_keys 查询可能用到的索引
  7. key mysql决定采用的索引来优化查询
  8. key_len 索引key的长度
  9. ref 显示了之前表在key列记录的索引中查找值所用的列或常量
  10. rows 查询扫描的行数,不一定准确 11 fitered 查询表行占表的百分百
  11. 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 事务隔离级别

  • 读未提交
  • 读已提交
  • 可重复读
  • 可串行化

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锁的类型

  1. 排他锁 和 共享锁
  2. 意向锁
  3. Next-Key Locks Next-Key锁是索引记录上的记录锁和在索引记录之前的间隙锁的组合。
  4. 间隙锁 间隙锁要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索引记录后面的值。
  5. 行锁 (一般主建索引查,和唯一索引查,唯一索引可能线辅助锁定到主键,有2次过程
  6. 插入意向锁 (和间隙锁类似,锁住要插入数据的范围。不会导致其他并发插入竞争
  7. 自增锁 (保证并发插入数据时的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

mongodb