B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一。索引的数据结构可以是树,也可以是哈希表。常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提。本文旨在梳理各种常见的索引类型,简明扼要地说明它们的区别与联系,不讨论数据结构与算法。话不多说,直接上干货。

索引

数据库只做两件事情:存储数据、检索数据。而索引是在你存储的数据之外,额外保存一些路标(一般是B+树),以减少检索数据的时间。所以索引是主数据衍生的附加结构。

一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合。索引可能会提高查询速度(如果查询时使用了索引),但一定会减慢写入速度,因为每次写入时都需要更新索引,所以索引只应该加在经常需要搜索的列上,不要加在写多读少的列上。

单列索引 与 复合索引

只包含一个字段的索引叫做单列索引,包含两个或以上字段的索引叫做复合索引(或组合索引)。建立复合索引时,字段的顺序极其重要。

下面这个SQL语句在 列X,列Y,列Z 上建立了一个复合索引。

CREATE INDEX 索引名 ON 表名(列名X, 列名Y, 列名Z);
其实这相当于建立了三个索引,分别是:

1、单列索引(列X) 2、复合索引(列X, 列Y) 3、复合索引(列X,列Y,列Z)。

如何理解呢?

我们可以把多个字段组合的索引比喻成一个老式的纸质电话簿,三列分别是:

姓 - 名 - 电话号码

电话簿中的内容先按照姓氏的拼音排序,相同姓氏再按名字的拼音排序,这相当于在(姓,名)上建立了一个复合索引。你可以通过这个索引快速找到所有具有特定姓氏的人的电话号码,也可以快速找到具有特定 姓-名 组合的人的电话号码。然而,想象一下,如果你想找到某个特定名字的人,其实这个索引是没有用的,你只能从头到尾遍历整个电话簿。

唯一索引 与 主键

唯一索引是在表上一个或者多个字段组合建立的索引,这个(或这几个)字段的值组合起来在表中不可以重复。一张表可以建立任意多个唯一索引,但一般只建立一个。

主键是一种特殊的唯一索引,区别在于,唯一索引列允许null值,而主键列不允许为null值。一张表最多建立一个主键,也可以不建立主键。

聚簇索引、非聚簇索引、主键

在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:

聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

怎么理解呢?

聚簇索引的顺序,就是数据在硬盘上的物理顺序。一般情况下主键就是默认的聚簇索引。

一张表只允许存在一个聚簇索引,因为真实数据的物理顺序只能有一种。如果一张表上还没有聚簇索引,为它新创建聚簇索引时,就需要对已有数据重新进行排序,所以对表进行修改速度较慢是聚簇索引的缺点,对于经常更新的列不宜建立聚簇索引。

聚簇索引性能最好,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理地紧跟其后。一张表只能有一个聚簇索引,所以非常珍贵,必须慎重设置,一般要根据这个表最常用的SQL查询方式选择某个(或多个)字段作为聚簇索引(或复合聚簇索引)。

聚簇索引默认是主键,如果表中没有定义主键,InnoDB[1]会选择一个唯一的非空索引代替(“唯一的非空索引”是指列不能出现null值的唯一索引,跟主键性质一样)。如果没有这样的索引,InnoDB会隐式地定义一个主键来作为聚簇索引。

聚簇索引 与 唯一索引

严格来说,聚簇索引不一定是唯一索引,聚簇索引的索引值并不要求是唯一的,唯一聚簇索引才是!在一个有聚簇索引的列上是可以插入两个或多个相同值的,这些相同值在硬盘上的物理排序与聚簇索引的排序相同,仅此而已

索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系相关推荐

  1. oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...

    今天打算删除orcale数据库中无用的表空间,发现报错,查资料删除,写个过程留着备用. 1.drop tablespace dldata INCLUDING CONTENTS CASCADE CONS ...

  2. Oracle 删除表空间错误 提示:ora-02429:无法删除用于强制唯一/主键的索引

    sql>droptablespace xxx ora-01549:表空间非空,请使用INCLUDING CONTENTS 选项 sql>droptablespace xxx INCLUDI ...

  3. Mysql的主键和索引

    关系数据可依赖于主键,主键在物理层面上主要有两个用途: 唯一的标识一行 因为主键可以唯一标识一行记录,所以可以确保执行数据更新.删除的时候不会出现张冠李戴的错误. 作为一个可以被外键引用的对象 一个表 ...

  4. 浅谈mysql的主键和索引

    在上一篇文章<count(1).count(*).count(字段)哪个更靠谱>中,我们提到过主键是优化不了count的查询效率的,需要建索引才可以,那么,是不是意味着主键的效率还不如一般 ...

  5. MySQL 主键和索引

    主键:关系数据可依赖于主键,主键在物理层面上主要有两个用途: 唯一的标识一行 因为主键可以唯一标识一行记录,所以可以确保执行数据更新.删除的时候不会出现张冠李戴的错误. 作为一个可以被外键引用的对象 ...

  6. mysql主键索引_mysql主键与索引

    一.概念: 1.主键(primary key)能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录的 ...

  7. MySQL主键与索引的联系和区别

    关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层上只有两个前途: 唯一地标识一行 作为一个可以被外键有效引用的对象 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分) ...

  8. mysql删除没有索引页_InnoDB中没有主键是如何运转的

    InnoDB聚簇索引的背景 在InnoDB索引页的物理结构中,"我"讲述了"InnoDB中一切都是索引".这意味着每个InnoDB引擎的表必须有一个" ...

  9. 主键和索引哪个快_数据库两大神器【索引和锁】

    前言 只有光头才能变强 索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的. 本文力求简单讲清每个知识点,希望大家看完能有所收获 声明:如果没有说明具体的数据库和存储引擎,默认指 ...

  10. mysql建表语句主键索引_MySQL添加主键、索引

    查看索引 SHOW INDEX FROM  数据库表名 比如:SHOW INDEX FROM order_info; 添加索引 alter table 数据库add index 索引名称(数据库字段名 ...

最新文章

  1. 【工具】音乐播放相关工具,音乐文件格式转换工具,MP3文件转换成arduino可以直接播放的wav格式,MP3转WAV工具...
  2. python运算符讲解_python运算符讲解
  3. android MPV架构快速实现,不是所有的MPV都叫GL8,一体化智能座舱体验来袭
  4. [Swift]LeetCode853. 车队 | Car Fleet
  5. 浏览器是怎么解析JS的代码
  6. Android PdfViewer预览pdf滚动或放大缩小时模糊然后正常的问题
  7. 数据不平衡分类问题 代价矩阵 损失函数
  8. word插入脚注后最后一页多了一个分页符(下一页),导致最后多了一个空白页,删除不掉。
  9. setuptools-scm was unable to detect version for‘…/…/某git包‘
  10. 德律aoi程式制作_AOI入门介绍
  11. win7防火墙入站规则 出站规则 什么意思
  12. springCloud openFeign返回数据转型问题
  13. 分布式高可靠:负载均衡
  14. 审计需要掌握的计算机语言,审计人员应该具备的素质
  15. 3016 质子撞击炮 II
  16. 应用推广工具包Appboy获100万美金种子投资
  17. Antv L7地图可视化
  18. 开源项目之Android-GL(OpenGL 编程)
  19. 电脑桌面云便签怎么开启或关闭显示任务栏?
  20. vue拖动缩放组件(vue-drag-zoom) 增加禁止缩放拖拽功能

热门文章

  1. 字典型列表转化为csv文件格式
  2. 尚硅谷网课笔记 P361-P370
  3. 万年历SQL Server中实现
  4. Python3.6安装 pip安装 BeautifulSoup安装
  5. linux训练python出现killed_linux命令总结(二)
  6. 执行 npm install -g grunt-cli 安装grunt发生错误问题
  7. Spring事务传播特性实例解析(以及如何使用注解形式事务)
  8. 著名小提琴老师林耀基老师去世
  9. Linux超级用户的提示符是,【判断题】Linux超级用户登录后的提示符是 $ ,普通用户登录后的提示符是 #...
  10. H5获取手机GPS定位