这种索引真的能用吗

2022-08-08 21:11:07 +08:00
 cnoder

今天看到一张表

CREATE TABLE `data` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `xx_id` varchar(128) NOT NULL,
   ··· 一些普通字段
  PRIMARY KEY (`id`,`create_time`) USING BTREE,
  KEY `Index_xx_id` (`xx_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=320 DEFAULT CHARSET=utf8
/*!50500 PARTITION BY RANGE  COLUMNS(create_time)
(PARTITION p202206 VALUES LESS THAN ('2022-07-01') ENGINE = InnoDB,
 PARTITION p202207 VALUES LESS THAN ('2022-08-01') ENGINE = InnoDB,

我 explain 了一下

  1. 仅使用 create_time range 查询 的时候不会命中索引
  2. 使用 xx_id=x 和 create_time range 的时候命中 xx_id 索引,理论上回表是能找到主键

理论上如果仅有 2 的情况下这表也不是不能用,他把 create_time 加到主键联合索引主要还是为了分区

1557 次点击
所在节点    程序员
3 条回复
rekulas
2022-08-08 21:26:59 +08:00
看起来是没什么用
nothingistrue
2022-08-09 09:44:20 +08:00
xx_id 这个索引是有效的,能不能用取决于业务上这个 xx_id 是否是检索条件。

为了分区把 create_time 加到主键之后,这个主键基本上是废了,既不是自然键也不是代理键,很难用。
lieyan
2022-08-09 10:50:03 +08:00
为什么不使用联合索引,而把 create_time 加入主键?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871517

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX