mysql索引的一个问题(跳过某一列,仍然可以使用索引)

一梦二三年
  • 21
CREATE TABLE `db0206`.`article`(  
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `author_id` INT(11) UNSIGNED NOT NULL,
  `category_id` INT(11) UNSIGNED NOT NULL,
  `views` INT(11) UNSIGNED NOT NULL,
  `comments` INT(11) UNSIGNED NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `content` TEXT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8;
CREATE INDEX idx_article_cv ON article(category_id,views);

explain结果

clipboard.png

为什么会用到(category_id,views)这个联合索引呢? 中间的range是如何跳过的?

回复
阅读 2.4k
4 个回答

根据最左前缀匹配原则,联合索category_id,views,可组成如下:category_id,category_id、views两种情况,所以走索引

idx_article_cv 这是是组合索引 而且 category_id放在前面
你的sql语句有用到这个字段 所以自然可以走这条索引。

selicoco
  • 1
新手上路,请多包涵

category_id根据左前缀匹配原则,走索引

从执行计划的type列是ref,以及ref列是const,可以看出,索引idx_article_cv只用到了最左列来定位数据

宣传栏