第二章 表和索引结构
索引页和表页
目前页的大小一般是 32K
或 64K
的。页的大小决定了一个页可以存储多少个索引行、表行,以及一共需要多少个页来存储表或者索引。每个页都会预留一定比例的空闲空间,以满足向其添加新的行。缓冲池和 I/O 活动都是基于页的。
索引行
对于唯一索引,一个索引行等同于叶子页中的一个索引条目。字段值没表中复制到索引上,并加上一个指向表中记录的指针。
对于非唯一索引,一个索引值后带着多个指针,指针指向下一层非叶子页或叶子页,叶子页的指针指向表中的记录。
B 树索引结构
非叶子页包含着一个键值,以及一个指向下一层级页的指针,该键值是下一层级页中的最大键值。多个索引层级按照这一方式逐层建立,直到根页。
(对于非唯一索引)通过这种方式来查找任何一条索引记录都需要访问相同数量的非叶子页。
第三章 SQL 处理过程
谓词是索引设计的主要入手点。
第四章 为 select 语句创建理想的索引
三星索引评定:
- 第一颗星:与查询相关的索引行是相邻的,或者至少相距足够靠近。最小化了必须扫描的索引片的宽度。
- 第二颗星:索引行的顺序与查询语句的需求一致。排除了排序操作。
- 第三颗星:索引行包含查询语句中的所有列。避免了回表。
宽索引:款索引是指一个至少满足了第三颗星的索引。该索引包含了 select 语句所涉及的所有列,因此能够使得查询只需访问索引而无须回表。
第五章 前瞻性的索引设计
基本问题法(BQ):
问题:是否有一个已存在的或计划中的索引包含了 where 子句所引用的所有列(一个半宽索引)?
- 如果答案是否,首先考虑将缺少的所有谓词列添加到一个现有的索引上去。这将产生一个半宽索引,尽管索引的等值匹配过程并不令人满意(一星),但是索引过滤可以确保回表访问只发生在所有查询条件都满足的时候。
- 如果这还没达到足够的性能,那么下一个选择是将所有涉及的列都加到索引上去,以使访问路径只需访问索引。这将产生一个避免所有表访问的宽索引。
- 如果 select 仍然不能满足性能要求,则要设计一个 三星索引。
快速上限评估法(QUBE)
比较值:
LRT = TR * 10ms + TS * 10ms
绝对值:
LRT = TR * 10ms + TS * 0.01ms + F * 0.1ms
LRT = 本地响应时间
TR = 随机访问的数量
TS = 顺序访问的数量
F = 有效 FETCH 的数量
注:上面的毫秒数是根据硬盘转速为 15000 转每分钟计算的。
10ms
的组成为: 排队3ms
+ 寻道4ms
+ 单圈旋转2ms
+ 传输1ms
。
半宽索引、宽索引
-
半宽索引:包含了 where 子句的所有列,能最大化利用索引的列进行过滤;
-
半宽索引:包含了 where/select 子句的所有列,能最大化利用索引的列进行过滤;同时返回的数据就在索引上,不需要回表,只需访问索引。
第六章 影响索引设计过程的因素
-
多个窄片索引:让数据库进行索引扫描合并。
-
困难谓词:让数据库无法进行索引片定义的谓词。比如函数中的谓词、not 函数、 or 连接的多个列的谓词 等。
-
过滤因子隐患:要关注最糟糕的场景。不同过滤因子对结果集的影响非常大,比如不同状态下的数据量级是差别很大的。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。