MySQL中复合索引和覆盖索引的区别详解

 更新时间:2023年11月22日 10:14:01   作者:杜小舟  
这篇文章主要介绍了MySQL中复合索引和覆盖索引的区别详解,复合索引是一种索引,它包含多个字段,复合索引能够使一个SQL查询多个条件时也能走索引,提高查询性能,需要的朋友可以参考下

前言准备

我们先准备一张表和几个字段,方便介绍覆盖索引和复合索引。

创建一个user表,表中有id、name、school、age字段。

字段名字段类型
idint
namevarchar
schoolvarchar
ageint

复合索引

先来说复合索引,复合索引是一种索引,它包含多个字段,复合索引能够使一个SQL查询多个条件时也能走索引,提高查询性能。

比如,创建一个name、school和age的复合索引:

CREATE INDEX idx_name_school_age ON user(name, school, age);

查询SQL为:

select * from user where name = '张三' and school = '北京大学' and age > 18

注意,在这里要注意查询条件的顺序要按照复合索引的字段顺序,要是不按照复合索引的顺序,通常情况下是不会走索引的,因为复合索引是按照最左匹配原则,最左匹配原则的意思是查询条件的顺序要按照复合索引字段顺序。

为什么要说通常情况下不走索引呢,是因为MySQL的查询优化器会根据条件查询和数据分布情况选择最优的执行计划,假设,我们把school和name的查询条件到换一下,变成:

select * from user where school = '北京大学' and name = '张三' and age > 18

如果,我们条件中的school的值非常稀疏,name和age的值非常密集,那么MySQL在查询时会认为使用索引能够加速查询,也会使用索引。

这里,有些同学可能会对稀疏和密集这两个词有些困惑,不明白这两个词的意思,在这里要单独拿出来说一下,下面往user表中增加五条数据,做为案例数据:

idnameschoolage
1张三北京大学18
2李四北京大学18
3王五清华大学18
4赵六北京大学18
5金七清华大学18

稀疏的意思是每个不同的值出现的次数很多,比如说user表中有五条记录,name字段分别有张三、李四、王五、赵六、金七,那么我们就可以说name这个字段非常稀疏;

那么相反,密集就好理解了,比如,user表school字段的值分别只有北京大学和清华大学,那么就可以说school字段的值非常密集。

总之,MySQL的查询优化器会根据条件查询和数据分布情况选择最优的执行计划,并不是说我们不按照复合索引的字段顺序做查询条件就不会走复合索引。

覆盖索引

覆盖索引是一种索引优化手段,假设,我们想查询user表中name等于张三,获取张三的school和age字段数据,那么我们的SQL应该是:

slelect school, age from user where name = '张三'

那么,为了优化这个查询SQL,我们就需要创建一个复合索引,复合索引中有name、school和age字段:

CREATE INDEX idx_name_school_age ON user(name, school, age);

当我们查询SQL时,MySQL就可以直接从索引中获取所需要的数据,不需要再回表查询数据了,这样就能大大的提高查询速度。

在这里介绍一下回表: 假设,我们创建一个复合索引,复合索引中有name和age字段:

CREATE INDEX idx_name_school_age ON user(name, age);

我们这里写一个查询SQL,SQL中查询name等于张三的school和age字段值:

slelect school, age from user where name = '张三'

那么在查询时,SQL语句会直接查询索引,从索引中查询到name叫做张三的数据位置,再根据位置去表中查询完整的数据,这里,根据位置去表中查询完整的数据叫做回表。

总结

覆盖索引和复合索引的区别是:覆盖索引是一种索引优化技术,而复合索引是一种索引。

使用复合索引时应该注意查询SQL条件的顺序,以及要避免回表,从而影响到查询效率。

到此这篇关于MySQL中复合索引和覆盖索引的区别详解的文章就介绍到这了,更多相关MySQL复合索引和覆盖索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中count()查询的性能梳理

    MySQL中count()查询的性能梳理

    这篇文章主要为大家详细介绍了MySQL中count()查询的性能对比与优化,文中的示例代码讲解详细,具有一定的参考价值,需要的可以了解一下
    2023-07-07
  • MySQL删除表的外键约束图文教程(简单易懂)

    MySQL删除表的外键约束图文教程(简单易懂)

    删除表不是特别常用,特别是对于存在外键关联的表,删除更得小心,这篇文章主要给大家介绍了关于MySQL删除表的外键约束的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • MySQL窗口函数 over(partition by)的用法

    MySQL窗口函数 over(partition by)的用法

    本文主要介绍了MySQL窗口函数 over(partition by)的用法, partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序,下面就来介绍一下具体用法,感兴趣的可以了解一下
    2024-02-02
  • 手把手教你使用Navicat查询表的详细结构

    手把手教你使用Navicat查询表的详细结构

    在使用Navicat时,我们可以通过执行一些SQL语句来查看表结构,下面这篇文章主要给大家介绍了关于如何使用Navicat查询表的详细结构,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • mysql中锁机制的最全面讲解

    mysql中锁机制的最全面讲解

    大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,所以本文打算总结一下mysql的锁机制,这篇文章主要给大家介绍了关于mysql中锁机制的相关资料,需要的朋友可以参考下
    2021-09-09
  • MySQL 5.6 中 TIMESTAMP有那些变化

    MySQL 5.6 中 TIMESTAMP有那些变化

    前段时间,系统MySQL从5.5升级到了5.6,系统出现了大量的异常。大部分异常引起原因是由于TIMESTAMP的行为发生了变化,下面通过此篇文章给大家详解MySQL 5.6 中 TIMESTAMP有那些变化,需要的朋友可以参考下
    2015-08-08
  • 一个 20 秒 SQL 慢查询优化处理方案

    一个 20 秒 SQL 慢查询优化处理方案

    这篇文章主要分享一个 20 秒 SQL 慢查询优化的经历与处理方案,页面无法正确获取数据,经排查原来是接口调用超时,而最后发现是因为SQL查询长达到20多秒而导致了问题的发生,下面来看问题具体介绍吧
    2022-01-01
  • MySql安装及登录详解

    MySql安装及登录详解

    这篇文章主要介绍了MySql安装及登录详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • 解决MYSQL连接端口被占引入文件路径错误的问题

    解决MYSQL连接端口被占引入文件路径错误的问题

    下面小编就为大家带来一篇解决MYSQL连接端口被占引入文件路径错误的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Mariadb远程登陆配置及问题解决

    Mariadb远程登陆配置及问题解决

    这篇文章主要介绍了Mariadb远程登陆配置及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论