我有一个ms访问应用程序,它将mysql表链接到ODBC。 mysql数据库曾经在同一个局域网中,性能很好,但外包到一个100Mbs连接的不同位置。 版本:
CentOs:6.7
Mysql:5.6.26
Ms access:2010 (也在ms access 2003中测试过)
ODBC:5.3 Windows 7 PC中的unicode驱动程序版本
我测试了 myIsam表和 InnoDB表,包含3个字段,是第一个作为PK的整数类型。
test_localTable 是一个以30行的ms访问方式创建的本地表
- >使用来自ms访问查询的命令:
insert into mysqlInnoDb_remoteTable select * from test_localTable
insert into mysqlMyIsam_remoteTable select * from test_localTable
delete * from mysqlInnoDb_remoteTable
delete * from mysqlMyIsam_remoteTable
innodb和myIsam表平均需要插入10秒,删除时间为11秒。更新也是如此。
有趣的是,任何类型的选择查询都会像在本地使用服务器一样快速运行。
我认为我的服务器缺少一些重要的调整,因为我认为这种性能不可接受。
你可以帮帮我吗?谢谢
答案 0 :(得分:2)
在某些情况下,当针对ODBC链接表执行单个Access SQL语句时,Access实际上会为每行发送一个本机SQL语句。如果你要在MySQL服务器上启用general_log,那么很遗憾,你会看到Access SQL语句
INSERT INTO LinkedTable ... SELECT ... FROM LocalTable
和
DELETE * FROM LinkedTable
是两个这样的案例。
在处理大量行和/或慢速连接时,可能需要使用涉及传递查询的变通方法。例如,假设您在Access中有一个名为LinkedTable
的ODBC链接表,该表指向名为RemoteTable
的MySQL表。如果
Dim cdb As DAO.Database
Set cdb = CurrentDb
cdb.Execute "DELETE * FROM LinkedTable"
Set cdb = Nothing
证明太慢,然后这可能会快得多
Dim cdb As DAO.Database, qdf As DAO.QueryDef
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("LinkedTable").Connect
qdf.SQL = "TRUNCATE TABLE RemoteTable"
qdf.ReturnsRecords = False
qdf.Execute
Set qdf = Nothing
Set cdb = Nothing
INSERT ... SELECT
的类似解决方法可以在相关答案here中找到。