MySQL实战45讲 (学习笔记三)
2021/10/5 2:11:06
本文主要是介绍MySQL实战45讲 (学习笔记三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
MySQL的事务与索引
- 事务
- 特性
- 事务的启动方式:
- 长事务的危害
- 索引
- 索引分类
- 索引类型:
- 普通索引和主键索引的区别
- 页的内部原理
- 页分裂
- 页合并
- 覆盖索引
- 最左前缀原则
- 索引下推
事务
特性
- 原子性
- 一致性
- 隔离性
- 持久性
事务的启动方式:
- 显式的启动:begin或 start transaction。提交语句为commit,回滚事务语句是rollback
- set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一 个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主 动执行 commit 或 rollback 语句,或者断开连接。
第二种方法可能会导致长事务
可使用commit work and chain 命令提交并开启新事务
长事务的危害
- 长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间
- 长事务会占用锁资源
索引
索引分类
- 单一索引
- 复合索引
- 主键索引
- 唯一性索引
索引类型:
- 主键索引 (叶子节点存的是整行数据)
- 非主键索引 (叶子节点内容是主键的值)
普通索引和主键索引的区别
如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵B+ 树;
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表。
可知,普通索引需要多扫描一棵主键索引树。
页的内部原理
页可以空或者充满,行记录会按照主键顺序来排序。
根据B树的特性,它可以自顶向下遍历,但也可以在各叶子节点水平遍历。因为每个叶子节点都有着一个指向包含下一条(顺序)记录的页的指针。
例如,页#5有指向页#6的指针,页#6有指向前一页(#5)的指针和后一页(#7)的指针
页分裂
页可能填充至100%,在页填满了之后,下一页会继续接管新的记录。
分裂后 上一页存 MERGE_THRESHOLD 容量的数据。在数据挪动的过程中会影响性能。除了性能外,页分裂操作还影响数据页的利用率。原本放在一个页的数据,现在分到两个页中,整体空间利用率降低大约 50%(MERGE_THRESHOLD 参数控制)
页合并
当你删了一行记录时,实际上记录并没有被物理删除,记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。
当相邻两个页由于删除了数据,利用率小于(MERGE_THRESHOLD 默认为50%)之后,会将数据页做合并
覆盖索引
覆盖索引可以减少树的搜索次数,显著提升查询性能
最左前缀原则
使用复合索引的时候,没有使用左侧的列查找,索引失效。
对于模糊查询 以‘%’开头的会造成索引失效
索引下推
以联合索引(name,age)为例
mysql> select * from tuser where name like '张 %' and age=10 and ismale=1;
在 MySQL 5.6 之前,只能从 ID3 开始一个个回表。到主键索引上找出数据行,再对比字段值。
而 MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件(索引字段)的记录,减少回表次数。
这篇关于MySQL实战45讲 (学习笔记三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南