我们知道Mysql底层使用的B+树来存储索引的,而且数据都存在叶子节点上。对于innodb来说,它的主键索引和行记录是存储在一起的,因此叫做聚集索引。

ps:MyISAM的行记录是单独存储的,不和索引在一起,因此MYISAM是没有聚集索引的。

除了聚集索引,其他的索引都叫非聚集索引。(普通索引,唯一索引等)

另外需要注意的,在innodb中有且只有一个聚集索引。它有三种情况:

  • 若表中存在主键,那主键索引就是聚集索引。

  • 若表中没有主键,那第一个非用空的唯一索引就是聚集索引。

  • 否则,就会隐式的定义一个rowid作为聚集索引。

为了方便理解,下边以 InnoDB 的主键索引和普通索引为例,看下它们的存储结构。

创建一张表,结构如下,并添加几条记录(张三,李四,王五,孙七):

  CREATE TABLE `student` (  `id` int(11) NOT NULL,  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,  `age` int(11) DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `idx_stu` (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bininsert into student(id,name,age) values(1,'zs',12);insert into student(id,name,age) values(5,'ls',14);insert into student(id,name,age) values(9,'ww',12);insert into student(id,name,age) values(11,'sq',13);

在 InnoDB 中,主键索引的叶子节点存储的是主键和行记录,而普通索引的叶子节点存储的是主键(对于 MyISAM来说主键索引的叶子节点存储的是主键和对应行记录的指针,普通索引的叶子节点存储的是当前索引列和对应行记录的指针)。

什么是回表查询?

从上面的索引存储结构,我们可以看到,在主键索引树上,通过主键就可以一次性查出我们所需要的数据,速度非常快。

因为主键和行记录就存储在一起,定位到了主键,也就定位到了所要找的记录,当前行的所有字段都在这(这也是我们为什么说,在创建表的时候,最好是创建一个主键,查询时也尽量用主键来查询)。

对于普通索引,如例子中的name,则需要根据name的索引树(非聚集索引)找到叶子节点对应的主键,然后在通过主键索引树查询一遍,才可以得到要找的记录,这就是回表查询

什么是覆盖索引?

对于回表查询来说,无疑会降低查询的效率。那么有什么办法让他不回表呢?

  • 那就是索引覆盖

什么索引覆盖,就是在用这个索引查询的时候,使他的索引树查询到的叶子节点的数据可以覆盖你查询的所有字段,这样就可以避免回表。

还是以上边的表为例,现在 zs 对应的索引树上边,只有它本身和主键的数据,并不能覆盖到 age 字段。那么,我们就可以创建联合索引,如 KEY(name,age)。并且,查询的时候,显式的写出联合索引对应的字段(name和age)。

创建联合索引如下,

  KEY `idx_stu` (`name`,`age`)

查询语句修改如下,

  -- 覆盖联合索引中的字段select id,name,age from student where name='zs' and age=12;

这样,当查询索引树的时候,就不用回表,可以一次性查出所有的字段。对应的索引树结构如下:

PS:图中,联合索引中的字段(name,age)都应该出现在索引树上的,这里为了画图方便,且因数据量太小,没有画出来。只表现出了:叶子节点存储了所有的联合索引字段。

学习的过程是一件痛苦的事,一但学习有了结果,那就变成了快乐既兴奋的事!

让我们红尘作伴、活的潇潇洒洒,对酒当歌、学习快乐!

mysql创建非聚集索引_一文让你明白聚集索引和非聚集索引?相关推荐

  1. elasticsearch删除索引_一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)

    在 Elasticsearch 中,索引是一个非常重要的概念,它是具有相同结构的文档集合.类比关系型数据库,比如 Mysql, 你可以把它对标看成和库同级别的概念. 今天小哈将带着大家了解, 在 El ...

  2. mysql创建非聚集索引_一文看懂聚集索引和非聚集索引的区别

    一.深入浅出理解索引结构 实际上,可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclu ...

  3. mysql创建存储时覆盖_总结到位的MySQL 的覆盖索引与回表

    两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索 ...

  4. mysql 创建表格time类型_记一次关于 Mysql 中 text 类型和索引问题引起的慢查询的定位及优化...

    最近有用户反馈产品有些页面加载比较慢,刚好我在学习 Mysql 相关知识,所以先从 Mysql 慢查询日志开始定位: step1:通过慢查询日志定位具体 SQL 首先通过 SHOW VARIABLES ...

  5. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

  6. mysql删除分表键_一文看懂 MySQL 分区和分表,提高表增删改查效率

    原标题:一文看懂 MySQL 分区和分表,提高表增删改查效率 作者:冯帅,精通Oracle. MySQL. 擅长异构数据库数据同步及迁移.数据库的设计和调优,对高可用方案有深入研究. MySQL分区和 ...

  7. mysql 创建表字段长度范围_老板要我把这份MySQL规范贴在工位上!

    前言 因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成下边的文本. 规范在整个后端执行也有大半年的时间,对于整个团队在开发阶段就减少不恰当的建表 ...

  8. mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)

    索引使用简介 一. 关于索引的知识 要写出运行效率高的sql,需要对索引的机制有一定了解,下面对索引的基本知识做一介绍. 1. 索引的优点和局限 索引可以提高查询的效率,但会降低dml操作的效率. 所 ...

  9. mysql 每个分类前十名_一文解决所有MySQL分类排名问题

    导读 对数据库中的记录依据某个字段进行排序是一种常见需求,虽然简单的Order by可以胜任,但如果想要输出具体的排名却难以直接实现.如果再考虑重复排名或者分类排名,那么情况就更为复杂. 本文介绍4种 ...

最新文章

  1. String to Integer (atoi) leetcode java
  2. cuda profiler使用
  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本强势发布
  4. 计算机的网络操作题,计算机网络操作题
  5. esxi usb插口_酷暑大作战 | USB-C风扇新体验
  6. java 日期时间工具_Java日期时间类工具
  7. 自定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,quot;掏粪男孩Gifquot;顺便再提提onWindowFocusChanged)...
  8. zoj3829 Known Notation --- 2014 ACM-ICPC Asia Mudanjiang Regional Contest
  9. prd文档 范例_PRD文档范例,产品经理值得收藏的写作手册
  10. Java解析HTML之NekoHTML
  11. 如何下载VMWare虚拟机如何安装VMWare详细教程
  12. 中学教师资格考试作文真题
  13. 计算机云维护是做什么的,IT运维是什么?云时代下的运维人员是怎样的?
  14. “鸡血驱动”为CS:GO、LOL注入“强心剂”!英特尔锐炫A750显卡实测
  15. php打开word文档_PHP使用phpword生成word文档
  16. Python:max函数获取列表最大值
  17. PS抠字、PS修改图片文字
  18. [聊聊] 【自制OTG数据线】好多人都花钱买了,有几个懂呢?
  19. 菜鸟程序员自我修养心得
  20. SEO免费外链发布工具

热门文章

  1. sklearn中的Linear_model的score函数讲解
  2. python中;是什么意思_Python
  3. gb2312编码表_程序员趣味读物:谈谈Unicode编码
  4. Leetcode每日一题:763.partition-labels(划分字母区间)
  5. 网络基础知识(面试基础)
  6. LeetCode刷题(13)
  7. I9 9900K线程_收藏党抓紧了!英特尔停产i9-9900K特色包装,只因运输太浪费
  8. element 方法返回的boolean被当成字符串了_quot;==quot;和 equals 方法有什么区别
  9. python建立空集合_「python」集合类型及操作
  10. Windows10 右键“打开文件所在位置”找不到应用程序