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。

 

### MySQL 索引详解 #### 1. 索引的作用 索引数据库中一种特殊的数据结构,其主要目的是加速数据检索过程。通过合理设计和使用索引,可以显著提升数据库的查询性能,减少查询所需的I/O操作[^1]。 #### 2. 常见的索引类型及其工作原理 MySQL支持多种类型的索引,每种索引适用于不同的场景: - **B+树索引** B+树索引是最常用的索引类型之一,在InnoDB存储引擎中广泛使用。它是一种多路平衡查找树,具有良好的插入、删除和查找性能。B+树的特点在于所有的叶子节点都位于同一层,并且这些节点之间有链表连接,便于范围查询[^4]。 - **哈希索引** 哈希索引基于哈希表实现,适合于精确匹配查询。它的特点是查询速度快,但在涉及范围查询或排序时表现较差,因为哈希索引无法提供有序性。 - **全文索引** 全文索引主要用于文本搜索,特别适合处理大量的文本数据。它可以快速定位包含特定单词或短语的记录,通常应用于MyISAM存储引擎[^4]。 - **空间数据索引(R-Tree)** R-Tree索引专为地理空间数据设计,能够高效地处理二维或多维空间对象的查询,比如地理位置信息系统的应用。 #### 3. 索引的优化方法 为了充分发挥索引的优势,需要遵循一些优化原则: - **排除不必要的索引** 过度创建索引不仅不会提高性能,反而会增加维护成本和写入开销。因此,应仅保留那些真正能带来收益的索引[^3]。 - **选择高选择性的列构建索引** 高选择性意味着该列的不同值比例较高,这样的索引更有可能被查询优化器选中并有效利用[^3]。 - **充分利用联合索引** 联合索引可以在多个列上共同定义一个索引,相比单独为每一列建索引更加节省资源并且可能获得更好的性能。不过需要注意的是,联合索引的有效性依赖于查询条件是否按照索引定义的顺序使用各列。 - **保持索引长度适中** 较短的索引可以加快扫描速度并节约存储空间。一般建议将索引长度控制在几十个字节之内[^3]。 - **防止隐式转换导致索引失效** 当查询条件中的数据类型与索引列不符时可能发生隐式转换,这往往会造成索引不可用的情况。所以要确保两者一致以维持索引效能[^3]。 - **采用覆盖索引** 如果某个查询所需的所有字段都可以从某索引中获取,则称为覆盖索引。这种方式避免了回表操作,极大地减少了磁盘IO次数和网络传输量[^3]。 - **监控和调整索引数量及大小** 大量冗余或者过大的索引占用内存较多,进而拖累整体系统性能。定期审查现有索引设置,依据实际业务需求做出相应增删改动作有助于长期稳定运行。 ```sql -- 创建复合索引的例子 CREATE INDEX idx_composite ON table_name(column1, column2); -- 使用EXPLAIN查看执行计划,判断是否有使用到合适的索引 EXPLAIN SELECT * FROM table_name WHERE condition; ``` 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知一NN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值