Sql索引(index)

  • 定义
  • 分类
    • 复合索引特性
      • 复合索引最左特性(原则)
      • 原理
  • 索引及其扫描类型
  • 索引的优缺点
  • 扩展:索引工作原理
    • BTree+索引
    • 怎么判断是否创建索引?
    • 为什么Mysql用B+树做索引而不用B-树或红黑树
      • B树相对于红黑树的区别:
  • 为什么索引快?

定义

索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(额外的存储空间),这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高效的查找算法。这种数据结构就叫做索引。

一般来说索引本身也很大,不可能全部存储在内存中,因此往往以索引文件的形式存放在磁盘中。目前大多数索引都采用BTree树方式构建。

分类

  • 单值索引:一个索引只包括一个列,一个表可以有多个列
  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 复合索引(联合索引):一个索引同时包括多列

复合索引特性

复合索引最左特性(原则)

在Mysql建立复合索引时有最左前缀的原则。当建立一个复合索引(col1,col2,col3)时,实际上建立了三个索引,即(col1)、(col1,col2)、(col1,col2,col3)。

原理

复合索引的结构是B+树,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex。当age或者sex字段缺失时,b+树就不知道第一步该查哪个节点,所以只能把名字name的数据都找到,即索引的最左匹配特性。

索引及其扫描类型

type:

  • ALL 全表扫描,没有优化,最慢的方式
  • index 索引全扫描
  • range 索引范围扫描,常用语<,<=,>=,between等操作
  • ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
  • eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
  • const 当查询是对主键或者唯一键进行精确查询,系统会把匹配行中的其他列作为常数处理
  • null MySQL不访问任何表或索引,直接返回结果
  • System 表只有一条记录(实际中基本不存在这个情况)

性能排行:
System > const > eq_ref > ref > range > index > ALL

possible_keys:

  • 显示可能应用在这张表中的索引

key:

  • 真正使用的索引方式

索引的优缺点

优点:

  • 索引是数据库优化
  • 表的主键会默认自动创建索引
  • 大量降低数据库的IO磁盘读写成本,极大提高了检索速度
  • 索引事先对数据进行了排序,降低查询是数据排序的成本,降低CPU的消耗

缺点:

  • 索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
  • 索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
  • 虽然索引大大提高了查询的速度,但反向影响了增、删、改操作的效率。如表中数据变化之后,会造成索引内容不正确,需要更新索引表信息,如果数据量非常巨大,重新创建索引的时间就大大增加
  • 随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引

扩展:索引工作原理

BTree+索引

  • 浅蓝色: 磁盘块
  • 深蓝色: 数据项
  • 黄色: 数据的指针

真实的数据仅在叶子节点中: 3, 5, 9, 10, 13, 15, 28, 29, 36, 60, 75, 79, 90,99
查找过程: 假如要找29

  • 从树根开始,即先把磁盘块1中内容读到内存中,发生一次IO
  • 确定29在(17,35)之间,锁定磁盘块1中的P2指针
  • 根据P2指针,找到磁盘块3,读取到内存中,发生二次IO
  • 29在(26,30)之间,锁定磁盘块3的P2指针
  • 通过磁盘3的P2指针,将磁盘块8的内容读取到内存中,发生第三次IO
  • 最终找到数据29,查询结束,总共发生三次IO

怎么判断是否创建索引?

创建索引:

  • 主键约束默认建立唯一索引
  • 频繁出现在where查询条件的字段
  • 多表查询中与其它表进行on关联的字段,外键关系
  • 单列索引/复合索引的选择? 高并发下倾向于创建复合索引
  • 查询中经常用来排序的字段
  • 查询中经常用来统计或者分组字段

不创建索引:

  • 频繁更新的字段: 每次更新都会影响索引树
  • where条件查询中用不到的字段
  • 表记录太少
  • 经常增删改的表: 更新了表,索引也得更新才行
  • 注意: 如果一张表中重复的记录非常多,为它建立索引就没有太大意义

为什么Mysql用B+树做索引而不用B-树或红黑树

  • B+树只有叶节点存放数据,其余节点用来索引
  • B-树是每个索引节点都会有Data域

从Mysql(InnoDB)的角度来看,B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。

那么Mysql如何衡量查询效率呢?磁盘IO次数。B-树/B+树的特点就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。这是优点之一。

另一个优点是:B+树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问。在数据库中基于范围的查询是非常频繁的,而B树不支持这样的遍历操作。

B树相对于红黑树的区别:

平衡二叉树AVL 和红黑树基本都是存储在内存中才会使用的数据结构。在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树可以有多个子女,从几十到上千,可以降低树的高度。

同时,数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

为什么索引快?

  • 排序
  • 树形结构,类似二分查找

3层的BTree可以表示上百万的数据,如果上百万条数据,查找只需要三次IO,性能提高将是巨大的,如果没有索引每次查找都要发生一次IO,那么总共就需要百万次的IO,显然成本是非常高的。

SQL索引概念(详解B+树)相关推荐

  1. racle B-Tree和Bitmap索引对比详解

    http://space.itpub.net/13062352/viewspace-614553 oracle B-Tree和Bitmap索引对比详解 B树索引是所有大型关系数据库毕用的技术,也是or ...

  2. 海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解

    前言 表格存储Tablestore是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库.Tablestore在阿里云官网上有各种文档介绍,也发布了很多场景案例文章,这些文 ...

  3. MySQL系列---架构与SQL执行流程详解

    文章目录 1. 背景 2. 架构体系 2.1 架构图 2.2 模块详解 2.3 架构分层 3. 查询SQL语句执行流程 3.1 连接 3.1.1 MySQL支持的通信协议 3.1.2 通信方式 3.2 ...

  4. MySQL索引原理详解

    MySQL索引原理详解 索引的本质 索引的分类 Hash 索引 二叉树 B树(二三树) B+树 主键目录 索引页 索引页的分层 非主键索引 回表 索引的本质 索引的本质是一种排好序的数据结构. 索引的 ...

  5. 【java学习之路】(java框架)004.Mybatis SQL映射文件详解

    02Mybatis SQL映射文件详解 ​ 在之前我们学习了mybatis的全局配置文件,下面我们开始学习mybatis的映射文件,在映射文件中,可以编写以下的顶级元素标签: cache – 该命名空 ...

  6. MySQL 索引失效详解

    MySQL 索引失效详解 一.MySQL索引失效原因汇总 隐式的类型转换,索引失效 查询条件包含or,可能导致索引失效 like通配符可能导致索引失效 查询条件不满足联合索引的最左匹配原则 在索引列上 ...

  7. 组合索引mysql语句_Mysql之组合索引方法详解

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅 ...

  8. mysql 批量导入sql_MySQL高效导入多个.sql文件方法详解

    MySQL有多种方法导入多个.sql文件(里面是sql语句),常用的有两个命令:mysql和source. 但是这两个命令的导入效率差别很大,具体请看最后的比较. (还有sqlimport和LOAD ...

  9. 数据结构可视化与MySQL索引视频详解

    数据结构 必看: 数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html MySQL索引视频详解:https:// ...

  10. R语言生存分析(survival analysis)与生存资料有关的概念详解

    R语言生存分析(survival analysis)与生存资料有关的概念详解 目录 R语言生存分析(survival analysis)与生存资料有关的概念详解 #生存分析

最新文章

  1. zynq 文件系统中加载PL fpga.bit笔记
  2. ncnn源码编译安装
  3. C++文件打开模式详解
  4. 详解get与post请求方式、content-type与responseType、@Requestbody与@Requestparam的使用场景
  5. python中dict函数_dict()函数以及Python中的示例
  6. python django部署docker_centos利用docker部署django项目
  7. iOS linker command failed with exit code 1 (use -v to see invocation)多种解决方案汇总
  8. yii mysql 缓存_yii2优化 - 开启 Schema 缓存
  9. java 与 .net socket_java.net.ServerSocket和java.net.Socket
  10. 团队开发冲刺1.2(2015.5.10)
  11. 泰科推标签即服务服务,助力实现最大价值
  12. 电脑键盘下划线怎么打_电脑键盘失灵鼠标不动怎么办 键盘失灵鼠标不动解决办法...
  13. [转]Delphi的运算符重载
  14. 扇贝有道180925每日一句
  15. 从Xcode中的动态库中剥离不需要的架构 Submit to App Store issues: Unsupported Architecture X86_64, i386
  16. SVN安装及使用教程图文详解
  17. 读书笔记——《电商产品经理-基于人、货、场、内容的产品设计攻略》
  18. Nature拟推出机器智能在线期刊Nature Machine Intelligence
  19. wps中复制公式到另一个文档变成图片,wps怎么调整公式的高度,wps在一页中设置一栏和两栏
  20. 双向晶闸管控制AC220V电机

热门文章

  1. MVN编译Flume1.7源码时出现下载ua-parses-1.3.0 jar包失败
  2. vue移动端获取本地相机和相册
  3. 【Linux】rc.local和rc.d/rc.local的区别|rc.local文件开机不执行
  4. select去重 sqlserver_sqlserver查询去掉重复数据的实现
  5. 计算机网络 - 应用层(学习日志)
  6. NG Toolset开发笔记--5GNR Resource Grid(29)
  7. OWASP top 10漏洞原理及防御(2017版官方)
  8. 【在线研讨-现场文字】《敏捷开发用户故事分类与组织结构(一期-5)》2012-06-26
  9. 【小波能量BP】基于小波能量系数提取和BP神经网络的检测算法matlab仿真
  10. 怎么改vue项目的标题_Vue动态修改网页标题的方法及遇到问题