关于联合索引最左匹配原则问题

来源:6-3 索引优化策略(上)

qq_慕雪5448056

2019-10-08

CREATE TABLE test (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
uId int(10) unsigned NOT NULL,
chatId smallint(5) unsigned NOT NULL,
tId int(11) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY test_uId_chatId_tId (uId,chatId,tId) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;

test_uId_chatId_tId是联合索引,我理解的最左匹配原则,意思是where语句中应该有uId索引才起作用,但下面但语句,竟然也是使用了索引,这是什么原因?
mysql> explain select * from test where chatId = “1” and tId = “2”\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
partitions: NULL
type: index
possible_keys: NULL
key: test_uId_chatId_tId
key_len: 10
ref: NULL
rows: 1
filtered: 100.00
Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)

写回答

1回答

sqlercn

2019-10-09

理论上是需要有uid这一列的,但是目前MySQL对执行计划进行了优化,可以用到索引中的一此列来优化查询,具体可以使用explain format=json 来看一下详细的执行计划。

0
0

MySQL提升课程 全面讲解MySQL架构设计

面面俱到讲解影响MySQL性能的各个因素,让MySQL架构了然于胸。

4419 学习 · 547 问题

查看课程