gpt4 book ai didi

mysql where + group by 很慢

转载 作者:行者123 更新时间:2023-11-29 04:01:55 31 4
gpt4 key购买 nike

一个我应该能够自己回答但我没有,而且在谷歌中也找不到任何答案的问题:

我有一个表,其中包含具有以下结构的 500 万行:

CREATE TABLE IF NOT EXISTS `files_history2` (
`FILES_ID` int(10) unsigned DEFAULT NULL,
`DATE_FROM` date DEFAULT NULL,
`DATE_TO` date DEFAULT NULL,
`CAMPAIGN_ID` int(10) unsigned DEFAULT NULL,
`CAMPAIGN_STATUS_ID` int(10) unsigned DEFAULT NULL,
`ON_HOLD` decimal(1,0) DEFAULT NULL,
`DIVISION_ID` int(11) DEFAULT NULL,
KEY `DATE_FROM` (`DATE_FROM`),
KEY `FILES_ID` (`FILES_ID`),
KEY `CAMPAIGN_ID` (`CAMPAIGN_ID`),
KEY `CAMP_DATE` (`CAMPAIGN_ID`,`DATE_FROM`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

当我执行

SELECT files_id, min( date_from )
FROM files_history2
WHERE campaign_id IS NOT NULL
GROUP BY files_id

查询以“正在发送数据”状态停留了八个多小时(然后我终止了该进程)。

这里解释一下:

id  select_type     table           type    possible_keys           key     key_len     ref     rows        Extra
1 SIMPLE files_history2 ALL CAMPAIGN_ID,CAMP_DATE NULL NULL NULL 5073254 Using where; Using temporary; Using filesort

我假设我生成了必要的键,但查询应该花费那么长时间,是吗?

最佳答案

我建议使用不同的索引...索引(Files_ID、Date_From、Campaign_ID)...

由于您的分组依据在 Files_ID 上,因此您希望将这些分组。然后是 MIN(Date_From),所以它排在第二位......然后最后是 Campaign_ID 有资格不为空,这就是为什么......

如果您将所有事件 ID 放在首位,太棒了,请将所有 NULL 移开……现在,您有 1,000 个事件,并且 Files_ID 跨越许多事件,它们还跨越许多日期,您会感到窒息。

根据我正在投影的索引,首先是 Files_ID,您已经订购了每个“files_id”以匹配您的分组依据。然后,在其中,所有最早的日期都在索引列表的顶部......太好了,几乎就在那里,然后,通过事件 ID。跳过可能存在的任何 NULL,你就完成了,继续下一个 Files_ID

希望这是有道理的——除非您有大量带有 NULL 值(value)事件的条目。

此外,通过使索引的所有 3 个部分都匹配查询的条件和输出列,它永远不必返回原始数据文件来获取数据,它直接从索引中获取所有数据。

关于mysql where + group by 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13387927/

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