网站建设与维护难不难,服务器主机如何搭建wordpress,建设局网站招聘,中文wordpress企业表空间中的页实在是太多了#xff0c;为了更好的管理这些页面#xff0c;设计 InnoDB 的大叔们提出了 区 #xff08;英文名#xff1a; extent #xff09;的概念。对于16KB的页来说#xff0c;连续的64个页就是一个 区 #xff0c;也就是说一个区默认占用1MB空间大小。…
表空间中的页实在是太多了为了更好的管理这些页面设计 InnoDB 的大叔们提出了 区 英文名 extent 的概念。对于16KB的页来说连续的64个页就是一个 区 也就是说一个区默认占用1MB空间大小。不论是系统表空间还是独立表空间都可以看成是由若干个区组成的每256个区被划分成一组。画个图表示就是这样 其中 extent 0 ~ extent 255 这256个区算是第一个组 extent 256 ~ extent 511 这256个区算是第二个 组 extent 512 ~ extent 767 这256个区算是第三个组上图中并未画全第三个组全部的区请自行脑补依此类推可以划分更多的组。这些组的头几个页面的类型都是类似的就像这样 02.
为啥好端端的提出一个 区 extent 的概念呢我们以前分析问题的套路都是这样的表中的记录存储到页里边儿然后页作为节点组成 B 树这个 B 树就是索引然后吧啦吧啦一堆聚簇索引和二级索引的区别。这套路也没啥不妥的呀
是的如果我们表中数据量很少的话比如说你的表中只有几十条、几百条数据的话的确用不到 区 的概念因为简单的几个页就能把对应的数据存储起来但是你架不住表里的记录越来越多呀。 啥表里的记录多了又怎样
B 树的每一层中的页都会形成一个双向链表呀 File Header 中的FIL_PAGE_PREV 和 FIL_PAGE_NEXT 字段不就是为了形成双向链表设置的么是的是的您说的都对从理论上说不引入 区 的概念只使用 页 的概念对存储引擎的运行并没啥影响但是我们来考虑一下下边这个场景 我们每向表中插入一条记录本质上就是向该表的聚簇索引以及所有二级索引代表的 B 树的节点中插入数据。而 B 树的每一层中的页都会形成一个双向链表如果是以 页 为单位来分配存储空间的话双向链表相邻的两个页之间的物理位置可能离得非常远。我们介绍 B 树索引的适用场景的时候特别提到范围查询只需要定位到最左边的记录和最右边的记录然后沿着双向链表一直扫描就可以了而如果链表中相邻的两个页物理位置离得非常远就是所谓的 随机I/O 。再一次强调磁盘的速度和内存的速度差了好几个数量级 随机I/O 是非常慢的所以我们应该尽量让链表中相邻的页的物理位置也相邻这样进行范围查询的时候才可以使用所谓的 顺序I/O 。 所以所以所以才引入了 区 extent 的概念一个区就是在物理位置上连续的64个页。在表中数据量大的时候为某个索引分配空间的时候就不再按照页为单位分配了而是按照 区 为单位分配甚至在表中的数据十分非常特别多的时候可以一次性分配多个连续的区。虽然可能造成一点点空间的浪费数据不足填充满整个区但是从性能角度看可以消除很多的随机 I/O 功大于过嘛