我有下表(真实的有更多的列)。
CREATE TABLE `test`.`j_data` (
`j_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`j_name` VARCHAR(80) NULL DEFAULT NULL
PRIMARY KEY (`j_id`));
我们定期运行查询,其中使用的主列是 PK,例如
SELECT * FROM j_data WHERE j_id = 123;
但是我们现在希望运行很多查询,例如:
SELECT j_id FROM j_data WHERE j_name = xxx;
这会受益于j_name
和上的覆盖索引吗j_id
?
ADD INDEX `j_name_id` (`j_name` ASC, `j_id` ASC);
还是索引就j_name
足够了?这是一个很大的表,所以如果它不太可能帮助我,我不想花时间添加索引。
简短的回答:是的。
长答案:
您正在使用 InnoDB,对吗?(运行
SHOW CREATE TABLE j_data
以找出引擎是什么。)在 InnoDB 中,每个“二级索引”(对比“主键”)都默默地包含一个主键的副本。
所以...
INDEX(j_name)
恰好与INDEX(j_name, j_id)
.提示:有时您会意识到在所有列前加上表名(“j_”)是不必要的混乱。