我用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 Stringmysql_ConnStr = "DRIVER={MySQL ODBC 3.51 Driver};" & _
  "SERVER=" & "localhost" & ";" & _
 "DATABASE=" & "test" & ";" & _
 "UID=" & "root" & ";PWD=" & ";" & _
 "OPTION=3;stmt=SET NAMES GB2312"mysql_cnn.Open mysql_ConnStrmysqlcmd.ActiveConnection = mysql_cnnrecord_set.Open "select * from my_list_tbl where DLR=-1 AND SLR<>-1 ORDER BY my_list_tbl.time_id ", mysql_cnn, adOpenForwardOnly, adLockOptimisticsession_id = 1Do Until record_set.EOFrecord_set.Fields(19) = session_id   '更新session_id 字段session_id = session_id + 1record_set.MoveNextLooprecord_set.Closemysql_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;

解决方案 »

  1.   

    安装 MYSQL ODBC5.1。2试试
      

  2.   

    http://downloads.mysql.com/archives.php?p=mysql-connector-odbc-5.1
    下载 
      

  3.   

    我用mysql-connector-odbc-5[1].1.5-win32.msi这个驱动程序,没有发现你说的那种问题。
      

  4.   

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

  5.   

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

  6.   

    要达到什么目的,直接UPDATE不行,循环太慢
      

  7.   

    单步执行我发现是这个指令执行的慢:record_set.MoveNext即在移动游标时很慢,是否和没有创建主键或索引相关呢?
      

  8.   

    没有看到记录,假设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;
      

  9.   

    我的问题解了:在表中建主键后更新速度极快!!!在处理这个CASE过程中,我实际感受到primary key的重要性。测试结果:
    更新的数据样本约20万条记录,ODBC方式用Recordset做遍历更新操作,现在用时约:15秒就搞定了,而之前没有主键时,处理1小时还没有处理完啊!,可见主键对于表来说是多么重要啊!ACCESS实际上也是有primary key的,否则处理也会很慢,我又核实了一下,ACCESS中确实也有主键的。
    多谢各位!
      

  10.   

    再有,我要强调一点,这个CASE和MySQL ODBC的版本没有关系,我测试过了,3.51的也同样相当相当地快!关键是要给表创建PRIMARY KEY !! 否则巨慢无比:)