`

Mysql_存储过程插入大量数据时的效率问题

阅读更多
如果存储过程插入大量数据时的效率低下,可以手动开启事务,在批量操作之后再提交,可以使性能得到一定提升。

另外,以下的相关参数有非常大的影响,需要做一定设置和调整。

摘自:http://blog.csdn.net/mchdba/article/details/8664943
---------------------------------------------------------
在Innodb存储引擎中,事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现的,当开始一个事务的时候,会记录该事务的lsn(log sequence number)号; 当事务执行时,会往InnoDB存储引擎的日志
的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”,
innodb通过此方式来保证事务的完整性。也就意味着磁盘上存储的数据页和内存缓冲池上面的页是不同步的,是先写入redo log,然后写入data file,因此是一种异步的方式。



摘自:http://www.cnblogs.com/whiteyun/archive/2011/12/01/2270132.html
---------------------------------------------------------
innodb_buffer_pool_size
如果用Innodb,那么这是一个重要变量。相对于MyISAM来说,Innodb对于buffer size更敏感。MySIAM可能对于大数据量使用默认的key_buffer_size也还好,但Innodb在大数据量时用默认值就感觉在爬了。 Innodb的缓冲池会缓存数据和索引,所以不需要给系统的缓存留空间,如果只用Innodb,可以把这个值设为内存的70%-80%。和 key_buffer相同,如果数据量比较小也不怎么增加,那么不要把这个值设太高也可以提高内存的使用率。

innodb_additional_pool_size
这个的效果不是很明显,至少是当操作系统能合理分配内存时。但你可能仍需要设成20M或更多一点以看Innodb会分配多少内存做其他用途。

innodb_log_file_size
对于写很多尤其是大数据量时非常重要。要注意,大的文件提供更高的性能,但数据库恢复时会用更多的时间。我一般用64M-512M,具体取决于服务器的空间。

innodb_log_buffer_size
默认值对于多数中等写操作和事务短的运用都是可以的。如 果经常做更新或者使用了很多blob数据,应该增大这个值。但太大了也是浪费内存,因为1秒钟总会 flush(这个词的中文怎么说呢?)一次,所以不需要设到超过1秒的需求。8M-16M一般应该够了。小的运用可以设更小一点。

innodb_flush_log_at_trx_commit  (这个很管用)
抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。

innodb_flush_log_at_trx_commit

If the value of innodb_flush_log_at_trx_commit is 0, the log buffer is written out to the log file once per second and the flush to disk operation is performed on the log file, but nothing is done at a transaction commit. When the value is 1, the log buffer is written out to the log file at each transaction commit and the flush to disk operation is performed on the log file. When the value is 2, the log buffer is written out to the file at each commit, but the flush to disk operation is not performed on it. However, the flushing on the log file takes place once per second also when the value is 2. Note that the once-per-second flushing is not 100% guaranteed to happen every second, due to process scheduling issues.

The default value of this variable is 1 (prior to MySQL 4.0.13, the default is 0).

A value of 1 is required for ACID compliance. You can achieve better performance by setting the value different from 1, but then you can lose at most one second worth of transactions in a crash. With a value of 0, any mysqldprocess crash can erase the last second of transactions. With a value of 2, then only an operating system crash or a power outage can erase the last second of transactions. However, InnoDB's crash recovery is not affected and thus crash recovery does work regardless of the value.

Note
For the greatest possible durability and consistency in a replication setup using InnoDB with transactions, use innodb_flush_log_at_trx_commit=1, sync_binlog=1, and innodb-safe-binlog in your master server my.cnf file.

Caution
Many operating systems and some disk hardware fool the flush-to-disk operation. They may tellmysqld that the flush has taken place, even though it has not. Then the durability of transactions is not guaranteed even with the setting 1, and in the worst case a power outage can even corrupt theInnoDB database. Using a battery-backed disk cache in the SCSI disk controller or in the disk itself speeds up file flushes, and makes the operation safer. You can also try using the Unix commandhdparm to disable the caching of disk writes in hardware caches, or use some other command specific to the hardware vendor.
分享到:
评论

相关推荐

    MySQL_5.1_zh.chm & MySQL_5.5_en.chm文档

    MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,被广泛应用于网页应用程序,支持大量数据存储和处理。本文将围绕“MySQL_5.1_zh.chm & MySQL_5.5_en.chm”这两份文档,分别针对中文版和英文版的MySQL...

    C++操作MySQL大量数据插入效率低下的解决方法

    在C++中与MySQL数据库交互时,遇到大量数据插入效率低下的问题是一个常见的挑战。本篇文章将探讨如何通过优化代码和利用数据库特性来解决这个问题。首先,我们来看一个简单的示例代码,该代码尝试插入10000条数据到...

    c API 调用mysql存储过程完成增删改查

    在本例中,我们关注的是如何使用C API来调用MySQL数据库中的存储过程,以实现对数据的增、删、改、查(CRUD)操作。MySQL是一个广泛使用的开源关系型数据库管理系统,它提供了丰富的API供开发者使用。 首先,要使用...

    mysql大批量数据插入

    MySQL 大批量数据插入是指在短时间内将大量数据插入到 MySQL 数据库中,需要设计目标要求能支持平均每秒插入 1000 条数据以上。MySQL 提供了多种方法来实现大批量数据插入,包括使用批量插入语句、使用 LOAD DATA ...

    MySql_C 接口集合

    - **使用场景**:优化资源管理,尤其是在处理大量数据时。 #### 23. `mysql_get_client_info()` - **功能**:返回客户端版本信息。 - **使用场景**:版本兼容性检查,确保API与库版本匹配。 #### 24. `mysql_get_...

    提高mysql插入数据的速度.pdf

    - 在插入大量数据时,可以将多个INSERT语句合并在一起使用,以减少I/O操作的次数。例如,可以在一个INSERT语句中一次性插入多行数据,而不是一条一条地插入。使用“INSERT INTO table_name VALUES (...), (...), (....

    mysql_gui_tools_5.0

    这个版本引入了存储过程、触发器、视图、分区表等高级特性,支持更大的表和更多的并发连接,增强了复制功能,并提高了查询优化器的效率。 3. **图形化界面的优势**: - **易用性**:图形化界面使得数据库操作变得...

    mysql中文手册+mysql命令大全+mysql存储过程

    最后,"mysql存储过程.pdf"专注于MySQL的存储过程。存储过程是预编译的SQL语句集合,可以提高数据库操作的性能,减少网络流量,并增强数据安全。在PDF文档中,你将学习如何定义、调用和管理存储过程,以及如何使用...

    mysql_blob_tools

    MySQL Blob(Binary Large Object)类型是用来存储大对象数据的,如图像、音频、视频或任何二进制数据。`mysql_blob_tools`是一个针对MySQL数据库中Blob类型数据进行分析和统计的工具。它可以帮助用户处理和理解存储...

    Xml_2_Mysql.rar_XML mysql_mysql xml

    XML(eXtensible Markup Language)是一种用于标记数据的语言,常用于存储和传输结构化数据。...在实际应用中,这样的工具可以大大提高数据处理的效率,尤其是在需要将大量XML数据迁移到MySQL数据库时。

    mysql存储过程优化

    5. **批量插入数据**:当需要插入大量数据时,使用BULK INSERT或事务进行批量操作,而不是一条一条地插入。 6. **使用EXPLAIN分析查询**:通过EXPLAIN命令可以了解查询的执行计划,帮助找出可能存在的性能瓶颈。 7...

    MySQL-DropBox_dertz1_MYSQL_

    1. **MySQL基础知识**:MySQL是一种广泛使用的开源关系型数据库管理系统,它支持SQL语言,适用于处理大量数据。在CMS系统中,MySQL通常用于存储网站内容、用户信息、权限设置等。 2. **PHP编程**:PHP是一种服务器...

    mysql-WINDOWS--SERVICES.zip_HTTP_HTTP协议_MYSQL_数据采集_采集

    数据导入可以使用INSERT INTO语句,或者在大量数据情况下,考虑使用LOAD DATA INFILE语句,它能快速高效地批量插入数据。 在Windows服务程序中配置MySQL,可以使用MySQL的安装程序或“服务”管理工具。设置MySQL为...

    excel_to_mysql.rar_excel mysql_excel to mysql php_mysql to exce

    Excel是一款强大的电子表格软件,适合处理小型数据集,而MySQL则是一个高效的关系型数据库管理系统,适用于存储和处理大量结构化数据。本教程将介绍如何通过PHP编程语言将Excel表格的数据导入到MySQL数据库中。 ...

    mysql_批量数据脚本..

    4. **批量插入**:对于大量数据的插入,`LOAD DATA INFILE`命令比单个`INSERT`语句更高效,它可以快速地将数据从文本文件加载到表中。 5. **条件判断与循环**:在脚本中,可能使用`IF...ELSE`、`CASE`语句或存储...

    mysql存储过程实例

    MySQL存储过程是数据库管理系统中的一...对于大型项目或需要大量数据处理的场景,使用存储过程可以显著提升系统效率。因此,掌握MySQL存储过程的创建和使用对于任何从事MySQL数据库管理或开发的人来说都是非常重要的。

    etl.RAR_etl_etl oracle mysql_mysql的 etl函数_oracle_oracle向mysql e

    在ETL过程中,可能需要利用MySQL的LOAD DATA INFILE命令快速导入大量数据,或者使用存储过程执行复杂的批量操作。 在将Oracle数据迁移到MySQL时,可能需要特别关注数据类型的对应,比如Oracle的NUMBER类型在MySQL中...

    MySQL_5.1.zip

    1. 性能优化:MySQL 5.1引入了InnoDB存储引擎的并行插入功能,提高了写入性能,尤其是对于大量并发插入操作。此外,查询缓存也得到了改进,可以更快地返回先前执行过的查询结果。 2. 高可用性和复制:MySQL 5.1增强...

    C#_MySQL_图片的存储与读取

    ### C#与MySQL中图片的存储与读取 在现代应用程序开发中,处理多媒体数据(如图片)...此外,对于大量图片的存储,还应该考虑使用更高效的数据存储方案,比如将图片存储在文件系统中,仅将文件路径存储在数据库中等。

    QT-Mysql-Blob.zip_mysql blob_qt blob 文件_qt blob类型_qt的blob

    除了基本的插入和查询,你还需要了解如何处理BLOB数据的存储效率和性能问题。例如,对于大文件,可能需要考虑分块读写,以避免一次性加载大量内存。此外,你还需要确保数据库的索引策略考虑到BLOB字段,因为BLOB字段...

Global site tag (gtag.js) - Google Analytics