为什么用了索引之后,查询就会变快?

相信很多程序员朋友对数据的索引并不陌生,最常见的索引是 B+ Tree 索引,索引可以加快数据库的检索速度,但是会降低新增、修改、删除操作的速度,一些错误的写法会导致索引失效等等。

但是如果被问到,为什么用了索引之后,查询就会变快?B+ Tree 索引的原理是什么?这时候很多人可能就不知道了,今天我就以 MySQL 的 InnoDB 引擎为例,讲一讲 B+ Tree 索引的原理。

索引的基础知识

MySQL 的基本存储结构是页,大概就是这个样子的:

在这里,我们需要了解以下几点(非常重要):

  • 当我们用 MySQL 的 InnoDB 引擎创建表,有且只能有一个主键;如果我们没有显示地指定之间,那么MySQL 会自动生成一个隐含字段作为主键;
  • 聚集索引:以主键创建的索引;聚集索引的叶子节点存储的是表中的数据;
  • 非聚集索引:非主键创建的索引;非聚集索引在叶子节点存储的是主键和索引列;使用非聚集索引查询数据,会查询到叶子上的主键,再根据主键查到数据(这个过程叫做回表)。

页和页之间、页和数据之间的关系

我们以聚集索引做讲解,页和页之间、以及页和数据之间的关系是这样的:

  • 数据页和数据页之间,组成一个双向链表;
  • 每个数据页中的记录,是一个单向链表;
  • 每个数据页都根据内部的记录生成一个页目录(Page directory),如果是主键的话,可以在页目录中使用二分法快速定位;
  • 如果我们根据一个非主键、非索引列进行查询,那么需要遍历双向链表,找到所在的页;再遍历页内的单向链表;如果表内数据很大的话,这样的查询就会很慢。

B+ Tree 索引的原理

先让我们看看 B+ Tree 索引大概是什么样子(以聚集/主键索引为例):

  • 假如这时候我们要查询 id = 16 的数据:
  • 查询页-1,找到页-2 存储的是小于 30 的数据;
  • 查询页-2,找到页-5 存储的是 10~20 的数据;
  • 查询页-5,找到 id = 16 的数据。

很显然,没有用索引的时候,需要遍历双向链表来定位对应的页,而有了索引,则可以通过一层层“目录”定位到对应的页上。

为什么 B+ Tree 索引会降低新增、修改、删除的速度

  • B+ Tree 是一颗平衡树,如果对这颗树新增、修改、删除的话,会破坏它的原有结构;
  • 我们在做数据新增、修改、删除的时候,需要花额外的时间去维护索引;
  • 正因为这些额外的开销,导致索引会降低新增、修改、删除的速度。

mysql 创建聚集索引_索引为什么会加快Mysql的查询速度?相关推荐

  1. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  2. 找到符合条件的索引_高频面试题:MySQL联合索引的最左前缀匹配原则

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...

  3. mysql创建唯一性降序索引_MySQL 8 新特性之降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c, ...

  4. mongo 创建索引_索引系列:2dsphere索引

    MongoDB Manual (Version 4.2)> Indexes > 2dsphere Indexes No 1 概述 2dsphere索引支持计算类似地球的球体上的几何形状的查 ...

  5. mysql支持非关系_说下oracle、mysql、非关系型数据库中的索引结构?

    谢邀~~树懒君悉心整理了一篇索引结构方面的内容,跟各位知友分享分享~ Oracle 索引的数据结构:B-TreeOracle 数据库使用 B-trees 存储索引,来加速数据访问.若没有索引,你必须顺 ...

  6. solr mysql 增量索引_基于Solr DIH实现MySQL表数据全量索引和增量索引

    实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单 ...

  7. 行存储索引改换成列存储索引_索引策略–第2部分–内存优化表和列存储索引

    行存储索引改换成列存储索引 In the first part we started discussion about choosing the right table structure and d ...

  8. mysql创建文章表_创建表--文章表article

    建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 `字段名`  数据类型  数据属性 数据属性: 1. 无符号 unsigned(非负限定 ,即不能取负值) 取值范围 0–255: 2 ...

  9. mysql创建触发器难题_[]MYSQL创建触发器遇到很奇怪的有关问题

    [求助]mysql创建触发器遇到很奇怪的问题. 今天遇到一个很奇怪的问题,是关于创建触发器的.创建触发器代码如下 SQL code create trigger trigger_t_test_U af ...

最新文章

  1. debian10 nfs简单搭建
  2. python基础系列教程——python所有包库的下载
  3. pat 乙级 1004 成绩排名(C++)
  4. java private 命名_java private关键字用法实例
  5. 前端解决跨域的九种方法
  6. RelativeLayout相对布局
  7. 全面接触PDF:最好用的PDF软件汇总(2010-12-07更新)
  8. xshell添加vbs脚本
  9. Vuejs vm对象详解
  10. 如何注册电子邮箱账号,教你创建email邮箱账号
  11. DirectX11 交换链是什么
  12. 绝对高效实现! 给你一个包含n个整数的数组nums,判断nums是否存在三个元素a,b,c使得a+b+c =0...
  13. 这家200多年历史的中华老字号,是如何赢得今年快手中秋月饼品牌冠军的?
  14. gamemaker studio socket例子
  15. 淘宝 直通车 _h python源码
  16. R语言主成分PCA、因子分析、聚类对地区经济研究分析重庆市经济指标
  17. HDU:4535 吉哥系列故事——礼尚往来(数学:错排)
  18. 对uni-app框架的认识
  19. Apache Dubbo 之 内核剖析
  20. excel2007 html,excel2007兼容包

热门文章

  1. Tricks(十七) —— 数组与字典(map)
  2. php使用 js格式解析,JavaScript解析JSON格式数据的方法示例
  3. python简单爬虫代码-用Python编写一个简单的爬虫
  4. 怎么自学python-如何系统地自学 Python?
  5. python下载-Python下载和安装图文教程[超详细]
  6. python能做什么excel-python能做什么,python自学行吗?
  7. python画柱状图-Python Excel 绘制柱形图
  8. python用什么软件编程-python编程软件有什么
  9. python手机版下载-qpython手机版下载
  10. 编程语言python入门-【python】编程语言入门经典100例--19