如何优化MySQL insert性能
发布网友
发布时间:2022-04-07 16:56
我来回答
共2个回答
热心网友
时间:2022-04-07 18:25
这个问题可深可浅,MySQL的写效率一直被人诟病。
简单的来说你可以用批量插入, insert into table (key1,key2) values(1,2),(1,2).........
当然你可能已经用这种方法了,但结果还是慢,那就先查看你用的是MyISAM还是Innodb。
如果你使用的是innodb,修改innodb缓存innodb_buffer_pool_size一般是你内存的60%, innodb_flush_log_at_trx_commit = 0或2, 提高日志更新效率; innodb_thread_concurrency 根据你CPU的核数来调整。
到最后你可能发现这些东西都不能真正的提高insert的速度,这就是被人诟病的mysql写性能。 你智能用load data infile的方式,这是一种快速的终极方法,但代价是不能保证事物处理的原子性,而且不允许在存储过程中使用。
我以前在这个问题上挣扎了很久,最终的方法是修改业务策略,数据存放尽量精简,减少对Mysql的读写,这才是终极的解决之道。我曾经头痛的难题通过修改业务逻辑把更新速度从47分钟减少到0.02秒,只要结果一样就不用去折腾Mysql了
热心网友
时间:2022-04-07 19:43
对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是插入时间长。我们就有一个业务系统,每天的数据导入需要4-5个钟。
这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情。因此,提高大数据量系统的MySQL insert效率是很有必要的。
1. 一条SQL语句插入多条数据。
常用的插入语句如:
INSERTINTO`insert_table` (`datetime`, `uid`, `content`, `type`) VALUES('0', 'userid_0', 'content_0', 0);
INSERTINTO`insert_table` (`datetime`, `uid`, `content`, `type`) VALUES('1', 'userid_1', 'content_1', 1);
修改成:
INSERTINTO`insert_table` (`datetime`, `uid`, `content`, `type`) VALUES('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);
修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因有两个,一是减少SQL语句解析的操作, 只需要解析一次就能进行数据的插入操作,二是SQL语句较短,可以减少网络传输的IO。
2. 在事务中进行插入处理。把插入修改成:
START TRANSACTION;
INSERTINTO`insert_table` (`datetime`, `uid`, `content`, `type`) VALUES('0', 'userid_0', 'content_0', 0);
INSERTINTO`insert_table` (`datetime`, `uid`, `content`, `type`) VALUES('1', 'userid_1', 'content_1', 1);
...
COMMIT;
使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内进行真正插入处理。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。