iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 - G
  • 698
分享到

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

摘要

Mysql索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序   What"s Index ? 索引就是帮助RDBMS高效获取数据的数据结构。 索引可以让我们避免一行一行进行全表扫描。它的价值就是可以帮助你对数据进行快

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

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。

 

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

  • 聚集索引(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;

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

 

您可能感兴趣的文档:

--结束END--

本文标题: MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 - G

本文链接: https://www.lsjlt.com/news/6984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-14
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-14
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-14
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-14
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-14
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-14
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-14
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-14
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作