MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序

 

What's Index ?

索引就是帮助RDBMS高效获取数据的数据结构。

索引可以让我们避免一行一行进行全表扫描。它的价值就是可以帮助你对数据进行快速定位。

 

索引分类

按照功能逻辑来分

  • 普通索引 INDEX(col_name)或者key index_name(col_name) 没有任何约束,一张表可以有多个普通索引
  • 唯一索引 UNIQUE INDEX index_name(col_name) 在不同索引上增加了唯一约束,允许多个ull值
  • 主键索引 PRIMARY KEY (col_name) 主键约束=UNIQUE+NOT NULL,一张表只能有一个主键索引---该性质由主键索引的物理实现方式决定---数据在文件中只能按照一种顺序进行存储
  • 外键索引 CONSTRAINT foreign_key_name FOREIGN KEY(col_name) REFREENCES table_name(col2_name)
  • 全文索引 FULLTEXT INDEX index_name(col_name)...)ENGINE=MyISAM; MySQL自带的全文索引仅支持英文,一般我们使用专门的全文搜索引擎Elasticsearch或者solr。

 

按照物理实现方式来分(也是按照叶子结点的内容来分)索引模型见此

  • 聚集索引(InnnoDB主键索引/ clustered index),叶子节点存放的是整行数据。一张表只能有一个聚集(InnnoDB主键)索引。查询时,尽量选用主键进行查询,这样可以减少回表次数,提高效率
  • 非聚集索引(InnnoDB非主键索引/二级索引/辅助索引/second index),叶子节点存放的是主键的值,为了找到数据,它单独维护了一个索引表(树),先在索引表(树)中查询主键值,再到主键索引上查找对应的真实数据,这个过程称为回表
  • 区别:
    • 聚集索引叶子节点存储整行数据,非聚集索引存储的是主键值---是数据位置,非聚集索引不会影响数据表的物理存储顺序。(而聚集索引决定物理存储结构)
    • 一张表只能有一个聚集索引,但可以有多个非聚集索引
    • 主键索引的查询效率高,但对数据的增删改的效率比非主键索引低

但是请格外注意:主键索引不一定是聚集索引

因为聚集索引决定了数据库物理存储结构,而主键只决定数据库逻辑组织方式

在InnoDB中,主键是一个聚集索引,但当一个表没有主键或者没有索引,innodb也会有对应的处理规则。而在MyISAM引擎中,主键不是聚集索引。一般按照innodb与机具集索引的关系进行讨论。

 

按照字段个数来分

  • 单一索引
  • 联合(组合)索引

 

最左前缀原则

创建联合索引时我们要注意联合索引的字段顺序

因为B+树的结构,所以有最左前缀原则/最左匹配原则,意思就是,对于联合索引,只要查询条件与联合索引从左到右部分字段顺序相匹配,该次查询就可以利用联合索引进行加速。

例如现有联合索引(x,y,z)

如果查询条件是WHERE x=1 AND y=2 AND z=3;那么就是对该联合索引的完全匹配。

如果查询条件是WHERE x=1 AND y=2;那么就是利用了该联合索引(符合最左匹配原则)

当然,WHRER x=1;可以以利用该联合索引

如果是WHERE y=2 AND z=3;或者 WHERE z=3;等,就无法利用联合索引(x,y,z)

 

如何安排联合索引的字段顺序

  • 原则一:精简索引数量

    如果联合索引的顺序可以让我们少维护一个索引,那么这个联合索引顺序就该被优先考虑

    比如说现在你有两个字段

    那么只需要建立(a,b)+(b)两个索引即可。而不是(a)+(b)+(a+b)

    因为最左前缀原则给予了联合索引复用能力

    当然,如果仅有根据字段a来进行索引的要求,b字段的单一索引可以不创建。如无必要,勿增实体

  • 原则二:精简索引占用的空间

    那么在a,b两个字段,中我们应该选用哪个字段来做单独的索引(b)呢

    这时候就需要考虑空间了,一般将字段长度比较小的当做这里的单一索引(b)。

    比如说有name和age两个字段,name字段比age大,如果我们使用(age,name)+(name)的形式,所占用的空间就比(name,age)+(age)的要大

 

覆盖索引

用自己的话总结,覆盖索引就是不需要回表的查询

翻译过来就是, 要的查询结果就是主键值且查询条件就是非主键索引字段,即在索引树上的查询结果就是我们需要的结果。

索引覆盖可以显著减少树的搜索次数,显著提升查询性能。是常用的性能优化手段。

例如,现有主键id,有已经建立了普通索引的字段col(int),我们查询SELECT id from test where col between 6 and 8;

执行该语句时,引擎内部在索引树上读取了三条记录,但因为对于MySQL的Server层来说,该语句就是拿到了符合条件的两个记录,因此MySQL认为扫描行数是2

 

索引下推

MySQL5.6版本引入索引下推,就是在只能利用部分联合索引时,对剩余联合索引的字段(不符和最左匹配原则的字段)进行先判断,先过滤,通过先过滤来减少回表的次数。

例如有索引(name,age),然后执行SELECT * FORM student WHERE name like '高%' and age=21;

5.6后,MySQL就会先利用联合索引找出所有姓高的名字,然后仅对age=21的主键值进行回表,而不是找出所有姓高的同学之后,对他们的所有主键值都进行回表。

 

MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序的更多相关文章

  1. MySQL数据库中的索引(二)——索引的使用,最左前缀原则

    上文中,我们了解了MySQL不同引擎下索引的实现原理,在本文我们将继续探讨一下索引的使用以及优化. 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. ...

  2. MySQL 的索引和最左前缀原则

    这两天看<构建高性能Web站点>这本书,感觉写的真是不错,很多实际项目中会碰到的问题都有所提及,今天看到一个最左前缀原则,以前也听说过,不过一直没搞明白,今天查了下. 通过实例理解单列索引 ...

  3. MySql最左前缀原则

    简单整理记录下,之前一直都没有关注过这个问题 最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上, 注:如果第一个字段是范围查询需要单独建一个索引 注:在创建多列索引时,要根据 ...

  4. mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?

    情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引? 根据查询字段的位置不同来决定,如查询a,     a,b    a,b, ...

  5. 【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则

    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...

  6. Mysql联合索引的最左前缀原则以及b+tree

    软件版本mysql5.7 根据官网的文档 https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html 查询条件要符合最左原 ...

  7. MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

    本节内容: 1)索引基础 2)索引类型(Hash索引.有序数组.B+树) 3)索引的几个常见问题 1)联合索引 2)最左前缀原则 3)覆盖索引 4)索引下推 1. 索引基础 索引对查询的速度有着至关重 ...

  8. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

  9. mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)

    没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...

随机推荐

  1. 数据结构&算法

    20个最常用.最基础数据结构与算法: 10个数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie 树. 10个 算法      :递归.排序.二分查找.搜索.哈希.贪心.分治.回溯. ...

  2. 对Activity启动模式的理解

    对Activity启动模式的理解 应用场景 在已打开多个Activity应用B的前提下,应用A调用应用B后点击返回按钮,需要直接返回到A应用,而不是打开B应用的上一个Activity 一个Task可以 ...

  3. 智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台

    背景 从传统运维到容器化的 Docker Swarm 编排,从 Docker Swarm 转向 Kubernetes,然后在 Kubernetes 运行 SpringCloud 微服务全家桶,到最终拥 ...

  4. 没了IDE,你的Java项目还能Run起来吗~

    计算机只能识别机器码0101...编程语言->能执行的机器码 需要经过 预处理->编译->汇编->链接->机器码过程.一个语言处理系统的示意图如下: 编译器 是将源语言程 ...

  5. [原创][开源]SunnyUI.Net, C# .Net WinForm开源控件库、工具类库、扩展类库、多页面开发框架

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  6. 跨域问题 - Nginx反向代理

    Nginx反向代理的思路,就是通过Nginx解析URL地址的时候进行判断,将请求转发的具体的服务器上. 解决思路 跨域问题,是由于JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象. ...

  7. 利用 Powershell 编写简单的浏览器脚本

    生活中有很多事情是低效益,重复性.比如每天上某些网站,先登录再签到打卡,比如每隔一段时间清理回收站的文件等等.一个成熟的软件工程师应该想到用软件解决他. 对于这些简单的小任务,一般用脚本实现.比如Py ...

  8. CentOS7.5搭建Kafka2.11-1.1.0集群与简单测试

    一.下载 下载地址: http://kafka.apache.org/downloads.html    我这里下载的是Scala 2.11对应的 kafka_2.11-1.1.0.tgz 二.集群规 ...

  9. XP系统无法进入界面 不断的反复重启-解决方法

    XP系统无法进入界面 不断的反复重启-解决方法 XP系统无法进入界面 不断的反复重启-解决方法 一般都是非正常关机导致磁盘受到损坏.需要修复磁盘. 1.插入带PE的u盘,进入PE系统后 2.win+R ...

  10. CentOS7 开机进入emergency mode

    今天突然操作了一下磁盘挂载,然后系统启动之后,就直接进入emergency模式了,然后只能输入密码进行救援,截图如下: 突然想了一下最近的一次操作,是因为要挂在镜像,然后每次开机都要挂载一次,觉得比较 ...