VB ODBC方式更新MYSQL数据库表相当相当慢!!

wjl123 2011-03-15 03:53:21

我用VB写了一个程序,通过VB用ODBC方式访问数据库,对数据进行处理。以前后台我用的是ACCESS数据库,更新速度相当快!
现在后台改用MYSQL了,同样还是用ODBC方式访问后台MYSQL数据库,且处理同一批数据,我发现后台改用MYSQL更新数据速度相当相当慢!!!计算机负荷很高,在任务管理器中发现一个叫 "mysqld-nt.exe"进程负荷在数据更新期间一直在50%左右 ,我的CPU 是P4 3.2GHz的双核INTEL CPU ,内存4Gbytes,硬件配置应当没有问题,而且之前用ACCESS处理数据,相当快,20万条数据,基本上6分钟搞定了,而改用MYSQL后1小时还没有处理完呢,CPU负荷相当高,慢的实在不可接受,真的是太慢了。

注:ACCES 和 MYSQL中的后台表我均没有建索引。

请高手指教,非常感谢!!

相关信息:MYSQL版本:MySQL Server 5.0

相关VB代码:

Dim session_id As Double
Dim mysql_cnn As New ADODB.Connection
Dim record_set As New ADODB.Recordset
Set mysqlcmd = New ADODB.Command
Dim mysql_ConnStr As String

mysql_ConnStr = "DRIVER={MySQL ODBC 3.51 Driver};" & _
"SERVER=" & "localhost" & ";" & _
"DATABASE=" & "test" & ";" & _
"UID=" & "root" & ";PWD=" & ";" & _
"OPTION=3;stmt=SET NAMES GB2312"

mysql_cnn.Open mysql_ConnStr

mysqlcmd.ActiveConnection = mysql_cnn

record_set.Open "select * from my_list_tbl where DLR=-1 AND SLR<>-1 ORDER BY my_list_tbl.time_id ", mysql_cnn, adOpenForwardOnly, adLockOptimistic

session_id = 1

Do Until record_set.EOF

record_set.Fields(19) = session_id '更新session_id 字段

session_id = session_id + 1

record_set.MoveNext

Loop

record_set.Close

mysql_cnn.Close

本程序段的功能没有问题,就是更新数据相当慢!!!

MYSQL 表定义:

CREATE TABLE `my_list_tbl` (
`f1` varchar(25) default NULL,
`f2` varchar(20) default NULL,
`f3` varchar(20) default NULL,
`f4` varchar(20) default NULL,
`f5` varchar(20) default NULL,
`DLR` bigint(20) default '-1',
`SLR` bigint(20) default '-1',
`f8` varchar(20) default NULL,
`f9` varchar(20) default NULL,
`f10` varchar(20) default NULL,
`f11` varchar(20) default NULL,
`f12` varchar(20) default NULL,
`f13` varchar(30) default NULL,
`f14` varchar(30) default NULL,
`f15` varchar(80) default NULL,
`f16` varchar(10) default NULL,
`f17` varchar(50) default NULL,
`time_id` bigint(20) default NULL,
`f19` bigint(20) default NULL,
`session_id` bigint(20) default NULL,
`f21` tinyint(4) default NULL,
`f22` tinyint(4) default NULL,
`f23` double(20,0) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;




...全文
266 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangyan426688 2012-05-11
  • 打赏
  • 举报
回复
用MOVENEXT再更新肯定慢啦
wjl123 2011-03-15
  • 打赏
  • 举报
回复
再有,我要强调一点,这个CASE和MySQL ODBC的版本没有关系,我测试过了,3.51的也同样相当相当地快!

关键是要给表创建PRIMARY KEY !! 否则巨慢无比:)
wjl123 2011-03-15
  • 打赏
  • 举报
回复
我的问题解了:在表中建主键后更新速度极快!!!

在处理这个CASE过程中,我实际感受到primary key的重要性。

测试结果:
更新的数据样本约20万条记录,ODBC方式用Recordset做遍历更新操作,现在用时约:15秒就搞定了,而之前没有主键时,处理1小时还没有处理完啊!,可见主键对于表来说是多么重要啊!

ACCESS实际上也是有primary key的,否则处理也会很慢,我又核实了一下,ACCESS中确实也有主键的。


多谢各位!
wwwwb 2011-03-15
  • 打赏
  • 举报
回复
没有看到记录,假设F1唯一
SET @i=1;
UPDATE my_list_tbl a INNER JOIN
(
select *.@i:=@i+1 AS jl from my_list_tbl where DLR=-1 AND SLR<>-1 ORDER BY my_list_tbl.time_id) b
ON a.f1=b.f1
SET a.session_id=b.jl;
wwwwb 2011-03-15
  • 打赏
  • 举报
回复
应该有关,一般应该设置主键或索引
wjl123 2011-03-15
  • 打赏
  • 举报
回复
单步执行我发现是这个指令执行的慢:

record_set.MoveNext

即在移动游标时很慢,是否和没有创建主键或索引相关呢?


wwwwb 2011-03-15
  • 打赏
  • 举报
回复
要达到什么目的,直接UPDATE不行,循环太慢
wjl123 2011-03-15
  • 打赏
  • 举报
回复
刚才我试如下两个ODBC DRIVER:
mysql-connector-odbc-5.1.8-win32.msi 文件大小:2559KB
mysql-connector-odbc-5.1.2-win32.msi 文件大小:4139KB
程序运行还是相当慢,没有任何改观。


wjl123 2011-03-15
  • 打赏
  • 举报
回复
刚才我试如下两个ODBC DRIVER:
mysql-connector-odbc-5.1.8-win32.msi 文件大小:2559KB
mysql-connector-odbc-5.1.2-win32.msi 文件大小:4139KB
程序运行还是相当慢,没有任何改观。


zuoxingyu 2011-03-15
  • 打赏
  • 举报
回复
我用mysql-connector-odbc-5[1].1.5-win32.msi这个驱动程序,没有发现你说的那种问题。
wwwwb 2011-03-15
  • 打赏
  • 举报
回复
http://downloads.mysql.com/archives.php?p=mysql-connector-odbc-5.1
下载
wwwwb 2011-03-15
  • 打赏
  • 举报
回复
安装 MYSQL ODBC5.1。2试试

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧