三. 深入索引全局锁表锁行锁
DML
: Data Manipulation Language(数据操纵语言) 增删改数据DDL
: Data Definition Language(数据定义语言) 加字段等 修改表结构的操作
1. 索引
-
数据库的底层存储的核心是基于数据模型,从理论上分析这个数据库的适用场景,这个数据库.用
N叉树
的原因是减少访问磁盘数据块,树中的“N”取决于数据块的大小。 -
每一个索引在
InnoDB
里面对应一棵B+树
。-
主键索引的叶子节点存的是整行数据。在
InnoDB
里, 主键索引也被称为聚簇索引(clustered index)。 -
非主键索引的叶子节点内容是主键的值。在
InnoDB
里, 非主键索引也被称为二级索引(secondary index)。基于主键索引和普通索引的查询有什么区别?
- 如果语句是 select * from T where ID=500, 即主键查询方式, 则只需要搜索 ID 这棵 B+ 树;
- 如果语句是 select * from T where k=5, 即普通索引查询方式, 则需要先搜索 k 索引树, 得到 ID 的值为 500, 再到 ID 索引树搜索一次。这个过程称为回表。
-
覆盖索引: 索引 k 已经“覆盖了”我们的查询需求, 由于覆盖索引可以减少树的搜索次数, 显著提升查询性能, 所以使用覆盖索引是一个常用的性能优化手段
-
最左前缀原则,不只是索引的全部定义,只要满足最左前缀.
- 第一原则是, 如果通过调整顺序, 可以少维护一个索引, 那么这个顺序往往就是需要优先考虑采用的.(当已经有了 (a,b) 这个联合索引后, 一般就不需要单独在 a 上建立索引了)
- 考虑的原则就是空间.
-
索引下推优化: 可以在索引遍历过程中, 对索引中包含的字段先做判断, 直接过滤掉不满足条件的记录, 减少回表次数。
页分裂: 主要是插入一条新记录时, 所在的页数据已经满了, 需要新申请新的数据页,然后挪动部份数据过去. 不仅影响性能,还影响页的利用率.
页分裂逆过程: 当相邻两个页由于删除了数据, 利用率很低后, 会将数据页做合并.
NOTE: 主键顺序递增能有效的防止页分裂.
-