2

我有一张这样的桌子:

create table stream_last
(
        symbol_id       integer,
        high            decimal(8,2),
        low             decimal(8,2),
        last            decimal(8,2),
        volume          integer,
        last_updated    datetime,
        INDEX USING BTREE(symbol_id)
) ENGINE=MEMORY;

我需要每 5 秒进行大约 4,000 次插入(由读取流并在 symbol_id 上聚合的 C 程序爆破)。但是,我可以先对数据进行排序,然后按 symbol_id ASCENDING 顺序插入。这会让这个批量插入更快吗?

第二个问题是,BTREE 是索引的最佳选择吗?从文档中,我本可以使用 HASH 但不确定哪个是最好的......

大学教师

4

2 回答 2

4

不要认为您可能会通过您提出的优化获得任何显着差异,但此处列出的建议

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

当然可以帮助您更好地了解您的需求。

这句话可能有道理

假设 B-tree 索引,表的大小会减慢 log N 的索引插入速度。

您可以使用以下方法来加快插入速度:

如果您同时从同一个客户端插入多行,请使用带有多个 VALUES 列表的 INSERT 语句一次插入多行。这比使用单独的单行 INSERT 语句要快得多(在某些情况下快很多倍)。如果要向非空表添加数据,则可以调整 bulk_insert_buffer_size 变量以使数据插入更快。请参见第 5.1.3 节,“服务器系统变量”。

于 2012-04-19T00:28:02.263 回答
0

这些文档建议按主键顺序插入可以提高性能:

执行批量插入时,以 PRIMARY KEY 顺序插入行会更快。InnoDB 表使用聚集索引,这使得按 PRIMARY KEY 顺序使用数据相对较快。以 PRIMARY KEY 顺序执行批量插入对于不完全适合缓冲池的表尤其重要。

资料来源:https ://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-bulk-data-loading.html

最好将此优化与@Igor 的答案中引用的批量插入语句结合起来。

于 2021-04-24T00:26:05.413 回答