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复合索引和覆盖索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux下安装配置MySQL

    Linux下安装配置MySQL

    mysql最流行的关系型数据库之一,目前隶属于oracle公司,因体积小、速度快、总体拥有成本低,开放源代码这一特点,所以是我们日常开发的首选。下面我们来看看如何在Linux下安装配置MySQL
    2017-05-05
  • mysql数据库查询优化 mysql效率

    mysql数据库查询优化 mysql效率

    MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一定要保持查询和插入的高效.以下是我在使用过程中做的提高效率的三个有效的尝试. 1. 使用statement进行绑定查询 2. 随机的获取记录 3. 使用连接池管理连接.
    2008-01-01
  • MySQL慢查询日志的配置与使用教程

    MySQL慢查询日志的配置与使用教程

    慢查询日志用于记录一些过慢的查询语句,可以帮助管理员分析问题所在,下面这篇文章主要给大家介绍了关于MySQL慢查询日志的配置与使用教程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-09-09
  • MySQL中正则表达式用法示例详解

    MySQL中正则表达式用法示例详解

    MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配,这篇文章主要介绍了MySQL中正则表达式用法,需要的朋友可以参考下
    2025-06-06
  • MySQL使用MyFlash快速恢复误删除和修改的数据

    MySQL使用MyFlash快速恢复误删除和修改的数据

    MyFlash 是由美团点评公司技术工程部开发并维护的一个开源工具,主要用于MySQL数据库的DML操作的回滚,MyFlash的优势在于它提供了更多的过滤选项,使得回滚操作变得更加容易,本文将实验通过 MyFlash 工具快速恢复误删除 或 误修改的数据,需要的朋友可以参考下
    2024-06-06
  • Mysql如何在线添加索引

    Mysql如何在线添加索引

    这篇文章主要介绍了Mysql如何在线添加索引问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 一文了解MySQL二级索引的查询过程

    一文了解MySQL二级索引的查询过程

    索引是一种用于快速查询行的数据结构,就像一本书的目录就是一个索引,下面这篇文章主要给大家介绍了关于MySQL二级索引查询过程的相关资料,需要的朋友可以参考下
    2022-02-02
  • mysql 5.7.18 Archive压缩版安装教程

    mysql 5.7.18 Archive压缩版安装教程

    这篇文章主要为大家详细介绍了mysql 5.7.18 Archive压缩版安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • MySQL性能优化之全文检索查询优化实践

    MySQL性能优化之全文检索查询优化实践

    当内容量达到数十万甚至数百万条记录时,简单的全文检索实现可能导致响应时间延长等问题,下面小编就来和大家讲讲MySQL如何进行全文检索查询优化吧
    2025-07-07
  • MySQL与Redis如何保证双写一致性详解

    MySQL与Redis如何保证双写一致性详解

    双写一致性是指在系统中同时使用缓存(如Redis)和数据库(如MySQL)时,如何确保两者的数据保持一致,这篇文章主要介绍了MySQL与Redis如何保证双写一致性的相关资料,需要的朋友可以参考下
    2025-10-10

最新评论