今天分析客户的oracle数据库,发现很多表上都建立了复合索引,而SQL的执行计划很多都没有走索引或者都是索引扫,这显然是不对的,通过分析SQL发现,SQL的条件很多都不满足复合索引,也可以说是复合索引简历的不正确,在请教老杨(杨廷琨)之后,使我明白了很久以来一直没有关注过也没仔细思考过的问题,就是我们为什么要用索引,都说用索引会加快数据库的速度,那么为什么会加快速度呢?我想这个问题很多人都会回答因为索引记录了表中的ROWID,所以快,那么在有些情况下,索引的大小甚至比表还大,全扫索引还不如全扫表呢!
经过老杨的细心指点,我才真正的明白、理解、记住(以前曾看过索引的资料,时间长都忘啦)。
老杨问我如果一张表上没有索引,你要查ID=5的记录,数据库会怎么做?
我说数据库会先根据数据字典找到这张表,然后根据表头的记录找到这张表的数据块,然后每个数据块去找。
老杨:会把所有的数据块都扫一遍吗?
我:有可能会,有可能不会。(我回答错啦)
老杨:那么什么时候会全扫?什么时候不全扫?
我:有可能扫第一个块的时候就找到了ID=5的行,就不去扫其他的块啦,也有可能扫到最后的一个块才找到D=5的信息,就全扫啦。
老杨:可能是我问你的问题误导你了,我一说ID=5你就以为ID是主键,那么如果找的不是ID=5而是name=张三的呢?
我:那样会全扫。
老杨:为什么会全扫,可能在找第一个快的时候就找到了name=张三的信息啦。
我:因为name=张三的行有很多重复的。
老杨:这就对啦,如果不用索引,即使是找一条数据库里没有的数据,oracle也会把表的所有块都扫一遍,然后返回结果,索引记录了行的信息,所以有时候我们要用索引。那么用索引为什么会提高性能呢?
老杨:因为索引(以B树索引为例)是树状结构,最上面的是根,根下面是枝,枝再下面是叶,根会记录比如1-20的ID在第一个枝上,21-40在第二个枝上... ... ,这样我们找ID=5的数据,走索引的话,通过扫描根就直接去找第一个枝,通过扫描第一个枝找到所有ID=5的行的ROWID找到所有ID=5的数据。而且,索引是有序的(这也是有些时候索引会比表大的一个原因),这样就提高了效率。
以上不是原话,原话记不清啦,是我理解的大概意思!
分享到:
相关推荐
网络下载:数据库用索引为什么比不用索引更快.htm 索引原理浅析
oracle有时为了加快查找数据的速度,经常使用索引,但有时并不用索引来查找数据
为什么有时ORACLE数据库不用索引来查找数据.doc
使用RecyclerView自定义目录快速索引
oracle 分区索引,本地索引,全局索引的区别
Android 侧边栏快速索引(点击索引、滑动索引),通讯录样式
关于索引的介绍,以及b+树结构图,两种索引性能比较,索引优化建议
SQL Server 索引结构及其使用(聚集索引和非聚集索引)的区别与实例讲解,提高查询速度。
指令快速索引_ARM
快速索引
一、 创建主键(主键=主键索引=聚集索引) 主键是什么? 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能为空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储为: Id=0;username=username0;sex...
创建索引 数据索引 课程目标 理解 —— 创建索引的语法; 掌握 —— 在已有表上创建索引的方法; 掌握 —— 在修改表时添加索引的方法; 掌握 —— 在创建表时创建索引的方法...BLOB或TEXT列必须用前缀索引。 创建索引
android 快速索引demo,让你分分钟学会开发自己的索引demo
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX 或 ALTER TABLE来为表增加索引。 1.ALTER TABLE可以用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。 2.CREATE INDEX可对表增加普通索引或UNIQUE...
漫谈数据库索引漫谈数据库索引漫谈数据库索引漫谈数据库索引
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程
仿电话簿按拼音快速索引界面功能,内含汉字转拼音工具类
3、以删除的叶节点数量:指得是数据行的delete操作从逻辑上删除的索引节点 的数量,要记住oracle在删除数据行后,将 “ 死 “ 节点保留在索引中,这样做可以加快sql删除操作的速度,因此oracle删除数据行后可以不必...
数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录...所以有些时候(如按顺序读取数据)全表扫描会比使用索引快的原因就在于此。