首页 > 数据库 >Mysql联合索引是如何找到数据的

Mysql联合索引是如何找到数据的

时间:2023-07-25 13:56:46浏览次数:40  
标签:找到 查询 索引 Mysql test -- where select

比较简单的是单列索引(b+tree)。遇到多条件查询时,不可避免会使用到多列索引。联合索引又叫复合索引。

b+tree结构如下:

每一个磁盘块在mysql中是一个页,页大小是固定的,mysql innodb的默认的页大小是16k,每个索引会分配在页上的数量是由字段的大小决定。当字段值的长度越长,每一页上的数量就会越少,因此在一定数据量的情况下,索引的深度会越深,影响索引的查找效率。

对于复合索引(多列b+tree,使用多列值组合而成的b+tree索引)。遵循最左侧原则,从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a a,b a,b,c 3种组合进行查找,但不支持 b,c进行查找。当使用最左侧字段时,索引就十分有效。

创建表test如下:

create table test(
    a int,
    b int,
    c int,
    KEY a(a,b,c)
);

比如(a,b,c)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(a=? and b=? and c=?)这样的数据来检索的时候,b+树会优先比较a列来确定下一步的所搜方向,如果a列相同再依次比较b列和c列,最后得到检索的数据;但当(b=? and c=?)这样的没有a列的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候a列就是第一个比较因子,必须要先根据a列来搜索才能知道下一步去哪里查询。比如当(a=? and c=?)这样的数据来检索时,b+树可以用a列来指定搜索方向,但下一个字段b列的缺失,所以只能把a列的数据找到,然后再匹配c列的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

以下通过例子分析索引的使用情况,以便于更好的理解联合索引的查询方式和使用范围。

一、多列索引在and查询中应用

select * from test where a=? and b=? and c=?;-- 查询效率最高,索引全覆盖。
select * from test where a=? and b=?;        -- 索引覆盖a和b。
select * from test where b=? and a=?;        -- 经过mysql的查询分析器的优化,索引覆盖a和b。
select * from test where a=?;                -- 索引覆盖a。
select * from test where b=? and c=?;        -- 没有a列,不走索引,索引失效。
select * from test where c=?;                -- 没有a列,不走索引,索引失效。

二、多列索引在范围查询中应用

select * from test where a=? and b between ? and ? and c=?;-- 索引覆盖a和b,因b列是范围查询,因此c列不能走索引。
select * from test where a between ? and ? and b=?;        -- a列走索引,因a列是范围查询,因此b列是无法使用索引。
select * from test where a between ? and ? and b between ? and ? and c=?;-- a列走索引,因a列是范围查询,b列是范围查询也不能使用索引。

三、多列索引在排序中应用

select * from test where a=? and b=? order by c;              -- a、b、c三列全覆盖索引,查询效率最高。
select * from test where a=? and b between ? and ? order by c;-- a、b列使用索引查找,因b列是范围查询,因此c列不能使用索引,会出现file sort。

四,总结

联合索引的使用在写where条件的顺序无关,mysql查询分析器会进行优化而使用索引。但是减轻查询分析器的压力,最好和索引的从左到右的顺序一致。

使用等值查询,多列同时查询,索引会一直传递并生效。因此等值查询效率最好。

索引查找遵循最左侧原则。但是遇到范围查询列之后的列索引失效。

排序也能使用索引,合理使用索引排序,避免出现file sort。

 

标签:找到,查询,索引,Mysql,test,--,where,select
From: https://www.cnblogs.com/yifanSJ/p/17579689.html

相关文章

  • ubuntu22.04部署mysql---主从
    1、首先部署mysql主服务:详见上一篇《ubuntu22.04部署mysql---单机》https://blog.51cto.com/u_14175560/6766135上述部署好后,主节点server_id:vim/etc/mysql/my.cnf##新增配置:[mysqld]server_id=1重启mysql:systemctlrestartmysql登录mysql,指定从节点IP,运行下述(注意修改......
  • Centos8/linux下载、安装、配置、连接MySQL5.7(rpm方式)
    目录问题现象:问题分析:解决方法:下载:安装:配置:连接:拓展 问题现象:    今天在使用Centos8安装MySQL5.7的rpm包时,出现如下报错:        仓库"MySQL5.7CommunityServer"的GPG公钥已安装,但是不适用于此软件包。        最终问题解决了,但......
  • es和mysql的查询语句对比
    ES(Elasticsearch)和MySQL是两种常用的数据库查询工具,它们在查询语句的使用和对应关系上有一些区别。本文将对比ES和MySQL的查询语句,并详细介绍它们的对应关系。首先,我们来看一下ES的查询语句。ES是一种分布式搜索和分析引擎,它使用JSON格式的查询语句来进行数据检索。ES的查询语句可......
  • 深入理解Mysql索引
    在数据库中,最常用的SQL操作之一就是SELECT语句,它负责数据的检索。而在SELECT语句背后,与索引的交互密不可分。为了优化数据库性能和加快查询速度,开发者们往往优先考虑调整索引。让我们深入了解索引的背后故事。这篇文章将从什么是索引,索引的分类,索引的底层数据数据结构,跟大家一起......
  • 携程海外MySQL如何实现毫秒级数据复制?
    一、前言 在携程国际化战略背景下,海外业务将成为新的发力点,为了保证用户高品质的服务体验,底层数据势必需要就近服务业务应用。一套标准且普适的数据复制解决方案能够提升业务决策效率,助力业务更快地触达目标用户。 DRC(DataReplicateCenter)作为携程内部数......
  • 【博客索引】Welcome!!
    欢迎来到Daniel_yzy的博客园个人简介初二,男,就读于长沙市一中双语实验学校。爱好OI,一生讨厌文化课。当然,也是唯物主义无神论者。已有npy,要问是谁的话可以私下问。博客索引游记篇【游记】NOI2023省选游记【游记】NOIP2022预备赛游记算法篇【算法】线段树学习笔记......
  • 常见的导致PG创建索引慢的原因
    1.表的大小问题如果表的数据很多,索引建立在大表上的时候,会导致建索引的时间很慢。所以如果表的数据量很多,可以考虑重新设计表结构或拆分表。可以考虑使用分区表,使用分区表来分割数据。这样在建立索引时,可以只对需要建立索引的分区进行操作,从而提高索引建立的速度。2.索引类型不同类......
  • Mysql占用CPU过高如何优化
    MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然CP会U占用过高。占用CPU过高,可以做如下考虑:1.打开慢查询日志,查询是否是某个SQL语句占用过多资源,如果是的话,可以对SQL语句进行优化,比如优化insert语句、优化groupby语句、优化orderby语句、优化join语句等等;2......
  • 【为什么写缓冲区 仅适用于非唯一普通索引页】
    MySQL的写缓冲区是一种提高写入性能和减少磁盘I/O操作的技术,它可以在内存中缓存待写入磁盘的数据。然而,它只适用于非唯一普通索引页,因为这些页的插入和更新操作比较频繁,并且它们的索引键不是唯一的,会有重复值。对于非唯一普通索引页,每次插入、更新操作都需要对索引键进行排序和查......
  • 【MySQL线上修改大表结构有哪些风险】
    (文章目录)1.背景在实际应用中,我们经常会遇到需要修改大表结构的情况,比如增加或删除字段、修改字段类型、添加或删除索引等。但是,这些修改操作都是要对线上数据库进行的,如果处理不当,就容易导致数据丢失、性能下降、系统崩溃等问题,给业务带来不可挽回的损失。因此,本文总结了MySQL......