使用序列主键优化大型MariaDB表的INSERT性能

up9lanfz  于 10个月前  发布在  其他
关注(0)|答案(1)|浏览(58)

我有一个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性能?

nfg76nw0

nfg76nw01#

考虑一下对my.cnf或my.ini in [mysqld]部分的更改,

innodb_change_buffer_max_size=50  # to achieve additional INSERT speed.

字符串
注意,您可能需要添加这一行。
之前和之后的1000行INSERT的停止/开始时间。
额外的可能性,

SELECT @@innodb_write_io_threads;  to determine current number of threads


把写头数加倍。
最好的总是。

相关问题