一、概述 1.索引误区:
2.在当前磁盘条件下,只有在更新频率多于10次/秒的情况下,不稳定列才可能成为问题 二、表和索引结构 1.表和索引行都被存储在页中,页的大小一般为4KB,缓冲池和I/O活动都是基于页的 2.索引行在评估访问路径的时候是一个非常有用的概念,一个索引行等同于叶子页中的一个索引条目,字段的值从表中复制到索引上,并加上一个指向表中记录的指针 3.非叶子页通常包含着一个(可能被截断的)键值,以及一个指向下一层级页的指针,该键值是下一层级页中的最大键值,多个索引层级按照这一方式逐层建立,直到只剩下一个页,这种组织方式的索引称为B树索引 4.内存中的缓冲池进行最小化磁盘活动,如果一个索引或者表页在缓冲池中被找到,那么唯一的成本就是去处理这些索引或者表的记录,当一个索引或表页被请求时,它的理想位置是在数据库缓冲池中 5.辅助式随机读:自动跳跃式顺序读(DB2)、列表预读(DB2)、数据块预读(oracle) 6.聚簇索引是指定义了新插入的表行所在表页的索引 三、SQL处理过程 1.访问路径的成本很大程度上取决于索引片的厚度,即条件表达式确定的值域范围 四、为SELECT语句创建理想的索引 1.使用不合适的索引有可能会导致比全表扫描更差的性能 2.三星索引:
3.ORDERBY和范围谓词同时存在不得不牺牲第一或第二颗星 五、前瞻性的索引设计 1.基本问题法(BQ):是否有一个已存在的或者计划中的索引包含了WHERE子句所引用的所有列(一个半宽索引)? 2.BQ的目的只是确保我们至少可以通过索引过滤来最小化对表的访问 3.快递上限估算法(QUBE),在新方案的设计过程中使用 六、影响索引设计过程的因素 七、被动式索引设计 八、为表连接设置索引 1.嵌套循环连接,DBMS首先在外层表中找到一行满足本地谓词的记录,然后再从内层表中查找与这一行数据相关的记录,并检查其中哪些符合内层表的本地谓词条件,可以被两个单表的游标以及在程序中编写的嵌套循环代替。另外还有哈希连接和合并扫描连接 2.通过冗余数据优化连接查询 九、星型连接 十、多索引访问 十一、索引和索引重组 1.当在表中插入一行数据时,DBMS会尝试将索引行添加至其索引键所属的叶子页上,但是该索引页可能没有足够的空闲空间来存放这个索引行,在这种情况下,DBMS将会分裂该叶子页 2.分裂一个索引页只需要一次额外的同步读,约10ms,叶子页分裂会导致读一个索引片变得更慢 3.索引重组是为了恢复索引行正确的物理位置,它对于索引片扫描和全索引扫描的性能而言很重要 十二、数据库管理系统相关的索引限制 十三、数据库索引选项 十四、优化器不是完美的 1.完全避免由索引改进导致性能下降的唯一方法是,对每一个SQL调用都使用提示 十五、其他评估事项 十六、组织索引设计过程 半宽索引:一个包含WHERE子句中所有列的索引,使用半宽索引将使得访问路径仅在必要时才访问表 聚焦索引:在SQL Server中是指一个包含表行的索引,在DB2中是指任何一个索引行顺序与表行顺序相同或计划相同的索引 聚簇索引:使得DBMS在向表中添加记录时,将新记录添加至由聚簇索引键所定义的主页上。一张表上只能有一个聚簇索引 覆盖索引:指一个包含了SELECT语句所涉及的所有列的索引 |
|