聚族索引、非聚族索引、组合索引的含义和用途
作者:zhaohuabing 来源:呦呦鹿鸣,食野之芩 发布时间:2010-07-02 21:51:00
在学习和使用各种数据库的过程中,我们常常会遇到聚族索引、非聚族索引、组合索引的概念,这些索引对我们使用数据库,特别是查询的速度的影响是很大的,前几天公司里来了一个sybase的工程师,通过他的讲解,我终于弄清楚了这几个概念的真正含义,觉得虽然问题很小,但收获满大,在这里和大家一起分享一下。
一、什么是索引
索引可以理解为我们小时候使用的汉语字典的索引,如果想在字典中查找一个字,一页一页地翻字典查找是非常慢的,但如果使用字典的索引进行查询,很快就可以查到了。数据库的索引也是类似的。
数据库中的索引一般是按照B树来组织的,叶结点指向真正的数据,B树的定义我这里就不介绍了,有兴趣的话可以去翻翻数据结构的书。
二、聚族索引
在这里还是用字典来进行类比,一般来说汉语字典中有几种索引,如拼音、偏旁、笔画等。字典本身的组织也是排序的,我记得一般是按照拼音排序的。这里的拼音就是聚族索引。也就是说聚族索引的组织顺序和数据本身的组织顺序是一致的,这也解释了数据库中只能定义一个聚族索引的原因,因为数据本身只能按一种方式进行排序。
那聚族索引有什么特别的好处呢,这个好处就是在数据库中执行查找一批数据的语句会比较快,因为数据已经按照聚族索引排好序了,很少的io操作就可以将数据从库中取出。好比你在字典中查找发音从从a到c的汉字,只需要查到a的开始页和c的结束页,中间的所有页都符合查询要求,不用再一页一页地查找。
图1 聚族索引
三、非聚族索引
非聚族索引就好比字典里的偏旁、笔画索引,其索引组织顺序和数据组织顺序不一致,因此非聚族索引可以创建多个。当查找一条数据时,非聚族索引和聚族索引的效率相差不大,但查找一批数据(n)时,非聚族索引需要的io可能是聚族索引的n倍,因为非聚族索引需要一条一条地进行查找。
图2 非聚族索引
四、组合索引
组合索引在索引的key中保存了所有组成该组合索引的字段,但只按第一个字段进行排序。因为索引key中保存的内容增多,因此组合索引需要的空间一般来说比单字段索引大。组合索引的好处是假如你的查询需要返回的数据字段都在组合索引的索引字段中,数据库将不会访问数据页,而直接返回索引中的字段值,可以加快查询速度。假如你的查询不满足这个条件,组合索引就是没有意义的,反而浪费了存储空间。
图3 组合索引
最后出一道小题目,考考大家看懂没有:
假设表中一共有100条数据,索引的B树为三层,查询结果返回50条按照聚族索引排序的数据,不建索引查询、按照聚族索引查询、按照非聚族索引查询所需的io次数各是多少?


猜你喜欢
- 如果你忘记了你的MYSQL的root口令的话,你可以通过下面的过程恢复。1. 向mysqld server 发
- 开篇继上次学习了信号量 semaphore 扩展库的设计思路和实现之后,今天我们继续来看 golang.org/x/sync 包下的另一个经
- 一、背景平时工作中经常需要使用各种尺寸、格式的图片来做测试,每次从百度或者谷歌找图都非常麻烦,于是就想作为一个程序员怎么能被这个问题影响效率
- 阅读上一章:Chapter 8 再谈清单Chapter 9 精简标签先前我们不断提到结构化内容能够把结构与设计细节分类并精简标签,该怎么做呢
- 创建项目和应用django-admin startproject zqxt_views(项目名)cd zqxt_viewspython ma
- 一,uptime 可以查看系统的运行时间show global status like 'uptime';二,利用linux
- 准备工作创建表use [test1]gocreate table [dbo].[student]( [id] [int] ide
- 了解触发器和事件(定时器)什么是触发器?概念: 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一
- jupyter notebook的安装在这里都不赘述可以参考jupyter官网的步骤http://jupyter-notebook.read
- 1.cookie的作用cookie 是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据,就像有些网站上的一些数
- 系统中对Razor的支持包括两部分,其中之一就是自定义RazorViewEngine一、自定义RazorViewEngine在Global.
- 目录一、前言二、方法1、代码2、运行一、前言SpringBoot作为后端开发框架,有强大且方便的处理能力。但是作为一个结合数据分析+前台展示
- cv::Mat 图像格式 (Data Type)命名规则通用的参数命名格式为:CV_{元素比特数}{元素类型}C{通道数}1最常见的 CV_
- Python中的[1:]意思是去掉列表中第一个元素(下标为0),去后面的元素进行操作,以一个示例题为例,用在遍历中统计个数:题:读入N名学生
- 前言昨天因为小程序功能要获取小程序程序码,看了微信文档爬了好多坑。(留一下记录以防后面被坑)操作因为我获取到了微信那里的图片的图片流一直不知
- mysql是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决
- 知识点文件读写基础语法字符串处理字符拼接代码解析导入模块import platformimport stringimport random将
- 本文实例讲述了Python实现的爬取百度贴吧图片功能。分享给大家供大家参考,具体如下:#coding:utf-8import request
- 在写代码过程中我们常常可能会遇到这样一种情况,要对一个list中的每个元素做同样的操作时,两种方法方法一:循环遍历每个元素 话不多说,上代码
- 有时在我们注册账户、登陆系统时,当所有验证通过方可提交 这就需要Jquery来实现表单验证,今天分享给小伙伴们一段基于Jquery实现表单验