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

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是如何跳过的?

阅读 4.5k
4 个回答

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

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

新手上路,请多包涵

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题