mysql - 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
解决方案
MySQL(可能还有其他所有数据库)只使用一个索引来访问表。
解释计划告诉您的是它正在考虑使用任一索引c1
和c3
,但它认为这c1
是最好的。
您可以通过在(c1, c3)
. 但是,您不能在同一个表引用上使用两个单独的索引。
推荐阅读
- html - 从多个类中选择一个元素
- mplab - 如果我在不同的端口中有七个段引脚,我该怎么办?
- docker - 移除容器后存储的 Docker 设置
- zsh - zsh 可以读取保留的终端关键字吗?
- javascript - Firefox 扩展无法发出发布请求,但可以使用常规脚本标签
- double - 如何将两个双打合并在一起?
- python - 如何在 python 数据框中插入值?
- excel - 我必须创建一个代码,将前面的会计符号更改为不同的版本?
- python - 自定义状态代码应该放在 django 项目中的什么位置?
- grails - wslite 肥皂连接重置,soapui 正在使用相同的肥皂信封