服务器上有个2万条记录的MySQL数据表,读取并写入本地数据库,怎么这么慢啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器上有个2万条记录的MySQL数据表,读取并写入本地数据库,怎么这么慢啊?相关的知识,希望对你有一定的参考价值。

服务器上建立了索引,刚开始的时候读写1万条记录左右的时候开始变慢,速度不是一般的慢,估计是本地写入速度慢,读的速度还是很快的,就是不明白,为什么读这个表刚开始的时候速度很快,为什么后来越来越慢,一秒才能处理几条记录。本地的数据库优化了几个配置:
innodb_buffer_pool_size = 1024M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 512M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2
没有改善,这是为什么?

我是用VB写的程序,在服务器上读一行,到本地写一行,循环进行的。

参考技术A 一次多读些记录是对的,还有就是你每次读记录时创建的对象要注意清理,关闭或是重用. 要不然这个程序就越来越占用资源追问

我每次都把recordset关闭了,就是没关闭connection,这是不是有影响?每次关闭connection要重连,太麻烦了吧,或者我读1万条关一次再连?

追答

其它你每次返回记录集多点好,如select top 200 * from 表名 where id>每次的最大ID
用order by id 排序一下,第一条或是最后一条就是最大ID.再用循环读出写入. 尽量减少,对象过的创建,销毁.文件的打开关闭.

参考技术B 在服务器上读一行,到本地写一行,循环进行的。
--就不能一次性读取100行,1000行这样吗?
写也是一行一行?io操作非常耗时的
另外请用多线程做这个事。

mysql优化这个程度可以了追问

一次性写100行怎么写啊?用VB在本地建立数组?然后从数组中一条一条的读出再写入?这和我的是一样的效果啊。

我所不明白的是:为什么刚开始速度快,后来越来越慢啊?

同时,如果我的程序对这个数据表操作两次,比如第一次操作完了,我的程序不退出,接着再操作一次,速度会更慢,并且没有第一次前期的“快时间”,直接就相当慢了。这又是为什么?

和我本地计算机的虚拟内存是不是有关???

追答

跟虚拟内存肯定有一点点关系,但是我觉得关键就是你的io操作太可怕了
你应该用缓存的。
1 多线程操作
2 缓存
3 一次性读100条,然后一次性写100条,减少写入的次数

追问

为什么刚开始快,后来慢呢?如果是IO操作的问题,那应该是一开始就慢,而不应该越来越慢啊,我不理解。

另外,怎么用缓存?我用的VB,提示一下,我改程序。

追答

如果是IO操作的问题,那应该是一开始就慢,而不应该越来越慢啊, -- 不会,刚开始就是快,但是硬盘是在被使用当中,你再操作,就会慢。所以我也说跟虚拟内存有一定关系,因为可能是先通过虚拟内存,然后再被写入的。
vb6还是vb.net?

追问

VB6
我把虚拟内存已经加大了,可还是不行。

追答

不是说加大虚拟内存就能解决的拉。
vb6...忘记得差不多了
你看看如果操作多线程
缓存可以这样:建立数组,一次存取多条记录
然后一次写入多条

追问

还有个奇怪的问题啊:
我不是只操作这个2万条记录的表,我还同时操作几个表,也就是循环从这几个表中读数据写数据,这个表排在中间顺序,前面几个表数据很快,到这个表的时候,开始快后来慢,好,操作完这个表,再到下一个表的时候,也有几千条记录,又会很快,这是为什么?

这个表开始快,后来慢。和记录多少有关,肯定的。

如果和IO有关,不会这个表操作完了,其他表就快了啊?

追答

所谓io,是通过操作系统进行调用处理的,一般情况是先进先出,也说不定有优先级别的排列
这个我说不好

追问

我发现问题不是IO的问题,当我本地的数据表记录数达到一定数目的时候,就算我把电脑重启一下再对这个表继续加数据,速度都会很慢,这是什么原因???

追答

重启电脑对解决IO问题无效!你做RAID5后才会感觉IO变快的,或者换更快的硬盘。
嗯,你本地的数据表是mysql?还是你自己写到硬盘上的文件?

追问

本地的也是MYSQL库。刚才我说的您没听明白,我是说,我已进行了一次写表操作,2万条记录写入我这个本地表了,然后我把电脑重启了一下,再运行刚才的程序,重新对这个已有2万条记录的表进行补充数据,速度一开始就相当慢。

而当我把这个表数据清空后,再补充数据,速度就又会很快,后来才慢。

这是什么原因???表中有数据就慢?

追答

my.ini文件看看

追问

[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 32M
后面的加不进来了,加QQ好吗?我的是212381

本回答被提问者采纳

以上是关于服务器上有个2万条记录的MySQL数据表,读取并写入本地数据库,怎么这么慢啊?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 对 4000 万条记录表和 128GB 内存的专用服务器进行大量更新需要很长时间

Java 线程池 +生产者消费者+MySQL读取300 万条数据

MySQL 千万条数据 匹配一个状态 != 和 in() 那个更快呢?

计算Java中+ 2000万条记录的统计数据

一个数据表如果同时写入同时读取 会影响表的查询速度吗,如何优化大数据量表,比如1000万条用户记录

记录一次mysql导入千万条测试数据过慢的问题!