mysql 创建聚集索引_索引为什么会加快Mysql的查询速度?
为什么用了索引之后,查询就会变快?
相信很多程序员朋友对数据的索引并不陌生,最常见的索引是 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的查询速度?相关推荐
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...
- 找到符合条件的索引_高频面试题:MySQL联合索引的最左前缀匹配原则
前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...
- mysql创建唯一性降序索引_MySQL 8 新特性之降序索引底层实现
什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c, ...
- mongo 创建索引_索引系列:2dsphere索引
MongoDB Manual (Version 4.2)> Indexes > 2dsphere Indexes No 1 概述 2dsphere索引支持计算类似地球的球体上的几何形状的查 ...
- mysql支持非关系_说下oracle、mysql、非关系型数据库中的索引结构?
谢邀~~树懒君悉心整理了一篇索引结构方面的内容,跟各位知友分享分享~ Oracle 索引的数据结构:B-TreeOracle 数据库使用 B-trees 存储索引,来加速数据访问.若没有索引,你必须顺 ...
- solr mysql 增量索引_基于Solr DIH实现MySQL表数据全量索引和增量索引
实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单 ...
- 行存储索引改换成列存储索引_索引策略–第2部分–内存优化表和列存储索引
行存储索引改换成列存储索引 In the first part we started discussion about choosing the right table structure and d ...
- mysql创建文章表_创建表--文章表article
建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 `字段名` 数据类型 数据属性 数据属性: 1. 无符号 unsigned(非负限定 ,即不能取负值) 取值范围 0–255: 2 ...
- mysql创建触发器难题_[]MYSQL创建触发器遇到很奇怪的有关问题
[求助]mysql创建触发器遇到很奇怪的问题. 今天遇到一个很奇怪的问题,是关于创建触发器的.创建触发器代码如下 SQL code create trigger trigger_t_test_U af ...
最新文章
- debian10 nfs简单搭建
- python基础系列教程——python所有包库的下载
- pat 乙级 1004 成绩排名(C++)
- java private 命名_java private关键字用法实例
- 前端解决跨域的九种方法
- RelativeLayout相对布局
- 全面接触PDF:最好用的PDF软件汇总(2010-12-07更新)
- xshell添加vbs脚本
- Vuejs vm对象详解
- 如何注册电子邮箱账号,教你创建email邮箱账号
- DirectX11 交换链是什么
- 绝对高效实现! 给你一个包含n个整数的数组nums,判断nums是否存在三个元素a,b,c使得a+b+c =0...
- 这家200多年历史的中华老字号,是如何赢得今年快手中秋月饼品牌冠军的?
- gamemaker studio socket例子
- 淘宝 直通车 _h python源码
- R语言主成分PCA、因子分析、聚类对地区经济研究分析重庆市经济指标
- HDU:4535 吉哥系列故事——礼尚往来(数学:错排)
- 对uni-app框架的认识
- Apache Dubbo 之 内核剖析
- excel2007 html,excel2007兼容包
热门文章
- Tricks(十七) —— 数组与字典(map)
- php使用 js格式解析,JavaScript解析JSON格式数据的方法示例
- python简单爬虫代码-用Python编写一个简单的爬虫
- 怎么自学python-如何系统地自学 Python?
- python下载-Python下载和安装图文教程[超详细]
- python能做什么excel-python能做什么,python自学行吗?
- python画柱状图-Python Excel 绘制柱形图
- python用什么软件编程-python编程软件有什么
- python手机版下载-qpython手机版下载
- 编程语言python入门-【python】编程语言入门经典100例--19