mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理_fish_study_csdn的博客-CSDN博客


本站和网页 https://blog.csdn.net/fish_study_csdn/article/details/99688859 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理_fish_study_csdn的博客-CSDN博客
mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理
fish_study_csdn
于 2019-08-17 09:27:24 发布
1397
收藏
分类专栏:
MySQL
面试题整理
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fish_study_csdn/article/details/99688859
版权
MySQL
同时被 2 个专栏收录
30 篇文章
2 订阅
订阅专栏
面试题整理
57 篇文章
3 订阅
订阅专栏
 今天给大家介绍mysql InnoDB 下3种常用的索引:主键索引(聚集索引)、非聚集索引、覆盖索引
下面已一张表具体的表为例:来演示数据查找的过程。
譬如:一张用户表 User表 Id是主键
主键索引,也被称为”聚集索引“,
是InnoDB 引擎中是最重要的索引结构,主键索引的数据结构是一颗“B+树”,树的子节点存储索引节点信息及关联关系,树的叶子节点存储主键索引信息+数据,一颗树的叶子节点按照主键索引有序排列开来,查找起来更便捷。
我们查询id=2 这笔数据的过程如下:
先找到对应根索引2<3,向树的左边继续查找,查找到最下面的叶子节点,查找到这个节点对应的数据进行返回。
非聚集索引
譬如:我们常用的普通索引或者复合索引,以User表中的name索引为例说明
非聚集索引存储的具体的索引字段信息,而叶子节点存储主键索引+数据,为了要找到“zhangsan”这行数据,需要先在非聚集索引中找到对应的主键,再根据主键索引,查找对应的行数据,等于走了两遍B+树进行搜索,效率上肯定比主键索引低。
覆盖索引,首先看一下它的定义:如果查询的列字段在索引关键字中能找到则直接返回。我们先建一个复合索引 idx_name_addr(name,addr),查询语句:select name,addr from User;
因查询列中的字段在索引关键字中能找到,故符合覆盖索引的定义,那么这种覆盖索引的数据结构是怎么样的?它又是怎么样在索引结构能快速的返回的呢?我们一起看一下如下图覆盖索引结构
我们建了name,addr 的复合索引,那么在上图中的索引叶子节点中会存索引字段+数据,而如果
查询的列中能全部匹配索引关键字,则直接返回对应索引的数据,那么此时就不用在根据索引的主键
在聚集索引中再查找一遍,等于覆盖索引能减少IO操作,所以我们在某些特殊场景下,如果只查索引列的字段,建议可以使用覆盖索引,能大幅度提供查询性能。
fish_study_csdn
关注
关注
点赞
收藏
打赏
评论
mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理
今天给大家介绍mysql InnoDB 下3种常用的索引:主键索引(聚集索引)、非聚集索引、覆盖索引下面已一张表具体的表为例:来演示数据查找的过程。譬如:一张用户表 User表 Id是主键主键索引,也被称为”聚集索引“,是InnoDB 引擎中是最重要的索引结构,主键索引的数据结构是一颗“B+树”,树的子节点存储索引节点信息及关联关系,树的叶子节点存储主键索引信息+数据,一颗...
复制链接
扫一扫
专栏目录
MySQL索引之主键索引
12-15
在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别?
上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别。
1、主键索引
主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。
在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则:
1、采用一个没有业务用途的自增属性列作为主键;
2、主键字段值总是不更新,只有新增或者删除两种操作;
3、不选择会动态更新的类型,比如当前时间戳等。
这么做的好处有几点:
1、新增数据
mysql主键索引底层实现_由浅入深理解数据库中索引的底层实现
weixin_33800724的博客
02-05
322
Fig. 9这分明就是传说中的B+Tree.-索引上的操作A. 插入键值B. 删除键值C. 分裂一个节点D. 合并两个节点这些操作在教科书上都有介绍,这里就不介绍了。先写到这吧,实在写不动了,想明白容易,写明白就难了。下一篇里,打算谈谈标准B+Tree的几个问题,以及在实现过程中,B+Tree的一些变形。教科书上的B+Tree是一个简化了的,方便于研究和教学的B+Tree。然而在数据库实现时,为了...
评论 2
您还未登录,请先
登录
后发表或查看评论
InnoDB索引
最新发布
bhying的专栏
10-09
127
InnoDB 主键索引、辅助索引、组合索引、覆盖索引、索引条件下推ICP
MySQL innodb存储引擎中的聚集索引和非聚集索引(摘录自大量博客)
a219219219219的博客
08-03
426
用一个简单的示意图来大概说明一下在数据库中的样子:
地址
id
username
score
0x01
小明
90
0x02
小红
80
0x03
小华
92
【主键索引】和【非主键索引】
jim_007的博客
09-10
1013
索引简述
索引的目的在于提高查询效率,类比字典;实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,索引列也是要占用空间;
常见的MySQL主要有两种结构:Hash索引 和 B+ 树索引,我们使用的是InnoDB和MyISAM引擎,默认的都是B+树;
为什么用 B+ 树做索引而不用哈希表做索引?
1、哈希表是把索引字段映射成对应的哈希码然后再存放在对应的位置,这样的话,如果我们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则可以通过最左前缀原则快.
MySql主键索引和非主键索引/聚簇索引和非聚簇索引
09-07
255
如果语句是select * from Twhere k=5, 即普通索引查询方式, 则需要先搜索k索引树, 得到ID。如果语句是select * from Twhere ID=500, 即主键查询方式, 则只需要搜索ID这棵B+树;1. 主键索引的叶子节点存的是整行数据。2. 非主键索引的叶子节点内容是主键的值。在InnoDB里, 非主键索引也被称为二级索引。也就是说, 基于非主键索引的查询需要多扫描一棵索引树。根据上面的索引结构说明, 我们来讨论一个问题: 基于主键索引和普通索引的查询有什么区别?
HSQL 索引内部实现
marlonyao的专栏
07-07
123
HSQL使用AVL Tree来实现索引,AVL Tree有如下特性:
* 它是一个二叉树。二叉树的每个结点有零个或1个左孩子,零个或1个右孩子,和一个父亲结点(除了根节点以外)。任何节点必须满足以下关系:左子树中每个结点都不能大于这个结点,右子树的每个结点都不能小于这个结点。因此对一个二叉树进行中序遍历,我们就得到这棵树的升序排列。
* 它是平衡的。每个结点的左子树与右子树的高...
mysql中主键索引和非主键索引的区别
程序小赵的博客
05-02
249
mysql非主键索引的区别_主键索引和非主键索引的区别
weixin_42501956的博客
01-19
524
1. 什么是最左前缀原则?以下回答全部是基于MySQL的InnoDB引擎例如对于下面这一张表如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下如果我们要进行模糊查找,查找name 以“张"开头的所有人的ID,即 sql 语句为selectIDfromtablewherenamelike'张%'由于在B+树结构的索引中,索引项是按照索引定义里面出现的字段顺...
InnoDB 中的聚集索引和非聚集索引
javaZhong的博客
03-09
1462
InnoDB 中的聚集索引和非聚集索引:
一、聚集索引(聚簇索引):
以 InnoDB 作为存储引擎的表,表中的数据都会有一个主键,即使你不创建主键,系统也会帮你创建一个隐式的主键。这是因为 InnoDB 是把数据存放在 B+ 树中的,而 B+树的键值就是主键,在 B+树的叶子节点中,存储了表中所有的数据。这种以主键作为 B+ 树索引的键值而构建的 B+树索引,我们称之为聚集索引。
二、非聚集索引(非聚簇索引):
以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。非聚集索引与...
MySql 主键索引/二级索引/联合索引/覆盖索引傻傻分不清
weixin_43012300的博客
08-08
1516
主键索引也叫聚簇索引,非主键索引也是二级索引。
主键索引存储的是主键id和全部数据,二级索引储存的是索引值和主键值,当我们查询的字段不在索引储存的数据中,就会进行回表,即通过普通索引找到主键值,再通过主键值查询主键索引找到要查的数据,这就是回表操作。这种情况可以建立联合索引,也叫覆盖索引。
普通索引如果查询id值,也是覆盖索引,因为它里面就储存主键值的呢。
...
mysql innodb 主键 索引_MySQL Index--InnoDB引擎的主键索引
weixin_34733070的博客
01-19
70
查看表主键信息## 查看表主键信息SELECTt.TABLE_NAME,t.CONSTRAINT_TYPE,c.COLUMN_NAME,c.ORDINAL_POSITIONFROMINFORMATION_SCHEMA.TABLE_CONSTRAINTSASt,INFORMATION_SCHEMA.KEY_COLUMN_USAGEAScWHEREt.TABLE_NAME=c.TABLE_NAMEAN...
innoDB的主键索引
u012576837的博客
01-14
1281
局部性原理
计算机在取数据的时候会把所取数据相邻的数据也取出来放到内存中去,下次再取的时候直接从内存中获得数据不用从磁盘中取数据了,操作系统通常会把所取数据所在的一页数据取出来放到内存中,一页的数据大约是4kb,mysql innodb 也用到了局部性原理,一页的数据大约是16kb大小。
页的结构
innoDB的行结构
一行记录可以以不同行格式存在innoDB中,行格式分别是:Compact,Redundant,Dynamic和Compressed格式。
COMPACT行格式:
行益处后如何查找数据
MySQL中什么是什么是主键索引、联合索引、覆盖索引、索引条件下推及区别
Rsun2018的博客
03-04
1224
1、主键索引:联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符
2、联合索引:根据创建联合索引的顺序,以最左原则进行where检索,比如(age,name)以age=1 或 age= 1 and name=‘张三’可以使用索引,单以name=‘张三’ 不会使用索引,考虑到存储空间的问题,还请根据业务需求,将查找频繁的数据进行靠左创建索引
3、覆盖索引:如果查询条件使用的是普通索引(...
MySQL 高频面试题目二:InnoDB与MyISAM 聚集索引与非聚集索引区别?
Mark66890620
04-16
354
区别:
InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主
InnoDB的索引的数据结构、原理、使用原则、失效场景及设计思路
m0_37840000的博客
08-08
259
页概念及结构图:
Innodb_page_size,是Innodb在存取数据时,最小的基本单位为1页,默认大小为16KB,这样做的好处是:可以有效减少IO操作,提高性能;(页:包含页目录(即索引的概念,相当于用户数据区域的索引),用户数据区域,页头,头尾指针)。
结构原理演变思路:
存数据到用户数据目录-》遍历全部数据用页目录优化-》多页参照页目录优化变成B+树
初始时,页目录和用户数据区域为空,由于MySql对于新插入的数据,会默认按照主键进行排序,用来提高查询性能。
需遍历全部数据行,对其
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:鲸
设计师:meimeiellie
返回首页
fish_study_csdn
CSDN认证博客专家
CSDN认证企业博客
码龄8年
Go领域新星创作者
368
原创
1471
周排名
5138
总排名
44万+
访问
等级
5350
积分
1万+
粉丝
254
获赞
87
评论
1091
收藏
私信
关注
热门文章
channel的使用总结
66435
个人创建微信公众号步骤
30748
Linux下动态查看实时日志的命令
26452
php7和PHP5对比的新特性和性能优化
12366
macOS Python安装教程
10319
分类专栏
go
61篇
php7
60篇
MySQL
30篇
linux
52篇
java
44篇
测试
50篇
运维
48篇
python
20篇
前端
21篇
docker&k8s
24篇
分布式
13篇
缓存
12篇
Mac
7篇
小程序
7篇
APP
5篇
nginx
6篇
版本控制
9篇
新手必备
32篇
管理
2篇
网络
1篇
算法
6篇
安全
11篇
生活
1篇
tool
6篇
区块链
2篇
面试题整理
57篇
总结
7篇
创业
1篇
https
2篇
最新评论
解决pyCharm无法通过pip安装selenium问题
V_nine:
虽然不知道原理,但确实有用
UI自动化之selenium元素定位不到问题分析及解决办法
m0_46662188:
我的也没变,一样能定位
Python+Requests+PyTest+Excel+Allure(二)接口自动化测试实战(附代码)
大猪肉蹄子:
TOKEN 都没办法获取到
windows 下SVN使用教程---图文并貌教程
Jumpingooo:
写的真的很详细,适合我这种新手
Python+Requests+PyTest+Excel+Allure(一)接口自动化测试实战(附代码)
所谓伊人在何方:
背景太伤眼了
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Jmeter性能监控
app测试定位方式
Pytest失败重跑
2022
11月
1篇
07月
2篇
06月
13篇
05月
15篇
04月
8篇
03月
3篇
02月
13篇
01月
11篇
2021年97篇
2020年57篇
2019年98篇
2018年41篇
2017年7篇
2016年8篇
目录
目录
分类专栏
go
61篇
php7
60篇
MySQL
30篇
linux
52篇
java
44篇
测试
50篇
运维
48篇
python
20篇
前端
21篇
docker&k8s
24篇
分布式
13篇
缓存
12篇
Mac
7篇
小程序
7篇
APP
5篇
nginx
6篇
版本控制
9篇
新手必备
32篇
管理
2篇
网络
1篇
算法
6篇
安全
11篇
生活
1篇
tool
6篇
区块链
2篇
面试题整理
57篇
总结
7篇
创业
1篇
https
2篇
目录
评论 2
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
fish_study_csdn
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值