我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql联合索引详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql联合索引详解

比较简单的是单列索引(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。

 

来源地址:https://blog.csdn.net/2301_78145669/article/details/131141410

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql联合索引详解

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

下载Word文档

猜你喜欢

mysql的联合索引(复合索引)的实现

联合索引 本文中联合索引的定义为(MySQL):ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`);联合索引的优点 若多个一条SQL,需要多个用到两个条件SELECT * FR
2022-05-29

MYSQL联合唯一索引

https://blog.csdn.net/weistin/article/details/79698996
MYSQL联合唯一索引
2019-08-28

MYSQL创建联合索引

在创建表的时候即指定联合索引,例如 -- 如果存在表,则删除DROP TABLE IF EXISTS core_fund_shares -- 创建表CREATE TABLE `core_fund_shares` ( `fund_code`
2023-08-30

[MySQL] mysql索引的长度计算和联合索引

1.所有的索引字段,如果没有设置not null,则需要加一个字节。2.定长字段,int占4个字节、date占3个字节、char(n)占n个字符。3.变长字段,varchar(n),则有n个字符+两个字节。4.不同的字符集,一个字符占用的字节数不同。latin
[MySQL] mysql索引的长度计算和联合索引
2021-12-22

mysql联合索引失效怎么解决

当MySQL联合索引失效时,可以考虑以下几个解决办法:1. 重新设计索引:检查当前的联合索引是否满足查询需求,如果不满足,可以重新设计合适的索引来优化查询效果。可以尝试不同的索引策略,比如创建多个独立的索引来代替联合索引。2. 优化查询语句
2023-10-25

MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引详细介绍

目录一、索引类型二、聚簇索引和非聚簇索引三、覆盖索引四、联合索引最左前缀匹配原则索引下推五、唯一索引一、索引类型索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性能和特性更适合于构建
2023-04-19

MySQL 独立索引和联合索引的选择

通常会对多列索引缺乏理解,常见的错误是将很多列设置独立索引,或者是索引列使用错误的次序。我们在下一篇讨论索引列次序的问题,首先看一下多列独立索引的情况,以下面的表结构为例:CREATE TABLE test (c1 INT,c2 INT,c
2022-06-01

【MySQL】MySQL索引详解

Mysql索引 0.写在前面1.为什么要使用索引2.常见的索引模型3.索引维护4.回表?举例子。 0.写在前面 文章中包含了: 1.什么是索引 2.索引的数据结构,以及各自的使用场景 3.为什么要设置主键自增? 4.基于主键
2023-08-16

MySQL联合索引怎么使用

MySQL联合索引是指在一个表中同时使用多个列作为索引的方式,可以提高查询效率。使用方法如下:创建联合索引:ALTER TABLE 表名 ADD INDEX 索引名称 (列1, 列2, 列3, ...);例如:ALTER TABLE
2023-10-27

mysql怎么创建联合索引

在MySQL中,可以使用CREATE INDEX语句来创建联合索引。创建联合索引的语法如下:CREATE INDEX index_name ON table_name (column1, column2, ...);其中,index_n
mysql怎么创建联合索引
2024-02-29

编程热搜

目录