mysql更新10000条记录_如何快速更新数据库中的百万条数据

环境:ubuntu 14.04,MySQL 5.6,Python 2.7。

本文使用python的MySQLdb这个库,MySQL Python tutorial这个教程很赞。

MySQLDBdb处理INSERT、UPDATE、DELETE时需要显式得commit()才能使更新有效,这也意味着commit之前的更新语句是放在一个事务中的。

For databases that support transactions, the Python interface silently starts a transaction when the cursor is created. The commit() method commits the updates made using that cursor, and the rollback() method discards them. Each method starts a new transaction.

对比如下:

更新方式总时间(ms)rows平均(ms)

1

57831

1000

57.8

2

89695

10

896

3

92941

40×10000

0.23

4

47956

40×10000

0.119

5

28407

40×10000

0.071

6

3272

48×10000

0.008

方式1是单线程,where使用了索引,一个更新对应一个commit。

方式2是单线程,where没有使用索引,所有更新对应一个commit。

方式3是单线程,where使用了索引,所有更新对应一个commit。

方式4使用了2个进程来更新,where使用了索引,每个进程里的所有更新对应一个commit。

方式5使用了4个进程来更新,where使用了索引,每个进程里的所有更新对应一个commit。

方式6是在一个update语句里面更新所有的数据。

建立表

mysql> CREATE TABLE `test`.`number` (

`id` INT NOT NULL COMMENT '',

`num` INT NULL COMMENT '',

PRIMARY KEY (`id`) COMMENT '');

mysql> show create table number \G

*************************** 1. row ***************************

Table: number

Create Table: CREATE TABLE `number` (

`id` int(11) NOT NULL,

`num` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

使用mysqldb插入数据(100*000条)

# coding: UTF-8

__author__ = 'letian'

import MySQLdb

import time

host='127.0.0.1'

user='root'

passwd='123456'

db='test'

port = 3306

start_time = time.time()

conn = MySQLdb.connect(host, user, passwd, db, port)

cur = conn.cursor()

for x in xrange(100*10000): # 0 到 999999

print x

sql = "INSERT INTO number VALUES(%s,%s)" % (x, x)

cur.execute(sql)

conn.commit()

end_time = time.time()

print '用时:', end_time - start_time

运行结果:

...

999997

999998

999999

用时:219.332565069

挺快。

看下数据:

mysql> select count(*) from number;

+----------+

| count(*) |

+----------+

| 1000000 |

+----------+

1 row in set (0.60 sec)

mysql> select * from number limit 3;

+----+------+

| id | num |

+----+------+

| 0 | 0 |

| 1 | 1 |

| 2 | 2 |

+----+------+

3 rows in set (0.00 sec)

更新方式1:单线程,使用索引,多个co

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下语句快速删除MySQL数据库的一千万数据: DELETE FROM table_name LIMIT 10000000; 请确保在运行此语句之前备份数据。此外,由于该操作可能需要一些时间才能完成,请在终端或命令提示符窗口运行此语句,以便在操作完成后获得提示。 ### 回答2: 要快速删除一千万数据,可以采取以下方法: 1. 使用TRUNCATE TABLE命令:相对于使用DELETE语句逐行删除数据,TRUNCATE TABLE命令可以更快地删除整个表的数据。它直接释放表所占用的磁盘空间,而不是逐行删除数据,从而提高删除速度。 2. 关闭MySQL的主键和外键检查:在删除大量数据时,关闭主键和外键检查可以显著提高删除速度。可以使用以下语句暂时关闭主键和外键检查: ALTER TABLE table_name DISABLE KEYS; SET FOREIGN_KEY_CHECKS = 0; 删除完成后,记得重新启用主键和外键检查: ALTER TABLE table_name ENABLE KEYS; SET FOREIGN_KEY_CHECKS = 1; 3. 优化删除语句:使用DELETE语句删除数据时,可以通过以下优化来提高删除速度: - 使用带索引的WHERE子句:在DELETE语句,使用带索引的WHERE子句可以加速数据查找和删除。 - 使用LIMIT子句:使用LIMIT子句将删除操作分为多个批次进行,每个批次删除一定数量的数据,避免一次性删除过多数据导致性能下降。 - 使用条件限制范围:根据数据的特点,可以先使用SELECT语句查询出需要删除的数据的范围,然后在DELETE语句使用这个范围作为条件进行删除。 4. 使用分区表:如果数据表较大且已分区,可以通过删除整个分区来快速删除数据。这种方法可以避免一行一行删除数据的开销。 以上是一些常用的方法来快速删除大量数据,具体的选择和实施方法可以根据实际情况来决定。 ### 回答3: 要快速删除MySQL的一千万数据,可以采取以下方法: 1. 使用TRUNCATE命令:TRUNCATE是一种快速删除数据的方法,它不仅删除数据,还重置表的自增计数。在执行之前,确保已将表和数据备份。使用以下SQL语句:TRUNCATE TABLE 表名; 2. 使用DELETE命令:DELETE命令将逐行删除指定条件的数据,但相比TRUNCATE,删除速度较慢。为了提高效率,可以按照合适的条件选择删除的范围,避免全表扫描。使用以下SQL语句:DELETE FROM 表名 WHERE 条件; 3. 分批次删除:将一千万数据分为多个子集,并通过循环的方式逐个删除子集,以减轻数据库的负担。例如,可以通过使用LIMIT和OFFSET来限制每次删除的数据量,如:DELETE FROM 表名 WHERE 条件 LIMIT 每次删除的数量 OFFSET 每次删除的偏移量; 4. 使用索引:在数据量庞大的情况下,建立合适的索引可以极大提高数据的删除效率。通过创建适当的索引,可以快速定位要删除的数据行,避免全表扫描的开销。 5. 禁用或简化触发器和约束:在删除大量数据时,禁用触发器和约束可以提高删除的速度。触发器和约束的验证和处理可能会增加删除操作的时间,因此在删除操作之前可以考虑临时禁用它们。 在实施删除操作之前,务必要先备份数据,以防止误删除或数据丢失。此外,在高峰期避免执行删除操作,以免影响其他用户的正常访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值