2012-08-07 103 views
2

我在Mysql中有一个InnoDb表,它需要非常快速地处理插入操作(其他所有操作都可以尽可能慢地进行)。该表没有关系或索引自动递增的id和时间戳。Mysql InnoDB插入速度太慢?

我运行了一个来自多个客户端的脚本,在分配的时间插入尽可能多的记录(循环插入)并计算每秒的插入次数。

我每秒平均只能获得200次插入,我需要20000左右。性能不会随着运行脚本或运行脚本的计算机的客户端数量而改变。

有没有什么办法来加速这些插入的性能?

------编辑--------

感谢您的全力帮助。我无法将任何插入组合在一起,因为当我们启动所有插入时将来自多个连接。我最终将该表的引擎切换到了MyISAM,并且每秒的插入次数立即高达40,000。

+0

什么是服务器(CPU,内存,磁盘)的硬件?它是一个专用的MySQL服务器还是正在执行其他工作?一个好主意是运行某种基准,比如Percona的tpcc-mysql或者一些OLTP基准,以获得关于你的系统能够处理的真实结果。 – drew010 2012-08-07 20:44:30

回答

1

首先,执行在INSERTs一个TRANSACTION

START TRANSACTION; 

INSERT ... 

COMMIT; 

其次,将多行加批成单个INSERT声明:

START TRANSACTION; 

INSERT INTO table (only,include,fields,that,need,non_default,values) VALUES 
(1,1,1,1,1,1,1), 
(2,1,1,1,1,1,1), 
(3,1,1,1,1,1,1), 
...; 

COMMIT; 

最后,如果输入数据的格式正确,那么您可能会发现LOAD DATA INFILE表现比INSERT更好。

0

我建议使用多个刀片,试图在一个查询例如

INSERT INTO table 
    (title, description) 
VALUES 
    ('test1', 'description1'), 
    ('test2', 'description2'), 
    ('test3', 'description3'), 
    ('test4', 'description4') 

或尝试使用程序

2

您使用了哪个主键?

InnoDB使用聚簇索引,因此所有数据的顺序都与其主键索引相同。

如果您不使用自动增量类型的主键,那么它会对每个插入操作进行大型磁盘操作。它会推送所有其他数据并插入新元素。

更长参考,请检查http://dev.mysql.com/doc/refman/5.0/en/innodb-table-and-index.html