今天分析客户的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的数据。而且,索引是有序的(这也是有些时候索引会比表大的一个原因),这样就提高了效率。
以上不是原话,原话记不清啦,是我理解的大概意思!
分享到:
相关推荐
数据库中的索引是一种为了加速数据查询而创建的数据结构,它为表中的字段提供了一种快速访问的方法。在没有索引的情况下,数据库系统执行查询时必须进行全表扫描,即逐行检查直到找到所需数据,这在数据量大时效率极...
6. **索引列是否为参数**:如果索引列是参数形式出现,那么在查询过程中可能无法使用索引。 7. **数据类型转换**:例如将字符型数据与数值型数据进行比较时,Oracle会自动进行类型转换,这可能导致索引无法被利用。...
- **查询性能**:对于单列查询,聚集索引通常比非聚集索引快,因为它直接指向数据行。而对于多列查询,尤其是涉及到联合索引的情况,非聚集索引可能更优。 - **更新性能**:由于聚集索引会影响数据行的物理顺序,...
- **唯一性约束**:本地索引只支持分区内的唯一性,如果要在表上设置唯一性约束,必须包含分区键列。 - **可用性**:相比全局索引,本地索引具有更高的可用性。这是因为对于分区表的操作(如truncate、move或shrink...
Oracle数据库在某些情况下选择不使用索引来查找数据,这一现象与数据库的优化器策略密切相关。Oracle数据库有两种主要的优化器:基于规则的优化器(RBO)和基于代价的优化器(CBO)。RBO遵循固定规则,而CBO自Oracle...
"SQL Server 索引结构及其使用(聚集索引与非聚集索引)" 数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍...
使用RecyclerView自定义目录快速索引
聚集索引的查询速度通常比非聚集索引快,但创建和维护聚集索引可能会对写操作性能产生影响。 **索引模式**则涉及到如何设计和选择合适的索引策略来优化数据库性能。这包括决定哪些列应该被索引,以及选择适合的索引...
在深入探讨之前,我们首先需要理解什么是索引以及其重要性。 ###### 1.1.1 索引是什么 索引(Index)在MySQL中是一种帮助数据库高效获取数据的数据结构。它类似于现实生活中书籍的目录,能够显著提高数据检索的...
LabVIEW 中的数组索引详细讲解 LabVIEW 中的数组索引是指在循环结构中自动完成数组元素的索引或累积的过程。这种能力称为自动索引(Auto-indexing)。在 LabVIEW 中,For 循环中自动索引功能是默认启用的,而 While...
### 知识点:索引的正确使用 ...通过上述内容的学习,我们可以了解到索引在数据库性能优化中的重要作用以及如何正确地管理和使用索引来提高查询效率。希望这些知识能够帮助大家更好地应对实际工作中的挑战。
* 用索引优化向导创建索引:索引优化向导是 SQL Server 2000 提供的新的创建索引工具,使用查询优化器分析工作负荷中的查询任务,向有大量工作负荷的数据库推荐最佳的索引混合方式,以加快数据库的查询。 索引的...
3. **函数操作**: 如果在索引列上使用了函数,比如`SELECT * FROM t WHERE lower(column) = 'value'`,Oracle将不会使用索引,除非你为该函数创建了函数索引。这是因为函数操作改变了原始列的值,使得索引无法直接...
- 非聚焦索引通常比聚焦索引小,因为它只存储键值和指向数据行的指针。 - 适用于那些频繁用作查找条件但不涉及大量连续数据检索的列。 - **应用场景**: - 当需要频繁地根据某个列进行查找时,非聚焦索引可以提供...
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到...
虽然这使得非聚集索引在插入和更新时比聚集索引更快,但查询性能可能会稍逊一筹,特别是在返回大量数据时。 选择使用聚集索引还是非聚集索引应基于具体的业务需求和查询模式。如果表中的某个列具有有限的唯一值,...
摘要 3:使用包含性列以避免大小限制,可以将非键列包含在非聚集索引中,以避免超过当前索引大小的限制(最大键列数为 16,最大索引键大小为 900 字节)。数据库引擎计算索引键列数或索引键大小时,不考虑非键列。 ...
例如,`field1<=10000 AND field1>=0`比`field1>=0 AND field1更有效,因为前者能更快地筛选出满足条件的记录。 - 索引字段顺序应与索引创建时的顺序保持一致。例如,如果有一个`INDEX(a, b, c)`,`WHERE a=... AND...
由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表 120%的附加空间,以存放该表的副本和索引中间页。 聚...
例如,`EXPLAIN`语句可以帮助我们理解查询的执行计划,查看索引是否被正确使用。`ANALYZE TABLE`命令可以更新表的统计信息,帮助优化器做出更好的选择。还可以通过`SHOW INDEX FROM table_name`来查看表的索引情况。...