Mysql ——区、段、表空间 、碎片区( 三 )


- 该表有多少索引,每个索引对应哪几个字段,该索引对应的根页面在哪个表空间的哪个页面
- 该表有哪些外键,外键对应哪个表的哪些列
- 某个表空间对应文件系统上文件路径是什么
。。。。
上述这些数据并不是我们使用语句插入的用户数据,实际上是为了更好的管理我们这些用户数据而不得已引入的一些额外数据,这些数据也称为 元数据 。存储引擎特意定义了一些列的 内部系统表 ( table)来记录这些这些元数据:
这些系统表也被称为 数据字典,它们都是以 B+ 树的形式保存在系统表空间的某些页面中,其中
这四个表尤其重要,称之为基本系统表 (basic) 。
注意:用户是不能直接访问 的这些内部系统表,除非你直接去解析系统表空间对应文件系统上的文件 。不过考虑到查看这些表的内容可能有助于大家分析问题,所以在系统数据库中提供了一些以 开头的表:
在 数据库中的这些以 开头的表并不是真正的内部系统表(内部系统表就是上边以 SYS 开头的那些表),而是在存储引擎启动时读取这些以 SYS 开头的系统表,然后填充到这些以 开头的表中 。以 开头的表和以SYS 开头的表中的字段并不完全一样,但供大家参考已经足矣 。
附录:数据页加载的三种方式
从磁盘中读取数据的 最小单位 是数据页 。而你想得到的id =xxx的数据,就是这个数据页众多行中的一行对于MySQL存放的数据,逻辑概念上我们称之为表,在磁盘等物理层面而言是按 数据页形式进行存放的,当其加载到MySQL中我们称之为 缓存页 。
如果缓冲池中没有该页数据,那么缓冲池有以下三种读取数据的方式,每种方式的读取效率都是不同的
1.内存读取
如果该数据存在于内存中,基本上执行时间在1ms左右,效率还是很高的 。
2.随机读取
如果数据没有在内存中,就需要在磁盘上对该页进行查找,整体时间预在 10ms 左右,这1ms 中有6ms 是磁盘的实际繁忙时间 (包括了寻道和半圈旋转时间),有 3ms 是对可能发生的排队时间的估计值,另外还有 1ms的传输时间,将页从磁盘服务器缓冲区传输到数据库缓冲区中 。这 10ms 看起来很快,但实际上对于数据库来说消耗的时间已经非常长了,因为这还只是一个页的读取时间 。
3.顺序读取
顺序读取其实是一种批量读取的方式,因为我们请求的 数据在磁盘上往往都是相邻存储的,顺序读取可以帮我们批量读取页面,这样的话,一次性加载到缓冲池中就不需要再对其他页面单独进行磁盘IO操作了 。如果一个磁盘的吞吐量是 40MB/S,那么对于一个16KB 大小的页来说,一次可以顺序读取 2560 (40MB/16KB)个页,相当于个页的读取时间为 0.4ms 。探用批量读取的方式,即使是从磁盘上进行读取,效率也比从内存中只单独读取一个页的效率要高 。