Mysql

MySQL 8 中的插入比 MySQL 5.7 中的插入慢

  • May 1, 2021

我已經開始使用 MySQL 8 (8.0.12),我意識到這個版本中的“插入”比 MySQL 5.6 或 MySQL 5.7 慢。不管表是 MyISAM 還是 InnoDB,只有一個“插入”,只有一條記錄,使用 MySQL 8 伺服器大約需要 0.2 ~ 0.3 秒。 MySQL 5.7 中的相同“插入”只需要 0.003 秒或更短.

我已經放棄了 Windows Defender 或其他防毒程序,硬碟的寫入速度不是問題,因為我在同一台伺服器上有一個虛擬機,VM 有 MySQL 5.7,結果也很不錯:0.003 秒或更少。

我已經用不同的 SO 在不同的電腦上測試了相同的“插入”,結果總是相同的:MySQL 5.7(或 5.6)需要 0,003 秒或更短,而 MySQL 8 每次插入需要 0.2 ~ 0.3 秒,只有一條記錄. “創建”也較慢。

我覺得奇怪的是,在 MySQL 8 中,簡單的“選擇”或“連接選擇”比以前的版本更快。我認為問題在於寫入磁碟的查詢,而不是磁碟的限制,可能是 my.ini 或其他 MySQL 設置中分配的限制。

在這裡,我為您提供 MySQL 8 中性能緩慢的腳本:

CREATE TABLE `ciiu_test2` (
`id` INT(11) NULL DEFAULT NULL,
`codbut` VARCHAR(11) NULL DEFAULT NULL,
`ciiu` VARCHAR(8) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
;

MySQL 5.7 中的執行時間:0.016 秒 MySQL 8.0.12 中的執行時間:0.140 秒

INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (1, '18237', '2750');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (2, '18238', '9491');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (3, '18245', '9411');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (4, '18248', '2221');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (5, '18264', '3520');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (6, '18265', '4645');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (7, '18268', '6202');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (8, '18276', '6512');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (9, '18290', '4210');

MySQL 5.7 中的執行時間:0.002 秒 MySQL 8.0.12 中的執行時間:0.681 秒

請不要建議我使用多條記錄優化“插入”。具體來說,我需要在 MySQL 8 中獲得與 MySQL 5.7 中的每個“插入”相同的時間。

我提前感謝您在此問題上為我提供的幫助。

5.7 和 8.0 之間的區別是二進制日誌記錄(用於複製和 PITR)在 MySQL 8.0 中預設啟用。要在 8.0 中不使用二進制日誌記錄執行,請使用--disable-log-bin.

更多細節二進制日誌

二進制日誌包含描述數據庫更改的“事件”,例如表創建操作或表數據更改。它還包含可能已進行更改的語句的事件(例如,不匹配任何行的 DELETE),除非使用基於行的日誌記錄。二進制日誌還包含有關每條語句使用更新數據多長時間的資訊。二進制日誌有兩個重要用途:

  • 對於複製,主複製伺服器上的二進制日誌提供了要發送到從伺服器的數據更改記錄。主伺服器將其二進制日誌中包含的事件發送到其從屬伺服器,從屬伺服器執行這些事件以進行與主伺服器相同的數據更改。請參見第 17.2 節,“複製實現”。
  • 某些數據恢復操作需要使用二進制日誌。恢復備份後,將重新執行備份後記錄的二進制日誌中的事件。這些事件使數據庫從備份點開始更新。請參見第 7.5 節,“使用二進制日誌進行時間點(增量)恢復”。

從 MySQL 8 開始,引入了事務寫集提取算法,即XXHASH64. 新的預設設置將使使用者可以輕鬆地在 master 上啟用二進制日誌寫入集並行化以加速組複製。

$$ 1 $$如果您不使用 MySQL Group Replication,則可以將設置從 更改XXHASH64OFF。如果您並行執行任何從站,則可以啟用二進制日誌。

[mysqld]
#skip-log-bin 
transaction_write_set_extraction=OFF


 [1]: https://mysqlserverteam.com/new-defaults-in-mysql-8-0/

引用自:https://dba.stackexchange.com/questions/216352