我有一个 MS Access 应用程序,它通过 ODBC 链接 mysql 表。 mysql 数据库曾经位于同一个 LAN 中并且性能非常好,但被外包到具有 100Mbs 连接的不同位置。 版本:
CentO:6.7
Mysql:5.6.26
MS access:2010(也在 ms access 2003 中进行了测试)
ODBC:Windows 7 PC 中的 5.3 unicode 驱动程序版本
我测试了一个myIsam表和一个InnoDB表,有3个字段,第一个是作为PK的整数类型。
test_localTable是在ms access中创建的本地表,有30行
-> 从 ms access 查询中使用此命令:
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 秒。更新也是如此。
有趣的是,任何类型的选择查询都可以像我在本地使用服务器一样快地运行。
我认为我的服务器缺少一些重要的调整,因为我认为这种性能 Not Acceptable 。
你能帮我一下吗?
谢谢
最佳答案
在某些情况下,当对 ODBC 链接表执行单个 Access SQL 语句时,Access 实际上会为每一行发送一个 native 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
可以在相关答案 here 中找到 INSERT ... SELECT
的类似解决方法。 .
关于插入更新删除时,通过 ODBC 到 MS Access 的 mysql 链接表表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637958/