我有一张这样的表:
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次插入(由C程序读取流并在symbol_id上聚合)。但是,我可以先对数据进行排序,然后按symbol_id ASCENDING按顺序插入。会使这个批量插入更快吗?
第二个问题是,BTREE是索引的最佳选择吗?从文档中,我可以使用HASH,但不确定哪个最好......
唐
答案 0 :(得分:4)
不要认为您可能会对您提出的优化产生任何重大影响,但建议在此列出
http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html
当然可以帮助您更好地了解您的需求。
这句话可能有意义
表的大小减慢了log N插入索引的速度, 假设B树索引。
您可以使用以下方法加速插入:
如果您同时从同一客户端插入多行, 使用带有多个VALUES列表的INSERT语句来插入多个 一次排。这速度要快得多(有些速度要快很多倍) case)比使用单独的单行INSERT语句。如果你是 将数据添加到非空表,您可以调整 bulk_insert_buffer_size变量使数据插入更快。 请参见第5.1.3节“服务器系统变量”。
答案 1 :(得分:0)
这些文档表明按主键顺序插入可以提高性能:
<块引用>执行批量插入时,以 PRIMARY KEY 顺序插入行会更快。 InnoDB 表使用聚集索引,这使得按 PRIMARY KEY 的顺序使用数据相对较快。以 PRIMARY KEY 顺序执行批量插入对于不完全适合缓冲池的表尤为重要。
来源:https://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-bulk-data-loading.html
最好将此优化与@Igor 的回答中引用的批量插入语句结合起来。