数据库索引技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
聚集索引,表数据按照索引的顺序来存储的。
非聚集索引,表数据存储顺序与索引顺序无关。
Part Three 索引的分类
聚集索引的结构
Part Three 索引的分类
非聚集索引的结构
索引的优点
Part4
Part Four 索引的优点
创建唯一索引,保证数据库表中每一行数据的唯一性
大大加快数据的检索速度,这也是创建索引的最主要的原因 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有
数据库索引技术
毛军军 2017.9
目 录
CONTENT
01 04
B-Tree的介绍
02 05
索引的介绍
03 06
索引的分类
索引的优点
索引的缺点
索引的使用
B-Tree的介绍
Part1
Part One B-Tree的介绍
B-Tree
我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者 B+Tree。例如:MySql、DB2使用的是B+Tree,Oracle、SQLServer及 Sysbase使用的是B-Tree。所以在最开始,简单地介绍一下B-Tree。
B-Tree不同于Binary Tree(二叉树,最多有两个子树),一棵M阶的
B-Tree满足以下条件: 1)每个结点至多有M个孩子; 2)除根结点和叶结点外,其它每个结点至少有M/2个孩子; 3)根结点至少有两个孩子(除非该树仅包含一个结点); 4)所有叶结点在同一层,叶结点不包含任何关键字信息; 5)有K个关键字的非叶结点恰好包含K+1个孩子; 6)对于一个结点,其内部的关键字是从小到大排序的
Part One B-Tree的介绍
上图演示如何生成B-Tree(M=4,依次插入1~6): 从图可见,当我们插入关键字4时,由于原结点已经满了,故进行分裂, 基本按一半的原则进行分裂,然后取出中间的关键字2,升级(这里是成 为根结点)。其它的依类推,就是这样一个大概的过程。
索引的介绍
Part2
Part One B-Tree的介绍
一个简单的B-Tree(M=4)的样例 4 10 16
1
2
3
6
7
9
11
12
15
17
22
36
对于每个结点,主要包含一个关键字数组Key[],一个指针数组(指向儿子)Son[]。 在B-Tree内,查找的流程是:使用顺序查找(数组长度较短时)或折半查找方法查找 Key[]数组,若找到关键字K,则返回该结点的地址及K在Key[]中的位置;否则,可确 定K在某个Key[i]和Key[i+1]之间,则从Son[i]所指的子结点继续查找,直到在某结点 中查找成功;或直至找到叶结点且叶结点中的查找仍不成功时,查找过程失败。
Part Three 索引的分类
1.直接创建索引和间接创建索引 直接创建索引:CREATE INDEX mycolum_index ON table ( mycolum) 间接创建索引:定义主键约束或者唯一性键约束,可以间接创建索引 2.普通索引和唯一性索引
普通索引: CREATE INDEX mycolum_index ON table ( mycolum)
含的数据量比一次能调入内存的数据量大。因此,数据库索引的数据是 存放在磁盘上的,只有被访问的时候才会被部分地调入到内存中。
Part Two 索引的介绍
索引的存储
一条索引记录中包含的基本信息包括:键值(即你定义索 引时指定的所有字段的值)+逻辑指针(指向数据页或者另 一索引页)。
Байду номын сангаас
索引的分类
Part3
Part Two 索引的介绍
索引的概念
索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索 引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要 的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据, 而不必扫描整个数据库。
数据库索引区别于驻留内存的数据结构的地方在于,数据库索引包
Part Six 索引的使用
4.允许为null的列,查询有潜在大坑 单列索引不存null值,复合索引不存全为null的值,如果列允许为 null,可能会得到“不符合预期”的结果集 select * from user where name != 'shenjian' 如果name允许为null,索引不存储null值,结果集中不会包含这些 记录。 所以,请使用not null约束以及默认值。 5.复合索引最左前缀,并不是值SQL语句的where顺序要和复合索 引一致 用户中心建立了(login_name, passwd)的复合索引 select * from user where login_name=? and passwd=? select * from user where passwd=? and login_name=? 都能够命中索引 select * from user where login_name=? 也能命中索引,满足复合索引最左前缀 select * from user where passwd=? 不能命中索引,不满足复合索引最左前缀 6.强制类型转换会全表扫描 select * from user where phone=13800001234
意义
索引的缺点
Part5
Part Five 索引的缺点
索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。 当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速
度。
索引的使用
Part6
Part Six 索引的使用
1.负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好习惯 2.前导模糊查询不能使用索引 select * from order where desc like '%XX' 而非前导模糊查询则可以: select * from order where desc like 'XX%' 3.在属性上进行计算不能命中索引 select * from order where YEAR(date) < = '2017' 即使date上建立了索引,也会全表扫描,可优化为值计算: select * from order where date < = CURDATE() 或者: select * from order where date < = '2017-01-01’
感谢聆听,批评指导
唯一索引:保证在索引列中的全部数据是唯一的 CREATE UNIQUE INDEX mycolum_index ON table ( mycolum)
3.单个索引和复合索引
CREATE INDEX mycolum_index ON table ( col1,col2…) 4.聚集索引和非聚集索引