我有一个MariaDB/MySQL表,它有一个包含序列id
的多列主键。
CREATE SEQUENCE events_id_sequence;
CREATE TABLE events(
id bigint unsigned DEFAULT (NEXT VALUE FOR events_id_sequence) NOT NULL,
saved_at timestamp(4) DEFAULT CURRENT_TIMESTAMP NOT NULL,
thing_id bigint(6) unsigned NOT NULL,
event_id smallint unsigned NOT NULL,
...
PRIMARY KEY (thing_id DESC, id DESC)
)
ENGINE=InnoDB, ROW_FORMAT=DYNAMIC;
字符串
我已经将测试数据导入到这个表中,并观察到对于几百万行,每个后续的INSERT都需要花费更多的时间来完成。数据以1000个事件为一批插入。
我希望在12个月内该表将包含大约2亿行,之后我打算删除旧事件。该表包括大约20 k个不同的thing_id
s,它主要用于INSERT和SELECT,如下所示:
SELECT * FROM events WHERE thing_id=<X> AND ... ORDERED BY id DESC LIMIT <Y>;
型
我使用主键将来自相同源(thing_id
)的事件聚集在一起,并以相反的插入顺序对事件进行排序。
关于INSERT性能下降,我有以下问题:
1.当表变大并且MariaDB必须检查主索引的唯一性时,我对缓慢的INSERT的担忧是不可避免的吗?
1.使用AUTO_INCREMENT
类型是否会带来性能差异?
1.有人能为我的任务建议一个更优化的方案或策略吗?
1.是否应该考虑对表进行分区?
1.哪些MariaDB配置选项值得检查以提高INSERT性能?
1条答案
按热度按时间nfg76nw01#
考虑一下对my.cnf或my.ini in [mysqld]部分的更改,
字符串
注意,您可能需要添加这一行。
之前和之后的1000行INSERT的停止/开始时间。
额外的可能性,
型
把写头数加倍。
最好的总是。