聚簇索引与非聚簇索引

假设存在这样一个表,表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存储会先从二级索引树中找到对应的主键,然后再通过主键在聚簇索引中找到完整的行记录。

基于非主键索引来查询数据的时候会多查一棵树,因此我们应该尽量使用主键查询。

基于主键索引和普通索引的查询区别相关推荐

  1. mysql建表语句主键自增_MYSQL索引-上

    前言 今天同事做数据清理的时候发现我这边有一张表没有主键,这个表有两个字段,ID和Name,ID作者唯一索引,在我印象里,一个数据表如果没有主键索引,它会内部创建主键索引,创建的标准就是唯一性,我觉得 ...

  2. oracle数据库建立主键约束,数据库-Oracle主键约束和唯一索引的黑与白

    1.  分别用两种方法创建主键 create table test1(id number,name varchar2(10)); insert into test1 values(1,'t1'); i ...

  3. mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...

    聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...

  4. SqlServer为什么自动在主键上建立聚集索引

    微软推荐为每一个表建立一个聚集索引,但是由于sqlserver简单易用,而且很多人并不了解聚集索引,非聚集索引这些东西,所以如果sqlserver不在主键上建立聚集索引的话,可能会导致大部分的表都是堆 ...

  5. oracle 删除主键级联删除唯一索引

    删除主键级联删除唯一索引: alter table CBS_AG_CNTR_MTHD drop CONSTRAINT PK_CBS_AG_CNTR_MTHD cascade drop index;

  6. mysql主键索引需要创建_mysql主键还需要建立索引吗?

    mysql主键不需要建立索引,主键具备索引的功能:当创建或设置主键的时候,mysql会自动添加一个与主键对应的唯一索引,不需要再做额外的添加.数据库管理系统对于主键会自动生成唯一索引,所以主键是一个特 ...

  7. Hibernate_9_Person和IdCard实例_一对一关系:基于主键

    1)建立Person类:(与8同样) 2)建立IdCard类:(与8同样) 3)建立持久化类:  1>保存方法(与8同样)  2>获取方法(与8同样)  3>删除方法(与8同样)   ...

  8. Hibernate基于主键一对一映射操作实例

    背景: 公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证. 这个是基于主键的,基于外键的映射在:http://blog.csdn.net/nthack5730/article/detai ...

  9. 两个主键怎么设置tsql_索引该怎么创建?

    1.2.索引 B+Tree 结构的特性: ①.B+Tree 只有叶子节点会存储真实的数据,非叶子节点只会存储索引字段值: ②.B+Tree的叶子节点之间使用 双向链表 链接,所以更加适合范围查询和排序 ...

  10. mysql隐式锁定辅助索引_当Mysql - InnoDB行锁遇到复合主键和多列索引-Go语言中文社区...

    背景 今天在配合其他项目组做系统压测,过程中出现了偶发的死锁问题.分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了 ...

最新文章

  1. Spark采坑系列(三)Spark操作Hive的坑
  2. eclipse java代码某一行需要修改注释_看看这些Java代码开发规范吧!你好,我好,大家好!...
  3. LeetCode Pascal's Triangle II
  4. ValueError: invalid \x escape
  5. generate random or regular test data in R
  6. 搭建MSSM框架(Maven+Spring+Spring MVC+MyBatis)
  7. Java工作笔记-使用IDEA开始我的第一个Spring项目
  8. c++ string substr_用std::string_view替换leveldb的Slice
  9. 内推 |阿里大文娱-数据分析(广州/北京)
  10. 118 Python程序中的线程操作-守护线程
  11. 检查库文件的rpath命令
  12. java经纬度转地址_经纬度转地址示例代码
  13. 如何用excel做正交分析_excel表格分析正交数据-如何应用EXCEL表进行正交试验分析...
  14. python 两点曲线_圆锥曲线第八节:直线与椭圆的相交
  15. redis实现分布式锁的几种方式
  16. SQL SERVE 2008远程连接 提示sqlserver远程主机强迫关闭了一个现有连接
  17. 基于风险平价的资产配置策略
  18. 树莓派(Raspberry pi) 使用Pi Imager安装烧录操作系统
  19. 实用的链上数据查询工具——链数查
  20. 文件夹总是在新窗口打开

热门文章

  1. [PAT B1020] 月饼
  2. Spring Boot 2.0 从入门到精通 From Zero to Hero with Spring Boot - Brian Clozel
  3. java实现avg函数_PostgreSQL avg()函数
  4. fill()函数和fill_n()函数
  5. 内联函数的常识性问题
  6. Network Delay Time
  7. http://blog.csdn.net/wangyoujin321/article/details/51472606
  8. AR/VR learning (3)--物体的运动与动画(iTween插件的使用)
  9. 最新回归算法理解、实现及应用(2)logistic回归
  10. 简单记录 Part1.1