gpt4 book ai didi

mysql - MySql 表中的简单计数 ID 需要很长时间

转载 作者:行者123 更新时间:2023-11-29 10:32:22 25 4
gpt4 key购买 nike

我必须拥有 6550 万行的表:1)

CREATE TABLE RawData1 (
cdasite varchar(45) COLLATE utf8_unicode_ci NOT NULL,
id int(20) NOT NULL DEFAULT '0',
timedate datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
type int(11) NOT NULL DEFAULT '0',
status int(11) NOT NULL DEFAULT '0',
branch_id int(20) DEFAULT NULL,
branch_idString varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (id,cdasite,timedate),
KEY idx_timedate (timedate,cdasite)
) ENGINE=InnoDB;

2)具有分区的同一个表(称为 RawData2)

PARTITION BY RANGE ( TO_DAYS(timedate))
(PARTITION p20140101 VALUES LESS THAN (735599) ENGINE = InnoDB,
PARTITION p20140401 VALUES LESS THAN (735689) ENGINE = InnoDB,
.
.
PARTITION p20201001 VALUES LESS THAN (738064) ENGINE = InnoDB,
PARTITION future VALUES LESS THAN MAXVALUE ENGINE = InnoDB);

我正在使用相同的查询:

SELECT count(id) FROM RawData1
where timedate BETWEEN DATE_FORMAT(date_sub(now(),INTERVAL 2 YEAR),'%Y-%m-01') AND now();

2个问题:1. 为什么分区表比普通表运行时间更长?2. 常规表在 17.094 秒返回 36380217。这正常吗,所有研发负责人都觉得速度不够快,需要~2秒返回。

我需要检查/做/更改什么?在不到 3-4 秒的时间内扫描 35732495 行并检索 36380217 行是否现实?

最佳答案

  • 您已经找到了一个示例来说明原因 PARTITIONing不是性能 Elixir 。
  • id在哪里从哪里来?
  • cdasite 有多少个不同的值?如果是数千而不是数百万,则构建一个映射 cdasite <=> id 的表并从庞大的 VARCHAR(45) 切换。到 MEDIUMINT UNSIGNED (或任何适当的)。该项目可能有最大帮助,但可能还不够。
  • 同上 status ,但可能使用 TINYINT UNSIGNED 。或者想想 ENUM。要么是 1 个字节,要么是 4 个字节。
  • (20)INT(20)没有任何意义。您将得到一个 4 字节整数,上限约为 20 亿。
  • 您确定没有重复的 timedates
  • branch_idbranch_idString -- 这闻起来像是一对需要放在另一个表中,只留下 id 的地方?
  • 更小 -> 更快。​​
  • COUNT(*)COUNT(id) 相同自 idNOT NULL .
  • 在需要之前不要包含 future 的分区;它会减慢速度。 (并且根本不要使用分区。)

为了更快地获得查询,请构建并维护汇总表。它至少有一个 DATEPRIMARY KEY并且至少COUNT(*)作为一个列。然后查询将从该表中获取。有关汇总表的更多信息:http://mysql.rjweb.org/doc.php/summarytables

关于mysql - MySql 表中的简单计数 ID 需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158177/

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