基于主键索引和普通索引的查询区别
聚簇索引与非聚簇索引
假设存在这样一个表,表t1,主键为int类型的id,还有一个int类型的num。
create table t1(id int primary key auto_increment;num int not null,index idx_num(num)
)engine = innodb;
其第一行到第五行的数据分别为:(100,1)、(200,2)、(300,3)、(400,4)、(500,5),那么对应的B+Tree为:
可以看出,主键索引的叶子节点存放的是整行数据,在InnoDB中,主键索引也被称为聚簇索引。而普通索引的叶子节点存放的是主键索引的值,在InnoDB中,普通索引也被称为二级索引。
即二级索引和聚簇索引的区别在于,二级索引的叶子节点存放的是该行数据聚簇索引键,而聚簇索引的叶子节点存放的是相应行数据。
基于主键索引和普通索引的查询有什么区别?
使用聚簇索引来查询
select * from t1 where id = 100
当使用聚簇索引来进行查询的时候,只需要搜索ID这颗B+树即可。
使用普通索引来查询
select * from t1 where num = 1
当使用普通索引来进行查询的时候,需要先去num这颗B+树搜索,找到对应的主键索引的值,然后再去id这颗B+树搜索,这个过程被称为回表查询。
即通过二级索引来查询数据时,InnoDB存储会先从二级索引树中找到对应的主键,然后再通过主键在聚簇索引中找到完整的行记录。
基于非主键索引来查询数据的时候会多查一棵树,因此我们应该尽量使用主键查询。
基于主键索引和普通索引的查询区别相关推荐
- mysql建表语句主键自增_MYSQL索引-上
前言 今天同事做数据清理的时候发现我这边有一张表没有主键,这个表有两个字段,ID和Name,ID作者唯一索引,在我印象里,一个数据表如果没有主键索引,它会内部创建主键索引,创建的标准就是唯一性,我觉得 ...
- oracle数据库建立主键约束,数据库-Oracle主键约束和唯一索引的黑与白
1. 分别用两种方法创建主键 create table test1(id number,name varchar2(10)); insert into test1 values(1,'t1'); i ...
- mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...
聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...
- SqlServer为什么自动在主键上建立聚集索引
微软推荐为每一个表建立一个聚集索引,但是由于sqlserver简单易用,而且很多人并不了解聚集索引,非聚集索引这些东西,所以如果sqlserver不在主键上建立聚集索引的话,可能会导致大部分的表都是堆 ...
- oracle 删除主键级联删除唯一索引
删除主键级联删除唯一索引: alter table CBS_AG_CNTR_MTHD drop CONSTRAINT PK_CBS_AG_CNTR_MTHD cascade drop index;
- mysql主键索引需要创建_mysql主键还需要建立索引吗?
mysql主键不需要建立索引,主键具备索引的功能:当创建或设置主键的时候,mysql会自动添加一个与主键对应的唯一索引,不需要再做额外的添加.数据库管理系统对于主键会自动生成唯一索引,所以主键是一个特 ...
- Hibernate_9_Person和IdCard实例_一对一关系:基于主键
1)建立Person类:(与8同样) 2)建立IdCard类:(与8同样) 3)建立持久化类: 1>保存方法(与8同样) 2>获取方法(与8同样) 3>删除方法(与8同样) ...
- Hibernate基于主键一对一映射操作实例
背景: 公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证. 这个是基于主键的,基于外键的映射在:http://blog.csdn.net/nthack5730/article/detai ...
- 两个主键怎么设置tsql_索引该怎么创建?
1.2.索引 B+Tree 结构的特性: ①.B+Tree 只有叶子节点会存储真实的数据,非叶子节点只会存储索引字段值: ②.B+Tree的叶子节点之间使用 双向链表 链接,所以更加适合范围查询和排序 ...
- mysql隐式锁定辅助索引_当Mysql - InnoDB行锁遇到复合主键和多列索引-Go语言中文社区...
背景 今天在配合其他项目组做系统压测,过程中出现了偶发的死锁问题.分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了 ...
最新文章
- Spark采坑系列(三)Spark操作Hive的坑
- eclipse java代码某一行需要修改注释_看看这些Java代码开发规范吧!你好,我好,大家好!...
- LeetCode Pascal's Triangle II
- ValueError: invalid \x escape
- generate random or regular test data in R
- 搭建MSSM框架(Maven+Spring+Spring MVC+MyBatis)
- Java工作笔记-使用IDEA开始我的第一个Spring项目
- c++ string substr_用std::string_view替换leveldb的Slice
- 内推 |阿里大文娱-数据分析(广州/北京)
- 118 Python程序中的线程操作-守护线程
- 检查库文件的rpath命令
- java经纬度转地址_经纬度转地址示例代码
- 如何用excel做正交分析_excel表格分析正交数据-如何应用EXCEL表进行正交试验分析...
- python 两点曲线_圆锥曲线第八节:直线与椭圆的相交
- redis实现分布式锁的几种方式
- SQL SERVE 2008远程连接 提示sqlserver远程主机强迫关闭了一个现有连接
- 基于风险平价的资产配置策略
- 树莓派(Raspberry pi) 使用Pi Imager安装烧录操作系统
- 实用的链上数据查询工具——链数查
- 文件夹总是在新窗口打开
热门文章
- [PAT B1020] 月饼
- Spring Boot 2.0 从入门到精通 From Zero to Hero with Spring Boot - Brian Clozel
- java实现avg函数_PostgreSQL avg()函数
- fill()函数和fill_n()函数
- 内联函数的常识性问题
- Network Delay Time
- http://blog.csdn.net/wangyoujin321/article/details/51472606
- AR/VR learning (3)--物体的运动与动画(iTween插件的使用)
- 最新回归算法理解、实现及应用(2)logistic回归
- 简单记录 Part1.1