首页 > 解决方案 > WHERE 条件中的索引仅出现在“POSSIBLE_KEYS”中

问题描述

我在 MySQL 5.7 中有一个查询,例如:

select c1,count(distinct c2) as cnt from tbA 
where c3 >= '2020-09-01 00:00:00' and c3 < '2020-09-02 12:00:00' 
group by 1

我将一般索引分别放在 c1、c3 上,但解释显示:

SELECT_TYPE: SIMPLE
POSSIBLE_KEYS: c1,c3
KEY: c1

为什么 c3 的索引只出现在“POSSIBLE_KEYS”中而没有最终使用?如何使用这个索引?


表架构:

CREATE TABLE `tbA` (
  `id` bigint(20) NOT NULL,
  `c2` int(11) DEFAULT NULL,
  `c1` int(11) DEFAULT NULL,
  `channel_id` int(11) DEFAULT NULL,
  `c3` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `audit_create` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
  `audit_update` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
  PRIMARY KEY (`id`),
  KEY `idx_uid` (`c1`),
  KEY `login_time` (`c3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

标签: mysqlsql

解决方案


MySQL(可能还有其他所有数据库)只使用一个索引来访问表。

解释计划告诉您的是它正在考虑使用任一索引c1c3,但它认为这c1是最好的。

您可以通过在(c1, c3). 但是,您不能在同一个表引用上使用两个单独的索引。


推荐阅读