关于多列(复合)索引使用时的一个小问题

本文通过实例探讨了MySQL中复合索引的使用情况,特别是当查询条件不包含索引第一列或使用OR连接时索引的利用问题。文章揭示了在某些情况下,即使不完全匹配复合索引的所有列,索引仍然可以被有效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看官方文档 发现一个关于多列索引的一个问题见链接:

http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html

里面有这么一段话:

Suppose that a table has the following specification:

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);

... .... 中间省略一部分

However, the name index is not used for lookups in the following queries:

SELECT * FROM test WHERE first_name='Michael';

SELECT * FROM test  WHERE last_name='Widenius' OR first_name='Michael';
很多小伙伴可能会将上面的话理所当然的理解为:复合索引的情况下如果没有使用到索引的第一列做查询条件或者使用 复合索引列做查询条件单之间使用or 的时候无法使用索引。

好,那么见如下的实验:

测试表上的索引如下:

 PRIMARY KEY (`id`),
  KEY `ind_cmrd_cid_rt2` (`report_time`,`campaign_id`),
  KEY `ind_cmrd2` (`media_url`,`report_time`,`campaign_id`,`supplier_id`),
  KEY `ind_msdrid` (`media_url`,`supplier_id`,`display_count`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=888411116 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

1,查询所有列的情况


可见,查询*的时候走的是全表扫描,这符合手册的描述。

下面是手册中没提到的,这里需要说明一下,否则小伙伴们容易理所当然的认为都是走全表扫描:

如下:

2,查询索引列的情况


从图中可以看到,查询走了索引,并且是全索引扫描。


说白了,其实也没什么大事,个人感觉有可能有些偷懒的小伙伴容易偷懒推理,而导致误解。

good night !


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值