文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

10.6.2 MyISAM 表格的大量資料載入

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

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

  • 經過一些額外的工作,當表格有許多索引時,可以讓 LOAD DATA 對於 MyISAM 表格執行得更快。請使用下列程序

    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 陳述式時為重新建立索引配置的暫存記憶體要多得多。

    您也可以使用以下語句來停用或啟用 MyISAM 表格的非唯一索引,而無需使用 myisamchk。如果您使用這些語句,則可以跳過 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 節,「設定伺服器」