摘要:
一、Explain的作用 explain 命令主要用于查看 SQL 语句的执行计划,该命令可以模拟优化器执行 SQL 查询语句,可以帮助我们编写和优化 SQL。那么 explain 具体可以提供哪些信息,帮助我们如何去优化 SQl 的呢? 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些 阅读全文
摘要:
一个好的索引设计,就是尽量让所有查询都以索引查询的形式进行,以提高查询效率。在之前提到过,使用主键查询会直接走聚簇索引,使用复合索引字段查询可能会回表,并且在使用复合索引时尽量遵循 “最左侧原则” ,这样才能大大提高索引的使用率,提高查询效率。 索引排序 前面说的都是在 where 条件中使用索引作 阅读全文
摘要:
索引页 现在我们知道,innodb 会把每个数据页最小主键和所在数据页组成一个主键目录,然后根据主键查找记录时,在主键目录上使用二分法即可快速查找到记录所在的数据页。可是在数据量极大的场景下,数据页数量会极大,然后主键目录也会很大,如果还是使用这种方式也是不可取的。 所以实际上 innodb 会把索 阅读全文
摘要:
数据页的物理存储 数据行是存放在数据页中的,而实际上数据页在磁盘文件中就是一些连续的数据,数据页之间通过两个上下指针连接指向前后数据页的物理地址,形成双向链表。然后数据页中存储的数据行按照主键大小排序存储,每一行数据都保存一个指针指向下一行数据位置,形成单向链表。 数据页的页目录 之前说过,数据页的 阅读全文
摘要:
之前提到过一种导致数据库性能抖动的异常,是由于系统 RAID 磁盘阵列的蓄电池定时充放电,导致 IO 不经过缓存直接写磁盘造成一段时间内数据库性能急剧下降。还有一种情况就是在高并发写的同时查询大量数据导致的性能抖动。 刷盘 如果要修改某条数据,首先要做的是从磁盘加载数据页到 Buffer pool 阅读全文
摘要:
SQL 标准事务隔离级别 SQL 标准中规定了 4 种事务隔离级别,在多事务并发时可以避免一些事务并发问题。 read uncommitted read uncommitted(读未提交):简称 RU 级别,这个隔离级别是不允许脏写发生的,也就是说不允许两个事务在没提交的情况下去更新同一行数据,却允 阅读全文
摘要:
所谓“事务”,一般具有四个属性:原子性、一致性、隔离性、持久性。即一个事务是不可分割的工作单元,一个事务内的操作要么全部成功、要么全部失败。 事务问题 对于一个单线程事务,如果成功就提交,如果失败则回滚。可是 MySQL 的事务是多线程并发的,对于缓存页中的一行数据,可能有多个事务在对其进行修改、查 阅读全文
摘要:
redo log MySQL 在执行增删改时会写入一条日志到 redo log 日志文件中,以保证事务提交后,修改的数据一定不会丢失。因为就算事务提交后,数据库宕机了,MySQL 也能根据 redo log 来恢复宕机前修改的数据,再把数据刷回磁盘。可是为什么不在宕机前直接把修改的数据刷回磁盘呢?因 阅读全文
摘要:
磁盘读写 MySQL 执行增删改查需要读取数据页到 buffer pool ,SQL 执行过程中还会写入日志。读取数据页的操作属于随机读写,操作系统的磁盘 IOPS 和响应延迟直接影响数据库执行 crud 时随机读写的性能。而日志的写操作是基于操作系统磁盘的顺序读写操作,在 redo 日志文件尾部追 阅读全文
摘要:
数据页 数据页实际上是由多个部分组成的,包括文件头、数据页头、最小记录和最大记录、多个数据行、空闲空间、数据页目录、文件尾部。其中数据行中包含了两行伪记录 Infimum 和 Supremum,Infimum(下确界)记录比该页中任何主键值都要小的值,Supremum (上确界)记录比该页中任何主键 阅读全文