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. Pi-star MMDVM双工板介绍

    Pi-star MMDVM双工板介绍(2020/2) pi-star里控制模式选择:双工模式(DUPLEX Mode)/单工模式(SIMPLE Mode) 双工板工作频率范围:144-148,219- ...

  2. iOS-线程&&进程的深入理解

    进程基本概念 进程就是一个正在运行的一个应用程序; 每一个进度都是独立的,每一个进程均在专门且手保护的内存空间内; iOS是怎么管理自己的内存的,见博客:博客地址 在Linux系统中,想要新开启一个进 ...

  3. 【PHP】如何将SESSION数据存放到Redis中

    在php中,SESSION的数据默认是存放到文件中,这样性能不仅不高,而且不利于扩展.在搭建集群后,默认存放到文件中就不适用了.所以,我们一般将SESSION自定义,让SESSION中的数据存放到 数 ...

  4. Linux系统管理——Linux简介

    UNIX与Linux发展史 UNIX发展历史 1.1965年,美国麻省理工学院(MIT),通用电气公司(GE)及AT&T的贝尔实验室联合开发Multics工程计划,其目标是开发一种交互式的具有 ...

  5. 【loj - 3055】「HNOI2019」JOJO

    目录 description solution accepted code details description JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或 ...

  6. Pants On Fire(链式前向星存图、dfs)

    Pants On Fire 传送门:链接  来源:upc9653 题目描述 Donald and Mike are the leaders of the free world and haven't ...

  7. Looooops(求解同余方程、同余方程用法)【拓展欧几里得】

    Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...

  8. 写一个通用的List集合导出excel的通用方法

    前几天要做一个数据导出Excel 我就打算写一个通用的. 这样一来用的时候也方便,数据主要是通过Orm取的List.这样写一个通用的刚好. public static void ListToExcel ...

  9. 超详细实战教程丨多场景解析如何迁移Rancher Server

    本文转自Rancher Labs 作者介绍 王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营.拥有6年的云计算领域经验,经历了OpenStack到Kubernetes ...

  10. LR脚本信息函数-lr_start_timer和lr_end_timer

    为了计算时间更加精确,可以用这个函数去掉LR自身的检查点所浪费的时间.如text check and image time Action() { double time_elapsed, durati ...