mysql - 大数据量下的操作相关 (4KW记录,32G)
这个时候务必使用SSD硬盘。
导出需要30分钟。
导入需要至少1小时(google cloude), 3 小时(SSD), 4小时(SATA硬盘)
所以,一次导入成功之后,可以copy mysql data_dir , 这样下次就直接复制磁盘就好了。 否则使用SQL恢复的话,4MB/s.
删除: delete from where ... ,大约一秒钟1W条。
这个帖子非常经典:https://stackoverflow.com/questions/812512/faster-way-to-delete-matching-rows
不能使用delete删除大数据,因为 在 inno db模式下,delete是需要回滚的, 每个delete操作,如果中途取消,都会完美恢复原来的记录。 而且就算你的delete执行完了, 数据库中的数据也会留下,直到某个 别的进程不再使用那条记录了,才会被删掉。
解决办法: 参考:https://stackoverflow.com/a/834221/445908
mysql> create table orders_temp like orders;
Query OK, 0 rows affected (0.66 sec)
mysql> insert into orders_temp select * from orders where member_id != 19 ;
Query OK, 531 rows affected (1.66 sec)
Records: 531 Duplicates: 0 Warnings: 0
mysql> drop table orders;
Query OK, 0 rows affected (0.63 sec)
mysql> rename table orders_temp to orders;
Query OK, 0 rows affected (0.12 sec)
执行
insert into orders_temp select * from orders where member_id != 19 ;
如果报错 The total number of locks exceeds the lock table size
需要设置Innodb buffer pool size的值就好了,默认的值是8M;
查看值是多少
mysql > show variables like '%buffer%';
![]()
- 找到mysql的配置文件中(Linux 在
/etc/my.cnf) - 在
[mysqld]配置项中添加进innodb_buffer_pool_size=64MB这行值, 当然如果机器内存足够大,可以按照自己需求设置 - 重启mysql(
service mysqld restart)
重启之后,可以到mysql下面再次执行show variables like '%buffer%';命令,看看是不是相应的buffer值已经被改变了。

浙公网安备 33010602011771号