gpt4 book ai didi

MySQL 不使用多列索引

转载 作者:行者123 更新时间:2023-11-29 05:29:03 27 4
gpt4 key购买 nike

我对 where 子句中的列进行查询,这些列是主键的一部分,并且在所有列上都有外键索引。

EXPLAIN SELECT   aggEI.c_id AS companyId, aggEI.ei_uid AS uuid
FROM AGG_EI AS aggEI
WHERE aggEI.c_id in (8) and aggEI.tg_id IN (1,2,3,4,5,6,7)
AND aggEI.dt_id = 20130506

我还在 (c_id,tg_id,dt_id) 上定义了多个列索引,但是 EXPLAIN 显示它正在使用外键索引c_id

 1 SIMPLE   aggEI   ref PRIMARY,datedm_id_UNIQUE,agg_ei_comdm_fk_idx,agg_ei_datedm_fk_idx,agg_ei_topgrp_fk_idx,comp_uuid    agg_ei_comdm_fk_idx 8   const   65986   Using where; Using index

agg_ei_comdm_fk_idx 是c_id 上的外键索引,comp_uuid 是(c_id,tg_id,dt_id)

谁能解释一下为什么会这样

编辑:创建表

          'CREATE TABLE `AGG_EI` (
`dt_id` int(11) NOT NULL,
`c_id` bigint(20) NOT NULL,
`tg_id` bigint(20) NOT NULL,
`ei_uid` varchar(150) NOT NULL
`ei_name` varchar(150) NOT NULL,
`rating` double NOT NULL,
`cnt` double NOT NULL
PRIMARY KEY (`dt_id`,`c_id`,`tg_id`,`ei_uid`),
UNIQUE KEY `datedm_id_UNIQUE` (`dt_id`,`c_id`,`ei_uid`,`tg_id`),
KEY `agg_ei_comdm_fk_idx` (`c_id`),
KEY `agg_ei_datedm_fk_idx` (`dt_id`),
KEY `agg_ei_topgrp_fk_idx` (`tg_id`),
KEY `comp_uuid` (`c_id`,`tg_id`,`dt_id`),
CONSTRAINT `agg_ei_comdm_fk` FOREIGN KEY (`c_id`) REFERENCES `COMPDM` (`c_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `agg_ei_datedm_fk` FOREIGN KEY (`dt_id`) REFERENCES `DATEDM` (`dt_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `agg_ei_topgrp_fk` FOREIGN KEY (`tg_id`) REFERENCES `TOPGRP` (`tg_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8'

最佳答案

MySQL 正在使用它认为执行最佳的计划执行查询。更有可能的是,它确定将 c_id 限制为单个值会将结果集减少到足够少的行,以至于不值得麻烦处理其他索引中的额外列。 MySQL 的最佳猜测是仅使用 c_id 来限制行然后仅在内存中过滤这些行会更快。仅仅因为您有索引并不意味着这是最快的计划。

关于MySQL 不使用多列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16708621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com