簡體   English   中英

MySQL ODBC更新查詢非常慢

[英]MySQL ODBC Update Query VERY Slow

我們的Access 2010數據庫最近達到2GB的文件大小限制,因此我將數據庫移植到了MySQL。

我在Windows Server 2008 x64上安裝了MySQL Server 5.6.1 x64。 所有操作系統更新和補丁均已加載。

我正在使用MySQL ODBC 5.2w x64驅動程序,因為它似乎是最快的。

我的盒子上有一個帶64GB RAM和480GB SSD的i7-3960X。

我使用Access Query Designer是因為我偏愛該界面,因此我經常需要將丟失的記錄從一個表追加到另一個表。

作為測試,我有一個帶有兩個鏈接表的簡單Access數據庫:

tblData鏈接到另一個Access數據庫,並且

tblOnline使用SYSTEM DSN鏈接到ODBC表。

這兩個表都包含超過一千萬條記錄。 我的某些移植工作表已經擁有超過3000萬條記錄。

要選擇要追加的記錄,我使用一個稱為INDBYN的字段,該字段為true或false。

首先,我在tblData上運行更新查詢:

UPDATE tblData SET tblData.InDBYN = False;

然后,我更新所有匹配的記錄:

UPDATE tblData INNER JOIN tblData ON tblData.IDMaster = tblOnline.IDMaster SET tblData.InDBYN = True; 

即使對鏈接的ODBC表,此操作也相當快。

最后,我將INDBYN為False的所有記錄追加到tblOnline。 這也可以接受,盡管速度比附加到鏈接訪問表的速度慢。

在Access中,除了DB太大之外,其他所有東西都可以100%地工作並且速度非常快。

在“鏈接訪問表”上,需要2m15來更新11,500,000條記錄。

但是,我現在需要將SOURCE表移至MySQL,因為它已達到2GB的限制。

因此,將來我將需要在鏈接的ODBC表上運行UPDATE語句。

到目前為止,當我在鏈接的ODBC表上運行相同的簡單UPDATE查詢時,它運行了20分鍾以上,然后轟炸出該查詢已超過2GB內存限制。

這兩個表的結構相同。

我不知道如何解決此問題,請咨詢。

我更喜歡將Access用作前端,因為我已經為該應用程序設計了數百個查詢,並且沒有時間重新開發該應用程序。

我使用InnoDB引擎並嘗試了各種調整,但均未成功。 由於我的數據庫使用關系表,因此它似乎是使用INNODB而不是MyISAM的最佳選擇。

我已打開和關閉doublewrite並嘗試了各種緩沖池大小,包括查詢緩存。 它對這個特定查詢沒有影響。

我當前的my.ini文件如下所示:

#-----------------------------------------------------------------------
# MySQL Server Instance Configuration File
# ----------------------------------------------------------------------

[client]
no-beep

port=3306

[mysql]

default-character-set=utf8

server_type=3
[mysqld]

port=3306

basedir="C:\Program Files\MySQL\MySQL Server 5.6\"

datadir="E:\MySQLData\data\"

character-set-server=utf8

default-storage-engine=INNODB

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

log-output=FILE
general-log=0
general_log_file="SQLSERVER.log"
slow-query-log=1
slow_query_log_file="SQLSERVER-slow.log"
long_query_time=10

log-error="SQLSERVER.err"

max_connections=100

query_cache_size = 20M

table_open_cache=2000

tmp_table_size=502M

thread_cache_size=9

myisam_max_sort_file_size=100G

myisam_sort_buffer_size=1002M

key_buffer_size=8M

read_buffer_size=64K
read_rnd_buffer_size=256K

sort_buffer_size=256K

innodb_additional_mem_pool_size=32M

innodb_flush_log_at_trx_commit = 1

innodb_log_buffer_size=16M

innodb_buffer_pool_size = 48G

innodb_log_file_size=48M

innodb_thread_concurrency = 0

innodb_autoextend_increment=64M

innodb_buffer_pool_instances=8

innodb_concurrency_tickets=5000

innodb_old_blocks_time=1000

innodb_open_files=2000

innodb_stats_on_metadata=0

innodb_file_per_table=1

innodb_checksum_algorithm=0

back_log=70

flush_time=0

join_buffer_size=256K

max_allowed_packet=4M

max_connect_errors=100

open_files_limit=4110

query_cache_type = 1

sort_buffer_size=256K

table_definition_cache=1400

binlog_row_event_max_size=8K

sync_relay_log=10000
sync_relay_log_info=10000

tmpdir = "G:/MySQLTemp"
innodb_write_io_threads = 16
innodb_doublewrite
innodb = ON
innodb_fast_shutdown = 1

query_cache_min_res_unit = 4096

query_cache_limit = 1048576

innodb_data_home_dir = "E:/MySQLData/data"

bulk_insert_buffer_size = 8388608

任何建議將不勝感激。 先感謝您。

通過鏈接表的MS Access與MySQL的通信速度很慢。 太慢了。 那是不可改變的事實。 為什么會這樣呢? Access首先從MySQL加載數據,然后處理命令,最后將數據放回去。 另外,它逐行執行此過程! 但是,如果不需要在“更新”查詢中使用本地表中的參數或數據,則可以避免這種情況。 (換句話說-如果您的查詢始終是相同的,並且僅使用MySQL數據)

技巧是強制MySQL服務器處理查詢而不是Access! 這可以通過在Access中創建“直通”查詢來實現,您可以其中直接編寫SQL代碼(采用MySQL語法)。 Access然后將此命令發送到MySQL服務器,並在該服務器中直接對其進行處理。 因此,您的查詢將幾乎與在本地訪問表中進行查詢一樣快。

Access是單用戶系統。 帶有InnoDB的MySQL是受事務保護的多用戶系統。

當您發出一個達到十兆行的UPDATE命令時,MySQL必須構造回滾信息,以防操作在到達所有行之前失敗。 這需要大量時間和內存。

如果要執行這些真正龐大的UPDATEINSERT命令,請嘗試將表訪問方法切換為MyISAM。 MyISAM不受事務保護,因此這些操作可能運行得更快。

您可能會發現使用ODBC以外的其他工具進行數據遷移會很有幫助。 正如您所發現的,ODBC在處理大量數據方面的能力受到嚴格限制。 例如,您可以將Access表導出為平面文件,然后使用MySQL客戶端程序將其導入。 看到這里... https://stackoverflow.com/questions/9185/what-is-the-best-mysql-client-application-for-windows

將數據導入MySQL后,即可運行基於Access的查詢。 但要避免UPDATE請求觸及數據庫中的所有內容。

奧利(Ollie),我明白您要避免對所有行進行更新的更新。 我用它來標記目標數據庫中缺少的行,這是僅附加缺少的行的一種快速簡便的方法。 我看到SQLyog有一個只能附加新記錄的導入工具,但這仍然貫穿導入表中的所有行,並且運行了幾個小時。 我將看看我是否只能將我想要的數據導出為CSV,但是如果可能的話,讓ODBC連接器比現在更快地工作仍然很不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM