Mysql使用联合主键时,并不是每个主键字段都能使用索引

通过实验验证,在Mysql中使用联合主键时,仅首位字段能有效利用索引进行查询优化,后续字段则无法直接使用索引,需额外创建。此特性与字段在联合主键中的顺序密切相关。

问题:Mysql使用联合主键时,每个主键字段都能使用索引吗?

对于这个问题,很多mysql的初学者都是搞不清楚的,今天作者做了一个实验,来验证这个问题,防止在应用环境中不当的使用索引,导致mysql性能下降。

实验环境:

  • mysql 5.7
  • InnoDB引擎

表结构:

用两个测试表做实验,testuser1:

CREATE TABLE `testuser1` (
	`id` INT(11) NOT NULL,
	`name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
	`age` INT(11) NOT NULL,
	`gender` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
	PRIMARY KEY (`id`, `age`)
)
COLLATE='utf8_bin'
ENGINE=InnoDB
;

testuser2:

CREATE TABLE `testuser2` (
	`id` INT(11) NOT NULL,
	`name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
	`age` INT(11) NOT NULL,
	`gender` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
	PRIMARY KEY (`age`, `id`)
)
COLLATE='utf8_bin'
ENGINE=InnoDB
;

可以看到,两个表的字段顺序是一样的,也同样使用了联合主键,id和age两个字段,不同的是testuser1使用的联合主键顺序是id在前age在后,testuser2是age在前id在后。

这里使用explain语句来看索引的使用情况

可以看到对于testuser1表来说。用id字段查询的时候用到了主键索引,用age字段查询的时候没有用到索引

对于testuser2表来说,用id字段查询的时候没有用到主键索引,用age字段查询的时候用到了主键索引。

结论

这就说明,在mysql中,主键索引的顺序很重要,只有在第一位的字段在查询时才可以用到索引,后面的字段都用不到索引。如果要频繁查询,需要另外建立索引。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值