日期:2014-05-16  浏览次数:20761 次

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

我用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;






------解决方案--------------------
我用mysql-connector-odbc-5[1].1.5-win32.msi这个驱动程序,没有发现你说的那种问题。
------解决方案--------------------
没有看到记录,假设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;