添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
冲动的消炎药  ·  MySQL ...·  2 小时前    · 
没读研的冰淇淋  ·  mysql ...·  2 小时前    · 
大力的围巾  ·  Error: Variable is ...·  13 小时前    · 
痴情的甘蔗  ·  Autodesk软件 You need ...·  1 月前    · 
知识渊博的热带鱼  ·  Assertion ...·  2 月前    · 

一. 使用批量插入,将多条单独的 insert 合并成一次操作

即:insert into table values (a1, b1, c1), (a2, b2, c2);

解析:将多条 insert 合并后,减少MySQL日志量(即MySQL的 binlog 和 innodb 的事务日志),降低日志刷盘的数据量和频率,从而提高效率。通过合并多条 insert 语句,还能减少SQL语句的解析次数,减少和数据库的交互,减少了网络传输的IO。

二. 修改批量插入缓冲区大小参数: bulk_insert_buffer_size,调大批量插入的缓存

这个参数默认为 8M,例如设置成 100M

set global bulk_insert_buffer_size = 1024*1024*100;

三. 设置 innodb_flush_log_at_trx_commit = 0

相对于 innodb_flush_log_at_trx_commit = 1, 设置为 0 可以明显的提高导入的速度。

set global innodb_flush_log_at_trx_commit=0;

0: log buffer 中的数据将以每秒一次的频率写入到 log file 中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的 commit 并不会触发任何的 log buffer 到 log file 的刷新或者从文件系统到磁盘的刷新操作。

1: 在每次事务提交的时候将 log buffer 中的数据都会写入到 log file,同时也会触发文件系统到磁盘的同步;

2: 事务提交会触发 log buffer 到 log file 的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘的同步操作。

四. 设置事务提交为 手动提交

因为 MySQL 事务默认是自动提交的(autocommit),这样每插入一条数据,都会进行一次 commit,所以通过手动提交事务,可以减少创建事务时的消耗。一般可以设置为 1000 条insert 提交一次。
【解决方案1】:

通过在 my.cnf中添加以下行。我能够做到。

innodb_autoinc_lock_mode =2
sync_binlog=1
bulk_insert_buffer_size=512M
key_buffer_size=512M
read_buffer = 50M
Max_allowed_packet=1M
Net_buffer_length=8k

innodb_flush_log_at_trx_commit=2,我在另一个链接中看到它说它将速度提高到 160 倍。 输出性能:超过 24 小时到 2 小时;

通常将innodb_buffer_pool_size其配置为物理内存的50%到75%

innodb_flush_log_at_trx_commit,1改为了0

2.尝试修改参数加快导入速度

在MySQL中,有一对大名鼎鼎的“双一”参数,即 innodb_flush_log_at_trx_commit 与 sync_binlog 。为了安全性这两个参数默认值为1,为了快速导入脚本,我们可以临时修改下这两个参数,下面简单介绍下这两个参数:

innodb_flush_log_at_trx_commit默认值为1,可设置为0、1、2

如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。 如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去. 如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

sync_binlog默认值为1,可设置为[0,N)

当sync_binlog =0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。 当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

这两个参数可以在线修改,若想快速导入,可以按照下面步骤来操作:

# 1.进入MySQL命令行 临时修改这两个参数setglobalinnodb_flush_log_at_trx_commit = 2;setglobalsync_binlog = 2000;# 2.执行SQL脚本导入mysql -uroot -pxxxxxx testdb < testdb.sql# 3.导入完成 再把参数改回来setglobalinnodb_flush_log_at_trx_commit = 1;setglobalsync_binlog = 1;

还有另外一种场景是你的需求是新建从库,或者是不需要产生binlog,这时候导入SQL脚本时可以设置暂时不记录binlog,可以在脚本开头增加 set sql_log_bin=0; 然后再执行导入,这样速度会进一步加快。如果你的MySQL实例没有开启binlog则不需要再执行该语句了。

max_connection=1000

innodb_file_per_table=1

innodb_buffer_pool_size=1G

innodb_log_file_size=256M

innodb_log_buffer_size=256M

innodb_flush_log_at_trx_commit=2 需要放mysqlld_safe节点下。

symbolic-links=0
innodb_lru_scan_depth=256
#sync_binlog=0
#innodb_flush_log_at_trx_commit=0
wait_timeout=2880000
#interactive_time=2880000
max_allowed_packet=1G
max_connections = 1000
innodb_file_per_table=1
innodb_buffer_pool_size=10G
innodb_log_file_size=256M
innodb_log_buffer_size=256M
bulk_insert_buffer_size = 1G
innodb_flush_log_at_trx_commit=0
innodb_autoinc_lock_mode =2
sync_binlog=0
bulk_insert_buffer_size=512M
key_buffer_size=512M
#read_buffer=50M
net_buffer_length=8k
character_set_server = utf8mb4
sql_mode = NO_ENGINE_SUBSTITUTION

MySQL大数据量插入数据参数优化

 关于一些配置项优化
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock

[mysql.server]
pid-file = /var/lib/mysql/localhost.pid

[mysqld]
port = 3306
socket =/var/lib/mysql/mysql.sock

# 网络传输中一次消息传输量的最大值。系统默认值 为1MB,最大值是1GB,必须设置1024的倍数。
# 因为后续我们在代码中是使用prepareStatement.addBatch(),单次传输的值会比较大,所以这个参数必须加大。
max_allowed_packet = 32M
# 缓冲池大小,只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。
innodb_buffer_pool_size = 5120M
innodb_buffer_pool_instances=3
innodb_additional_mem_pool_size = 1024M
innodb_log_files_in_group = 3
innodb_lock_wait_timeout = 120
# 刷新日志频率
open_files_limit = 10240
back_log = 600
innodb_log_file_size=110M
# 连接数
max_connections = 3000
max_connect_errors = 6000
# 多线程
thread_cache_size = 300
thread_concurrency = 16
thread_stack = 192KB
innodb_write_io_threads = 32
innodb_purge_threads=1
# 刷新脏页频率
innodb_max_dirty_pages_pct=90
wait_timeout=300

详细的参数配置
innodb缓冲池相关配置


MySQL性能优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。   经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。   1. 一条SQL语句插入多条数据。   常用的插入语句如:   INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   VALUES ('0', 'userid_0', 'content_0', 0 文章目录一、前言二、批量插入前准备1、插入到数据表的字段2、计算一行字段占用的空间3、在数据里做插入操作的时候,整体时间的分配三、批量插入数据测试1、SQL语句的大小限制2、查看服务器上的参数:3、计算一次能插入的最大行记录4、测试插入数据比对(1)插入11W条数据,按照每次10,600,1000,20000,80000来测试:(2)加大数据量到24w(3)加大测试量到42W5、如果插入的值就是s... 需要将大量数据(大概5W条)插入MySQL数据库,用普通的SQL Statement执行,时间大概是几分钟。于是想到用PreparedStatement,但是改了之后发现效率并没有很大的提升。不成,想到了load data local infile...命令,以前一直认为这条命令仅限MySQL终端上使用而不是标准的SQL语句,今天看了几篇文章之后有了很大的收获。 1. 使用PreparedSta ResourceBundle p = ResourceBundle.getBundle("db"); public int addUser(List<String> params) { int j = 0; Connection conn = null; PreparedStatement pstmt = null; mysql批量insert数据的方法:1、循环插入;2、减少连接资源,拼接一条sql;3、使用存储过程;4、使用【MYSQL LOCAL_INFILE】。本教程操作环境:windows7系统、mysql8.0.22版,该方法适用于所有品牌电脑。mysql批量insert数据的方法:方法一:循环插入这个也是最普通的方式,如果数据量不是很大,可以使用,但是每次都要消耗连接数据库的资源。大致思维如下(我... 这里写自定义目录标题欢迎使用Markdown编辑器创建数据库新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何 记录MySQL插入大数据一些方案的测试心得,即for循环插入、拼接SQL语句、批量插入saveBatch()、循环插入 + 开启批处理模式,该4种情况的测试内容,最终以平均耗时来预测各方案的性能问题,可得知开启批处理模式的方案效率是最高的,但是必须注意一个点:一定要开启批处理模式,在URL地址加入rewriteBatchedStatements = true 参数,否则即使是在批量插入情况下,也是无法发挥该方法优点。 普通使用的插入语句: insert into table (col1,col2,col3) values (’ 1’,’ John ‘,’ stu ‘); insert into table (col1,col2,col3) values (’ 2’,’ Jan ‘,’ stu ‘); insert into table (col1,col2,col3) values (’ 3 ‘,’ Billy ‘,’ stu '); 插入操作时 對於一些數據量較大的系統,數據庫面臨的問題除了查詢效率低下,還有就是數據入庫時間長。特別像報表系統,每天花費在數據導入上的時間可能會長達幾個小時或十幾個小時之久。因此,優化數據庫插入性能是很有意義的。經過對MySQL innodb的一些性能測試,發現一些可以提高insert效率的方法,供大家參考參考。1. 一條SQL語句插入多條數據。常用的插入語句如:1234INSERTINTO`insert_t... 我的数据库环境是mysql Ver 14.14 Distrib 5.6.45, for Linux (x86_64) using EditLine wrapper这个数据库是安装在T440p的虚拟机上的,操作系统为CentOs6.5.我的数据表是这样的:CREATE TABLE `emp` (`Id` ) NOT NULL AUTO_INCREMENT,`name` ) DEFAULT NULL,... 今天我带来了一个demo,不仅让你能把多线程运用到实际项目中,还能用它往数据库造测试数据,让你体验下大数据量的表优化 定个小目标,今天造它一亿条数据 首先搞清楚,不要为了用技术而用技术,技术一定是为了实现需求: