文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  MyISAM 表格的大量資料載入

10.6.2 MyISAM 表格的大量資料載入

這些效能提示補充了 第 10.2.5.1 節「最佳化 INSERT 陳述式」中快速插入的一般準則。

  • 對於 MyISAM 表格,如果資料檔案中間沒有已刪除的列,您可以使用並行插入,在執行 SELECT 陳述式的同時新增列。請參閱 第 10.11.3 節「並行插入」

  • 如果表格有許多索引,經過一些額外的工作,可以使 LOAD DATAMyISAM 表格的執行速度更快。使用以下程序

    1. 執行 FLUSH TABLES 陳述式或 mysqladmin flush-tables 命令。

    2. 使用 myisamchk --keys-used=0 -rq /path/to/db/tbl_name 來移除表格的所有索引使用。

    3. 使用 LOAD DATA 將資料插入表格。這不會更新任何索引,因此速度非常快。

    4. 如果您打算日後僅從表格讀取資料,請使用 myisampack 來壓縮它。請參閱 第 18.2.3.3 節「壓縮表格特性」

    5. 使用 myisamchk -rq /path/to/db/tbl_name 重新建立索引。這會在將索引樹寫入磁碟之前先在記憶體中建立,這比在 LOAD DATA 期間更新索引快得多,因為它避免了大量的磁碟搜尋。產生的索引樹也是完全平衡的。

    6. 執行 FLUSH TABLES 陳述式或 mysqladmin flush-tables 命令。

    如果插入資料的 MyISAM 資料表為空,LOAD DATA 會自動執行上述最佳化。自動最佳化與明確使用此程序的主要區別在於,您可以讓 myisamchk 為索引建立分配更多的暫存記憶體,而不是您希望伺服器在執行 LOAD DATA 陳述式時為索引重建分配的記憶體。

    您也可以使用以下陳述式,而不是 myisamchk,來停用或啟用 MyISAM 資料表的非唯一索引。如果您使用這些陳述式,則可以略過 FLUSH TABLES 操作。

    ALTER TABLE tbl_name DISABLE KEYS;
    ALTER TABLE tbl_name ENABLE KEYS;
  • 若要加速針對非交易式資料表執行多個陳述式的 INSERT 操作,請鎖定您的資料表。

    LOCK TABLES a WRITE;
    INSERT INTO a VALUES (1,23),(2,34),(4,33);
    INSERT INTO a VALUES (8,26),(6,29);
    ...
    UNLOCK TABLES;

    這有助於效能,因為索引緩衝區只會在所有 INSERT 陳述式完成後才刷新到磁碟。通常,索引緩衝區刷新的次數會與 INSERT 陳述式的數量相同。如果可以用單一 INSERT 插入所有列,則不需要明確的鎖定陳述式。

    鎖定也會減少多個連線測試的總時間,儘管個別連線的最大等待時間可能會增加,因為它們會等待鎖定。假設有五個用戶端嘗試同時執行插入操作,如下所示:

    • 連線 1 執行 1000 次插入

    • 連線 2、3 和 4 各執行 1 次插入

    • 連線 5 執行 1000 次插入

    如果您不使用鎖定,連線 2、3 和 4 會在 1 和 5 之前完成。如果您使用鎖定,連線 2、3 和 4 可能不會在 1 或 5 之前完成,但總時間應該快約 40%。

    INSERTUPDATEDELETE 操作在 MySQL 中速度非常快,但您可以透過在執行超過大約五次連續插入或更新的所有操作周圍新增鎖定來獲得更好的整體效能。如果您執行非常多次連續插入,您可以偶爾(大約每 1,000 列)執行一次 LOCK TABLES,然後執行一次 UNLOCK TABLES,以允許其他執行緒存取資料表。這仍然會帶來良好的效能提升。

    即使使用剛才概述的策略,INSERT 對於載入資料的速度仍然比 LOAD DATA 慢得多。

  • 若要提高 MyISAM 資料表的效能,無論是 LOAD DATA 還是 INSERT,請透過增加 key_buffer_size 系統變數來擴大金鑰快取。請參閱第 7.1.1 節,「設定伺服器」