数据库索引与优化 笔记

一、概述

1.索引误区:

索引层级不要超过5层

单表的索引数不要超过6个

不应该索引不稳定的列

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语句所涉及的所有列的索引



 

 



参考博文:https://www.jianshu.com/p/56130d69731c
 

 

 

第 1 页 共 19 页 1 引言 1.1 编写目的 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个 软件生命周期都需要注意, 进行有效工作才能达到的。 所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关 的注意事项。 1.2 分析阶段 一 般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引 了我们大部分的注意力,但是,我们必须注意,性能 是很重要的非功能性需求,必须根据系统的特点确定其实时性需求、 响应时间的需求、硬件的配置等。最好能有各种需求的量化的指标。 另一方面,在分析阶段应该根据各种需求区分出系统的类型,大的方面,区分是 OLTP(联机事务处理系统) OLAP (联机分析处理系统) 。 1.3 设计阶段 设计阶段可以说是以后系统性能的关键阶段, 在这个阶段, 有一个关系到以后几乎所有性能调优的过程—数据库设计。 在数据库设计完成后,可以进行初步的索引设计,好的索引设计可以指导编码阶段写出高效率的代码,为整个系统的 性能打下良好的基础。 以下是性能要求设计阶段需要注意的: 1.3.1 数据库逻辑设计的规范化 数据库逻辑设计的规范化就是我们一般所说的范式,我们可以这样来简单理解范式: 第 1 规范:没有重复的组或多值的列,这是数据库设计的最低要求。 第 2 规范 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分。消除部分依赖,大 部分情况下,数据库设计都应该达到第二范式。 第 3 规范 一个非关键字段不能依赖于另一个非关键字段。 消除传递依赖, 达到第三范式应该是系统中大部分的要求, 除非一些特殊作用的。 更高的范式要求这里就不再作介绍了,个人认为,如果全部达到第二范式,大部分达到第三范式,系统会产生较少的 列较多的,因而减少了数据冗余,也利于性能的提高。 1.3.2 合理的冗余 完全按照规范化设计的系统几乎是不可能的,除非系统特别的小,在规范化设计后,有计划地加入冗余是必要的。 冗余可以是冗余数据库、冗余或者冗余字段,不同粒度的冗余可以起到不同的作用。 冗余可以是为了编程方便而增加,也可以是为了性能的提高而增加。从性能角度来说,冗余数据库可以分散数据库压 力,冗余可以分散数据量大的的并发压力,也可以加快特殊查询的速度,冗余字段可以有效减少数据库的连接, 提高效率。 1.3.3 主键的设计 主键是必要的,SQL SERVER 的主键同时是一个唯一索引,而且在实际应用中,我们往往选择最小的键组合作为主键, 第 2 页 共 19 页 所以主键往往适合作为的聚集索引。聚集索引对查询的影响是比较大的,这个在下面索引的叙述。 在有多个键的,主键的选择也比较重要,一般选择总的长度小的键,小的键的比较速度快,同时小的键可以使主键 的 B 树结构的层次更少。 主键的选择还要注意组合主键的字段次序,对于组合主键来说,不同的字段次序的主键的性能差别可能会很大,一般 应该选择重复率低、单独或者组合查询可能性大的字段放在前面。 1.3.4 外键的设计 外键作为数据库对象,很多人认为麻烦而不用,实际上,外键在大部分情况下是很有用的,理由是: 外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK 约束、规则约束、触发器、客 户端程序,一般认为,离数据越近的方法效率越高。 谨慎使用级联删除级联更新,级联删除级联更新作为 SQL SERVER 2000 当年的新功能,在 2005 作 了保留, 应该有其可用之处。我这里说的谨慎,是因为级联删除级联更新有些突破了传统的关于外键的定义,功能有点 太过强大,使用前必须确定自己已经把握好 其功能范围,否则,级联删除级联更新可能让你的数据莫名其妙 的被修改或者丢失。从性能看级联删除级联更新是比其他方法更高效的方法。 1.3.5 字段的设计 字段是数据库最基本的单位,其设计对性能的影响是很大的。需要注意如下: 数据类型尽量用数字型,数字型的比较比字符型的快很多。 数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。 尽量不要允许 NULL,除非必要,可以用 NOT NULL+DEFAULT 代替。 少用 TEXT IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。 自增字段要慎用,不利于数据迁移。 1.3.6 数据库物理存储环境的设计 在设计阶段,可以对数据库的物理存储、操作系统环境、网络环境进行必要的设计,使得我们的系统在将来能适应比 较多的用户并发比较大的数据量。 这里需要注意文件组的作用,适用文件组可以有效把 IO 操作分散到不同的物理硬盘,提高并发能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值