引语

这篇文章主要介绍mysql中innodb的聚簇索引和非聚簇索引,那首先我们要先看下聚簇索引和非聚簇索引的概念是什么,是干什么用的.

聚簇索引和非聚簇索引的概念

我们先引用官网上的一段话来看看它们是干嘛的

Every InnoDB table has a special index called the clustered index where the data for the rows is stored. Typically, the clustered index is synonymous with the primary key. To get the best performance from queries, inserts, and other database operations, you must understand how InnoDB uses the clustered index to optimize the most common lookup and DML operations for each table.When you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index. Define a primary key for each table that you create. If there is no logical unique and non-null column or set of columns, add a new auto-increment column, whose values are filled in automatically.If you do not define a PRIMARY KEY for your table, MySQL locates the first UNIQUE index where all the key columns are NOT NULL and InnoDB uses it as the clustered index.If the table has no PRIMARY KEY or suitable UNIQUE index, InnoDB internally generates a hidden clustered index named GEN_CLUST_INDEX on a synthetic column containing row ID values. The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order.

有耐性的朋友可以自己翻译看看,这里咱们大概翻译了一下,总结出上面这段话的意思:
每个InnoDB表都有一个特殊的索引,称为聚簇索引,用于存储行数据。
1.如果创建了一个主键,InnoDB会将其用作聚簇索引(如果主键没有逻辑唯一且非空的列或列集,最好是设置成自动递增的)
2.如果没有为表创建主键,则MySQL会在所有键列都不为NULL的情况下找到第一个UNIQUE索引,InnoDB会将其用作聚集索引
3.如果表没有PRIMARY KEY或合适的UNIQUE索引,则InnoDB在包含行ID值的合成列上内部生成一个名为GEN_CLUST_INDEX的隐藏的聚集索引(隐藏的是看不到的,也就是说不会出现在desc table中,行ID是一个6字节的字段,随着插入新行而单调增加)
从这三种情况来看的话,就是说不管你有没有创建主键,mysql都会给你弄一个聚簇索引给安排上,你创建了就用你设置的主键为聚簇索引,没有创建就给你来个隐藏的.

聚簇索引(也称为主键索引)就是携带了行数据的索引,非聚簇索引就是除了聚簇索引之外的索引.这样说起来可能有点干巴巴的,咱们画个图来理解一下.
假设有一张表test

create table test(
id int primary key,
age int not null,
name varchar(16),
PRIMARY KEY (`id`),
KEY `idx_age` (`age`) USING BTREE,
KEY `idx_name` (`name`) USING BTREE,
)engine=InnoDB;

主键是id,然后有两个普通索引idx_age,idx_name(btree类型的索引),使用的是innodb引擎.
我们知道id就是聚簇索引,idx_age,idx_name是非聚簇索引.
现在有三条数据(1,11,‘甲’),(2,12,‘乙’),(2,13,‘丙’).那么他们在数据库中存储的形式是,如下:
聚簇索引:

非聚簇索引:

可以看到聚簇索引后面是直接跟着的数据,而非聚簇索引指向的是聚簇索引的key值.
因此非聚簇索引查询数据需要先查到聚簇索引的key,然后用这个key去查询真正的数据(这个过程称为回表).
也就是说非聚簇索引是需要查询两次
如图:

所以能走聚簇索引的尽量走聚簇索引(也可以说是尽量走主键),看起来都是走索引,实际上主键要更快.
而且主键索引如果是自增的int类型,因为长度比较小,占用的空间也比较小.

覆盖索引

我们上面说到如果是非聚簇索引的话会需要回表,查询两次,但是如果要查询得字段,数据直接就在索引上是可以不需要回表的.这种索引称为覆盖索引.
比如我们要查询上面的test表中的age和name两个字段.

select id,age,name from test where age = 13;

直接查询的话,会根据age的索引找到id的key,然后再用id去查询出数据.
但是如果我们创建一个(age,name)的联合索引,情况就不一样了.

因为要返回的值,id在联合索引指向的key上,age和name共同组成了联合索引,
因此数据都在(age,name)的联合索引上,并不需要回表在去查询一次,可以大大提高查询得效率.
当然这个查询要比较频繁,使用率比较高,毕竟创建索引也是要消耗资源的,实际情况要根据查询频率和索引大小来做出判断.
有联合索引存在的情况下能走覆盖索引当然是最好的,提高了查询效率.
注:还有在某些count聚合函数使用的时候可以使用覆盖索引来优化count,比如说select count(age) from test.
因为age是有索引了,直接使用到的也是age,所以覆盖索引了,无需回表.

总结:

1.聚簇索引和非聚簇索引,查询得时候使用聚簇索引能提高查询效率,尽量避免走非聚簇索引回表的耗时操作
2.覆盖索引能提高查询效率,主要是避免了回表的操作,查询得时候根据具体情况建立合适的索引走覆盖索引提高查询速度

参考资料:

1.https://dev.mysql.com/doc/refman/5.6/en/innodb-index-types.html
2.https://mp.weixin.qq.com/s/y0pjtNUZhOW2ZBOy4m-xsA

mysql聚簇索引和非聚簇索引相关推荐

  1. mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引

    聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体细节依赖于其实现方式. MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和 ...

  2. mysql 聚簇索引和非聚簇索引_MySQL学习之——索引

    转自:CSDN MySQL是目前绝大多数互联网公司使用的关系型数据库,它性能出色.资源丰富.成本低廉,是快速搭建互联网应用的首选关系型数据库.但是,俗话说,"好马配好鞍",仅仅会使 ...

  3. mysql 聚簇索引和非聚簇索引_图文并茂,说说MySQL索引

    点击上方 小伟后端笔记 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 作者:小小木的博客来源:cnblogs.com/wyc1994666/p/10831039.html 序 开门见山,直接上图 ...

  4. 在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...

    推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少? MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是 ...

  5. Mysql聚簇索引和非聚簇索引原理(数据库)

    一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小.因此提出虚拟内存概念.虚拟内存就是 ...

  6. MySQL中Innodb的聚簇索引和非聚簇索引

    聚簇索引 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种.Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中, ...

  7. mysql的聚簇索引和非聚簇索引

    mysql的聚簇索引和非聚簇索引 1.一个表中只能有一个索引吗? 可以按照需求来创建多个索引,但不要太多. 2.每一个索引是一棵B+树,还是所有的索引共用一棵B+树? 一个索引一棵B+树. 3.如果有 ...

  8. MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引

    一.索引类型 索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性能和特性更适合于构建高并发系统. 根据索引的存储方式来划分,索引可以分为聚簇索引 ...

  9. MySQL聚簇索引和非聚簇索引的原理及使用

    从数据结构角度 1.B+树索引 2.hash索引 3.FULLTEXT索引(InnoDB引擎5.7以后支持) 4.R-Tree索引(用于对GIS数据类型创建SPATIAL索引) 问题:这些索引的区别跟 ...

  10. Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别

    Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别 概念 索引是帮助Mysql搞笑获取数据的数据结构 对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对 ...

最新文章

  1. oracle中的聚簇,Oracle数据库的聚簇技术
  2. windows系统中的常用网络命令
  3. python遗传算法工具包_Deap: python中的遗传算法工具箱
  4. 风行未来oracle,oracle 7月份更新CVE-2020-14645 复现&利用
  5. 微信小程序对接阿里云视频点播,备忘
  6. js中对String去空格
  7. javafx窗体程序_JavaFX真实世界应用程序:EIZO CuratOR Caliop
  8. 怎么设置ep4ce6e22b8n引脚_技术货:教你怎么检查电路原理图
  9. 2021高通人工智能创新大赛垃圾分类赛题第五次研讨会
  10. 全套AI平面设计软件教程案例素材免费分享
  11. 基于SSM的校园二手交易平台系统
  12. 被动语态 动词的过去分词
  13. 51单片机用c语言在液晶1602上显示汉字,51单片机LCD1602显示汉字(中文)源程序...
  14. 树莓派教程(3)——树莓派设置中文
  15. 以太坊合并后下跌22%,我们分析链上的数据看看是否能找到答
  16. WPF之NPOIE导出xcel
  17. CPU内存乱序访问与内存屏障
  18. Windows Git 多用户多仓库配置
  19. 研究生真正需要培养的五大能力
  20. (一)python网络爬虫(理论+实战)——爬虫的初步认识

热门文章

  1. iOS10 隐私权限设置问题(Crash)
  2. 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校计算机工程专业排名第34(2020年USNEWS美国排名)...
  3. 服装搭配app开发项目特点在这几个方面
  4. 免费的PCB打样平台汇总,每月免费打8块板!【建议收藏】
  5. 视频人像抠图论文阅读
  6. 女生学python难吗_女生学数据分析好吗?数据分析适不适合女生学?
  7. 数字图像处理----第七章
  8. RDO和VB数据库编程
  9. 【NFS服务】Linux/Ubuntu 搭建NFS服务器
  10. PS教程:仙气十足的摄影后期技巧