`
- 浏览:
17056 次
- 性别:
- 来自:
上海
-
今天,我在一个java群和别人讨论对索引的理解问题。
大家说了半天我都无法理解他们在说什么。
我还在网上查看了很多关于索引的定义,
但都是太笼统没有比喻也没有具体的例子。
最后我只能说出我对索引的理解。
我个人定义索引是:一个已经按照一定规则排序好的数据结构或数据集。
下面举例
例子1:
现在有一张表,里面有10W行数据,其中有一个列,列的名字叫name,数据类型为字符串
现在要查询一个name为tom的,好,现在在name上建立一个数据库默认的索引。
我相信,大多数数据库对字符串类型的列,默认都是按字母升序排列的。
首先查看了一下第一个有tom的这行数据出现在表的第38511行
建立索引后按照我原先的简单按字母升序排序,第一个出现有tom的这行数据排列到了85536行
如果按照这个索引结构来查询第一个出现tom的话还比没有建立这个索引时要慢,原因很简单。
查询时的数据集发生了改变,原来一行行找下来要找38511次,现在按照这个索引结构找下来要85536次
但默认的索引结构也许不是这样的。也许它套用了一个树结构,这个树也许就2层
第一层是按字符串首字母升序排序好的单个字母a,b,c,d,e,f,g,h....,(其中也许字母x没有,这也是有可能的)
第二层是按字符串首字母归类好的数据集合,并且每个集合按字母升序也是排序好的。
那么查询tom的时候,检查到tom是在第一层树的第20字母上,也就是t,查询这一层只花了20次比较
然后在第二层的以T字母开头排序好的数据集中发现tom在这个数据集的第16行。
那么按照这个索引结构查询name为tom的数据行最快的只要比较20+16次就可以找到第一个符合的数据
但如果tom这行数据在表里就排在第10行,那么按照上面的索引结构搜索找到所花的时间还要长。
例子2:
现在有一张表,里面有10W行数据,其中有一个列,列的名字叫id,类型整数,
现在要查询一个id为83111的。现在在id上建立一个数据库默认的索引
我相信,大多数数据库对默认的整数类型的列,都是按数字升序排列的。
首先查看了一下第一个有83111的这行数据排列在83111行
建立索引后按照原先的简单按数字升序排序,第一个出现有83111的这行数据还是出现在表的第83111行
如果按照这个索引结构来查询第一个出现id为83111的话和没有建立这个索引时一样的速度。原因还是很简单。
查询时的数据集和表集是一样的。
但默认的索引结构也许不是这样的,也许它套用了一个树结构,这个树也许就2层
第一层每个支点为,>=0 & <= 9999, >=10000 & <= 19999, 这样一直下去,
节点的最大一个范围取决于id最大的一个数它所在的那个范围。
第二层是在某一个范围内已经按数字升序排列好的数据集。
那么查找83111这个id,先比较第一层的范围,发现83111在,>=80000 & <=89999 中,第一层比较了9次,
然后在这个范围内在查找83111,发现在3112行,也就是比较了3112次
最后找到这个数总共才花了3112+9次的比较。
通过举例终于可以理解为什么要建立索引,和建立索引的优点和缺点。
看来建立索引要有很强的排序算法支持。
不知道大家看懂了吗,同意我个人对索引的定义吗?
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
关于数据库索引的理解(实践总结) 关于复合索引,非复合索引的效率问题!
一、 创建主键(主键=主键索引=聚集索引) 主键是什么? 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能为空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储为: Id=0;username=username0;sex...
实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
对于我们初学者来说,索引器理解起来
理解 —— 创建索引的语法; 掌握 —— 在已有表上创建索引的方法; 掌握 —— 在修改表时添加索引的方法; 掌握 —— 在创建表时创建索引的方法。 创建索引 使用CREATE INDEX语句创建索引 使用CREATE INDEX语句可以...
1、索引重建是否有必要,一般看索引是否倾斜的严重,是否浪费了空间, 那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间, 对索引进行结构分析(如下): SQL>Analyze index index_name validate ...
理解 ——索引的概念及作用; 索引概述 索引的概念 索引是一个单独的、物理的数据库结构,是某个表中一列或者若干列的集合以及相应的标识这些值所在的数据页的逻辑指针清单。 索引是依赖于表建立的,提供了数据库中...
以及表和索引的扫描方式,详尽地讲解了如何快速地估算SQL 运行的CPU 时间及执行时间,帮助读者从原理上理解SQL、表及索引结构、访问方式等对关系型数据库造成的影响,并能够运用量化的方法进行判断和优化,指导关系...
深入理解Mysql索引底层数据结构与算法.ppt
BAT面试深入理解Mysql索引底层数据结构与算法_1
BAT面试_深入理解Mysql索引底层数据结构与算法_4
整理了一下郭红俊大哥的关于SQL索引的10篇基础知识,...5.理解newid()和newsequentialid() 6.索引的代价,使用场景 7.Indexing for AND 8.数据基本格式补充 9.Indexing for OR 10.Joins 时的三种算法简介档,方便查询.
Elasticsearch-深入理解索引原理
《数据库索引设计与优化》提供了一种简单、高效、通用的关系型数据库索引设计方法。...希望爱学习的小伙伴,一起奋发进步,希望开发小伙伴能够更深层次的理解和了解索引, 合理利用索引来高效服务于我们系统。
诸葛_BAT面试_深入理解Mysql索引底层数据结构与算法_3
实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们...