起因:有一个innoDB引擎的表Table,在一个大概3000次的foreach循环中执行 INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB),结果居然超出了60S的php执行限制(当然这个限制可以在php.ini中修改),这是因为innoDB是mysql存储引擎中唯一支持事务的,默认所有用户的行为都在事务内发生。
默认mysql建立新连接时,innoDB采用自动提交autocommit模式,每个SQL语句在它自己上形成一个单独的事务,即insert一次就commit了一次,InnoDB在该事务提交时必须刷新日志到磁盘,因此效率受限于磁盘读写效率。
你可以通过 mysql_query("SET AUTOCOMMIT = 0"); 来关闭自动提交模式。
如果自动提交模式被关闭,那么我们可以认为一个用户总是有一个事务打开着。一个SQL COMMIT或ROLLBACK语句结束当前事务并且一个新事务开始。两个语句都释放所有在当前事务中被设置的InnoDB锁定。一个COMMIT语句意味着在当前事务中做的改变被生成为永久的,并且变成其它用户可见的。一个ROLLBACK语句,在另一方面,撤销所有当前事务做的修改。
当然如果是自动提交模式,通过用明确的START TRANSACTION或BEGIN语句来开始一个事务,并用COMMIT或者ROLLBACK语句来结束它,这样用户仍旧可以执行一个多重语句事务。
对于本例,在建立数据库连接后,立即关闭自动提交,在foreach循环结束后,一次commit即可,效率将大大提升。
默认mysql建立新连接时,innoDB采用自动提交autocommit模式,每个SQL语句在它自己上形成一个单独的事务,即insert一次就commit了一次,InnoDB在该事务提交时必须刷新日志到磁盘,因此效率受限于磁盘读写效率。
你可以通过 mysql_query("SET AUTOCOMMIT = 0"); 来关闭自动提交模式。
如果自动提交模式被关闭,那么我们可以认为一个用户总是有一个事务打开着。一个SQL COMMIT或ROLLBACK语句结束当前事务并且一个新事务开始。两个语句都释放所有在当前事务中被设置的InnoDB锁定。一个COMMIT语句意味着在当前事务中做的改变被生成为永久的,并且变成其它用户可见的。一个ROLLBACK语句,在另一方面,撤销所有当前事务做的修改。
当然如果是自动提交模式,通过用明确的START TRANSACTION或BEGIN语句来开始一个事务,并用COMMIT或者ROLLBACK语句来结束它,这样用户仍旧可以执行一个多重语句事务。
对于本例,在建立数据库连接后,立即关闭自动提交,在foreach循环结束后,一次commit即可,效率将大大提升。
mysql_query("SET AUTOCOMMIT = 0");
foreach(***)
INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB)
mysql_query("commit");
对于多次insert行到同一表的需求,你还可以采用多行插入语法来减少客户端和服务器之间的通讯开支。即:
foreach(***)
INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB)
mysql_query("commit");
对于多次insert行到同一表的需求,你还可以采用多行插入语法来减少客户端和服务器之间的通讯开支。即:
INSERT INTO Table(columnA, columnB) VALUES (1,2), (5,5), (3,3), ...
如果你的表有索引,索引也会拖慢insert速度。大量插入数据时,可以先关闭索引,然后再重建索引。
如果你的表有索引,索引也会拖慢insert速度。大量插入数据时,可以先关闭索引,然后再重建索引。
ALTER TABLE Table DISABLE KEYS;
INSERT INTO ***;
ALTER TABLE Table ENABLE KEYS;
INSERT INTO ***;
ALTER TABLE Table ENABLE KEYS;
相关推荐
### MySQL InnoDB 查询优化实现分析 ...通过本文的详细解析,读者可以对 MySQL + InnoDB 存储引擎在查询优化方面的工作原理有更深入的理解,并能够在实际应用中更好地利用这些技术来提升系统的性能。
MySQL批量SQL插入性能优化是数据库管理员和开发人员面临的重要任务,特别是在处理大数据量的系统时。本文将深入探讨几种能够显著提升MySQL InnoDB存储引擎插入性能的方法。 首先,一种有效的优化策略是通过合并多条...
MySQL中的`INSERT INTO ... ON DUPLICATE KEY UPDATE`语句是一种非常实用的机制,它允许你在插入新行的同时处理可能出现的唯一性约束冲突。这个语句主要用于处理唯一索引(包括主键)的情况,当尝试插入的数据与现有...
2. DML(Data Manipulation Language):插入、更新和删除数据,如INSERT INTO、UPDATE和DELETE FROM。 3. DQL(Data Query Language):查询数据,使用SELECT语句。 4. DCL(Data Control Language):权限管理,如...
本文主要探讨了在MySQL中如何通过批量插入优化性能,对比了几种不同的批量插入方法,并进行了实验验证。 首先,传统的单条插入方式在面对大量数据时效率低下,因为每条插入语句都需要经过解析、优化和执行等多个...
### MySQL Innodb 死锁情况分析与归纳 #### 案例背景介绍 在实际数据库运维过程中,我们可能会遇到各种各样的问题,其中死锁是一个较为常见也较为棘手的问题之一。本文将以一个具体的案例为基础,对MySQL Innodb...
在优化MySQL的INSERT性能时,面对大量数据的系统,我们需要考虑如何有效地减少插入时间,以降低潜在的风险和提高系统的稳定性。以下是一些经过测试的有效策略: 1. **批量插入**: - 传统的方式是逐行插入数据,...
InnoDB 存储引擎是一种专门为事务处理、高可靠性和性能优化设计的存储引擎,自 MySQL 5.5 版本起成为 MySQL 的默认存储引擎。它能够为现代数据库应用程序提供强大的数据完整性和高性能事务处理能力,适用于需要高度...
MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用...insert into m11 values (1,1,1,1),(2,2,2,2),(3,3
INSERT INTO test1 (id, name) VALUES (1, 'anm'), (2, 'keyring'); SELECT * FROM test1; ``` 你可以通过`SHOW CREATE TABLE test1;`查看表的创建语句,确认`ENCRYPTION`属性是否已设置为`'Y'`。 如果想要更改表...
综上所述,`innodb_autoinc_lock_mode`参数是一个关键设置,可以根据具体业务需求和系统负载进行调整,以优化性能并保证数据一致性。理解这个参数的工作原理对于优化MySQL数据库的性能和稳定性至关重要。
MySQL性能优化是一个涵盖广泛的主题,它涉及到数据库设计、SQL查询优化、索引策略、存储引擎选择、服务器配置等多个层面。以下是一些关于MySQL性能优化的关键知识点: 1. **查询优化**: - 使用`EXPLAIN`来分析SQL...
MySQL 表中使用 INSERT INTO SQL语句来插入数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT ...
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, 'db1.example.com', 3306); ``` 通过以上介绍可以看出,性能优化和扩展是MySQL数据库运维中的重要环节。通过对索引、查询、缓存等多方面...
MySQL中的插入操作(INSERT)涉及一系列的加锁机制,确保数据的一致性和并发安全性。在开始插入行之前,系统会设定一种特殊的间隙锁,称为插入意向间隙锁(Insert Intention Gap Lock)。这种锁的主要目的是避免在同...
- **InnoDB**:重启MySQL服务后,InnoDB会重置内存中的自动增长ID值。因此,新的记录ID可能会从删除的记录ID开始继续递增(如15),或者根据当前内存中记录的最大ID值继续递增(如18)。这取决于是否执行了`OPTIMIZE...
`INSERT INTO`语句则用于向表中添加具体的数据。 通过这个数据库,学习者可以实践如何创建索引以优化查询性能,理解如何使用SELECT语句进行数据检索,如何更新和删除数据,以及如何设计有效的数据库模式来满足业务...
### 完全优化MySQL数据库性能的八大巧方法 在当今数据驱动的世界中,数据库的性能优化对于确保应用程序的高效运行至关重要。MySQL作为一种广泛使用的开源关系型数据库系统,其性能优化一直是开发者关注的重点。本文...