什么是聚集索引和非聚集索引

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

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

除了聚集索引,其它索引都叫做非聚集索引(secondary index)。包括普通索引,唯一索引等。

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

若表存在主键,则主键索引就是聚集索引。

若不存在主键,则会把第一个非空的唯一索引作为聚集索引。

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

什么是回表查询

在主键索引树上,通过主键就可以一次性查出来我们所需要的数据,速度非常的快。

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

对于普通索引,则需要根据where条件后条件字段对应的的索引树(非聚集索引)找到叶子节点对应的主键,然后再通过主键去主键索引树查询一遍,才可以得到要找的记录。这就叫 回表查询。

什么是索引覆盖

比如说有一张表 user ,里面有个联合索引 KEY(name,age),用sql查的时候select中的字段都在这个索引的B+树的叶子节点上.不需要回表查询.就叫索引覆盖.

官方一点说就是在用这个索引查询时,使它的索引树,查询到的叶子节点上的数据可以覆盖到你查询的所有字段,这样就可以避免回表。

最左前缀原则

最左前缀原则,顾名思义,就是最左边的优先。指的是联合索引中,优先走最左边列的索引。如上表中,name和age的联合索引,相当于创建了 name 单列索引和 (name,age)联合索引。在查询时,where 条件中若有 name 字段,则会走这个联合索引。

对于多个字段的联合索引,也同理。如 index(a,b,c) 联合索引,则相当于创建了 a 单列索引,(a,b)联合索引,(a,c)联合索引, 和(a,b,c)联合索引。

demo

假如有这样一张student表,表中有联合索引,idx_stu(name,age,address)

观察最左前缀原则的使用

会发现,若不符合最左前缀原则,则 type为 index,若符合,则 type 为 ref。

index 代表的是会对整个索引树进行扫描,如例子中的,最右列 address,就会导致扫描整个索引树。

ref 代表 mysql 会根据特定的算法查找索引,这样的效率比 index 全扫描要高一些。但是,它对索引结构有一定的要求,索引字段必须是有序的。而联合索引就符合这样的要求!

联合索引内部就是有序的,我们可以把它理解为类似于 order by name,age,address 这样的排序规则。会先根据 name 排序,若name 相同,再根据 age 排序,依次类推。

mysql非聚集索引区间查询_mysql的聚集索引和非聚集索引,回表查询,索引覆盖,最左前缀原则略解...相关推荐

  1. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  2. mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖

    一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...

  3. mysql索引优化原则:覆盖索引、最左前缀原则、索引下推

    文章目录 前言 round1:覆盖索引 round2:最左前缀原则 round3:索引下推 小结 前言 在文章开始前,小编提出几个问题,读者可以思考一下如何回答.如果对于以下的问题,回答的模棱两可甚至 ...

  4. 【MySQL】索引原理(三):联合索引(最左前缀原则),覆盖索引,索引条件下推

    准备工作,下面的演示都是基于user_innodb表: DROP TABLE IF EXISTS `user_innodb`; CREATE TABLE `user_innodb` (`id` big ...

  5. 索引原理:联合索引(最左前缀原则)

    准备工作,创建数据表user_innodb表 DROP TABLE IF EXISTS `user_innodb`; CREATE TABLE `user_innodb` (`id` bigint(6 ...

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

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

  7. 什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推

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

  8. mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?

    转自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651962609&idx=1&sn=46e59691257 ...

  9. mysql索引最左前缀原则

    mysql索引最左前缀原则 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因. 第三, ...

最新文章

  1. MySQL 设计规范(续)
  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
  3. 使用JBoss AS 7进行SSL加密的EJB调用
  4. attribute 扩展
  5. mysql 手动执行event_MYSQL 定时自动执行EVENT
  6. 我自定义安装office 但在ATA计算机考试系统考试时出现“没有正确的安装office” 怎么解决 求解
  7. java代码翻译器网页版_制作一个Java即时翻译器——网页抓取调用百度翻译API
  8. 【信息融合】基于BP神经网络和DS 证据理论实现不确定性信息融合问题附matlab代码
  9. Rhino结合AD、keyshot进行建模和渲染
  10. RabbitMQ队列,直连队列,主题队列,扇形队列,死信队列,延迟
  11. FCM算法研究(一)
  12. android开发笔记之materialish-progress
  13. 在ubuntu18.04上安装以及运行Faster-lio
  14. Windows驱动的加载顺序
  15. 请教苹果虚拟机自动配置序列号ID脚本
  16. linux文件压缩和打包
  17. 如何更改IE窗口初始大小及位置
  18. 无法使用内置管理员账户打开照片,请使用其他账户登录,然后再试一次
  19. linux 系统速度慢,Linux运维人员你知道Linux系统运行速度太慢的原因吗?
  20. 新冠死亡率居高不下,为什么偏偏是意大利?

热门文章

  1. java 导出文件,导出多个文件方案~
  2. java 时间戳加密_加密PHP中的时间戳并用Java解密
  3. 软件测试之功能测试详细过程
  4. php面试框架的执行流程图,ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程
  5. php链接数据库地址填写ip地址,PHP使用IP地址联接MySQL数据库
  6. usr libexec java_osx – 如何更改从/ usr/libexec/java_home返回的Mac操作系统的默认Java虚拟机...
  7. python美国股票数据api_【美股量化00篇】Python获取新浪接口美股实时数据
  8. mysql去掉两个最高分_从MySQL中的单列获取最高得分值,从两列获取最高得分值...
  9. 每隔k次反转一次 链表_PTA 5-2 Reversing Linked List (25) [法一] - 线性表 - 链表反转 (PAT 1074)...
  10. excel打不开怎么修复_SD卡坏了怎么办?一招教你拯救文件!