我正在使用MySQL连接器使用python。我的表中有将近6700万(14GB)的条目。每次我批量插入2K数据时,插入时间都非常长。
yesterday = date.today() - timedelta(days=1)
yesterday = yesterday.strftime('%Y-%m-%d')
params = {'date':yesterday}
对于另一个表(数据较少),插入速度很好(2-4秒)。
使用交易后:
Inserted 2000 rows in 23 Seconds
Inserted 2000 rows in 25 Seconds
Inserted 2000 rows in 29 Seconds
Inserted 2000 rows in 28 Seconds
如何提高速度?
我使用的是AWS RDS,Aurora MySQL版本5.7.12(db.t3.medium),CPU使用率为4%到8%。我的目标是将约50K数据插入表中。目前,该表已拥有近6700万(14GB)数据。必须尽快插入数据。几乎实时的数据对于客户端非常重要。该表有18列: id(PK自动递增),客户,序列号,批次,数据等。 索引为(customer,serial_number)-使组合唯一,成批-用于搜索,数据(唯一)。默认情况下,所有索引都是BTREE索引。 50K的插入时间应少于1分钟。但是目前大约需要15分钟。我尝试在空表上插入。它仅在5到7秒内即可插入50K数据。随着表中条目数的增加,插入过程的时间也在增加。
升级MySQL版本是否会加快插入过程的速度? 是拆分或分区表的最后一个选择吗? 我无法合并数据,因为每个数据都很重要,尤其是最近两年的数据。 请帮忙。
我的表模式已经在8列中具有一些默认值,并且这些数据以后再也不会更新,因为实时数据对我们非常重要。 正在进行的读取/写入操作并不多。根据RDS监视器显示,每秒几乎有2个选择,有时甚至有3个选择。
答案 0 :(得分:0)
我在UPDATE命令中遇到了同样的问题-某些延迟可能归因于Python的固有速度问题,但大多数可能是由于mySQL和常规服务器延迟所致。
我已经使用SQLite(本地数据库,“核心”中的所有内容)实现了“无服务器”,并且性能得到了改善。
答案 1 :(得分:0)
根据您的目标是,您可能会考虑几种选择。最终获得更多信息是有用的。
如果您只是想释放可用性,则可以考虑使用INSERT LOW PRIORITY
https://dev.mysql.com/doc/refman/5.7/en/insert.html
您使用哪种类型的数据库引擎?
桌上有什么索引?唯一索引?
是否可以插入具有默认值的行并稍后异步运行更新?
该表上同时发生了很多写/读操作吗?
答案 2 :(得分:0)
在my.cnf(或Windows的my.ini)中使用
innodb_flush_neighbors=2 # to expedite reducing innodb_buffer_pool_pages_dirty ASAP
innodb_change_buffer_max_size=50 # to expedite insert capacity per second
请参阅dba.stackexchange.com问题196715罗兰多的建议#2。
答案 3 :(得分:0)
不是MySQL方面的专家,但是您可以尝试以下几种策略