国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

Windows下關閉MySQL的自動提交 autocommit 性能

2024-07-24 12:34:34
字體:
來源:轉載
供稿:網友
  隨著MySQL的應用日益廣泛,支持事務特性的InnoDB已經成為MySQL的默認存儲引擎。和很多關系數據庫不同的是,在InnoDB存儲引擎中,事務默認是自動提交的,也就是說每條DML語句都會觸發commit操作。這一自動提交(autocommit)特性在很多場景下對于性能還是有一定影響的。
 
  最近我們嘗試將一個Oracle數據庫的數據遷移到MySQL數據庫,發現導入時間很長。舉個例子來說,其中有一個表包含四千多條數據,插入時間竟然超過了100秒。每插入一條數據,數據庫就會自動提交一次,也就是說單這一個表MySQL會commit超過4000次,如果我們關閉自動提交功能,通過程序來控制,只要一次commit就可以了。
 
  那么,如何關閉MySQL的autocommit特性呢?
  通常有兩種方法:
  一種是通過set命令修改會話級別或者數據庫級別的參數,但是數據庫重啟后參數會恢復默認值;
  第二種方法是修改mysql的配置文件my.ini,一勞永逸。
 
  1.測試環境 Windows Server 2008 r2+MySQL Community Server (GPL) 5.7.16
  我是在Windows Server 2008 r2環境下進行測試。
  點擊(此處)折疊或打開
 
  mysql> status
  --------------
  mysql Ver 14.14 Distrib 5.7.16, for Win64 (x86_64)
 
  Connection id: 2
  Current database:
  Current user: root@localhost
  SSL: Not in use
  Using delimiter: ;
  Server version: 5.7.16 MySQL Community Server (GPL)
  Protocol version: 10
  Connection: localhost via TCP/IP
  Server characterset: latin1
  Db characterset: latin1
  Client characterset: utf8
  Conn. characterset: utf8
  TCP port: 3306
  Uptime: 9 min 5 sec
 
  Threads: 1 Questions: 7 Slow queries: 0 Opens: 106 Flush tables: 1 Open tables: 99 Queries per second avg: 0.012
  --------------
 
  mysql>
 
  2.通過set來關閉autocommit,重啟后恢復默認值
  首先,我們通過set命令來修改autocommit參數。
  點擊(此處)折疊或打開
 
  mysql>
  mysql> show global variables like '%commit%';
  +-----------------------------------------+-------+
  | Variable_name | Value |
  +-----------------------------------------+-------+
  | autocommit | ON |
  | binlog_group_commit_sync_delay | 0 |
  | binlog_group_commit_sync_no_delay_count | 0 |
  | binlog_order_commits | ON |
  | innodb_api_bk_commit_interval | 5 |
  | innodb_commit_concurrency | 0 |
  | innodb_flush_log_at_trx_commit | 1 |
  | slave_preserve_commit_order | OFF |
  +-----------------------------------------+-------+
  8 rows in set, 1 warning (0.00 sec)
 
  mysql> set autocommit=0;
  Query OK, 0 rows affected (0.00 sec)
  mysql>
  mysql> set global autocommit=0;
  Query OK, 0 rows affected (0.00 sec)
 
  mysql> show global variables like '%commit%';
  +-----------------------------------------+-------+
  | Variable_name | Value |
  +-----------------------------------------+-------+
  | autocommit | OFF |
  | binlog_group_commit_sync_delay | 0 |
  | binlog_group_commit_sync_no_delay_count | 0 |
  | binlog_order_commits | ON |
  | innodb_api_bk_commit_interval | 5 |
  | innodb_commit_concurrency | 0 |
  | innodb_flush_log_at_trx_commit | 1 |
  | slave_preserve_commit_order | OFF |
  +-----------------------------------------+-------+
  8 rows in set, 1 warning (0.02 sec)
 
  mysql>
 
  接下來,我們重啟數據庫,發現autocommit參數已經恢復默認值。
  點擊(此處)折疊或打開
 
  E:/mysql-5.7.16-winx64/bin>net stop mysql
  MySQL 服務正在停止.
  MySQL 服務已成功停止。
 
 
  E:/mysql-5.7.16-winx64/bin>net start mysql
  MySQL 服務正在啟動 .
  MySQL 服務已經啟動成功。
 
 
  E:/mysql-5.7.16-winx64/bin>mysql -u root -proot
  mysql: [Warning] Using a password on the command line interface can be insecure.
  Welcome to the MySQL monitor. Commands end with ; or /g.
  Your MySQL connection id is 2
  Server version: 5.7.16 MySQL Community Server (GPL)
 
  Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
 
  Oracle is a registered trademark of Oracle Corporation and/or its
  affiliates. Other names may be trademarks of their respective
  owners.
 
  Type 'help;' or '/h' for help. Type '/c' to clear the current input statement.
 
  mysql>
  mysql> show global variables like '%commit%';
  +-----------------------------------------+-------+
  | Variable_name | Value |
  +-----------------------------------------+-------+
  | autocommit | ON |
  | binlog_group_commit_sync_delay | 0 |
  | binlog_group_commit_sync_no_delay_count | 0 |
  | binlog_order_commits | ON |
  | innodb_api_bk_commit_interval | 5 |
  | innodb_commit_concurrency | 0 |
  | innodb_flush_log_at_trx_commit | 1 |
  | slave_preserve_commit_order | OFF |
  +-----------------------------------------+-------+
  8 rows in set, 1 warning (0.00 sec)
 
  mysql>
  3.修改mysql的配置文件my.ini
  我們找到mysql的配置文件my.ini,在里面添加一行記錄“autocommit=0”。
  點擊(此處)折疊或打開
 
  [mysql]
  default-character-set=utf8
  [mysqld]
  max_connections=200
  default-storage-engine=INNODB
  basedir =E:/mysql-5.7.16-winx64/bin
  datadir =E:/mysql-5.7.16-winx64/data
  port = 3306
  autocommit=0
 
  然后重新啟動數據庫,確認autocommit參數是否為OFF。
  點擊(此處)折疊或打開
 
  E:/mysql-5.7.16-winx64/bin>net stop mysql
  MySQL 服務正在停止.
  MySQL 服務已成功停止。
 
 
  E:/mysql-5.7.16-winx64/bin>net start mysql
  MySQL 服務正在啟動 .
  MySQL 服務已經啟動成功。
 
 
  E:/mysql-5.7.16-winx64/bin>mysql -u root -proot
  mysql: [Warning] Using a password on the command line interface can be insecure.
  Welcome to the MySQL monitor. Commands end with ; or /g.
  Your MySQL connection id is 2
  Server version: 5.7.16 MySQL Community Server (GPL)
 
  Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
 
  Oracle is a registered trademark of Oracle Corporation and/or its
  affiliates. Other names may be trademarks of their respective
  owners.
 
  Type 'help;' or '/h' for help. Type '/c' to clear the current input statement.
 
  mysql> show global variables like '%commit%';
  +-----------------------------------------+-------+
  | Variable_name | Value |
  +-----------------------------------------+-------+
  | autocommit | OFF |
  | binlog_group_commit_sync_delay | 0 |
  | binlog_group_commit_sync_no_delay_count | 0 |
  | binlog_order_commits | ON |
  | innodb_api_bk_commit_interval | 5 |
  | innodb_commit_concurrency | 0 |
  | innodb_flush_log_at_trx_commit | 1 |
  | slave_preserve_commit_order | OFF |
  +-----------------------------------------+-------+
  8 rows in set, 1 warning (0.01 sec)
 
  mysql>
  mysql>
  我們看到autocommit參數為OFF,目標達成。
 
  4.數據插入速度提升十倍
  以開頭提到的那張表為例,4000多條數據,在關閉autocommit參數之前插入時間為101505ms;關閉autocommit參數之后插入時間為8869ms,插入速度提升了十倍還多。
 
  但是這個時間其實還是蠻長的,繼續提升!

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福泉市| 凤台县| 河曲县| 迁西县| 松溪县| 台东市| 荥经县| 武夷山市| 四会市| 朝阳市| 齐河县| 麦盖提县| 嘉兴市| 延庆县| 鄄城县| 永城市| 扶风县| 勐海县| 文昌市| 临沧市| 手游| 高邮市| 都兰县| 新泰市| 伊宁县| 儋州市| 藁城市| 礼泉县| 勐海县| 新民市| 崇礼县| 斗六市| 达尔| 玉山县| 四平市| 霍邱县| 长宁区| 岳池县| 抚顺县| 宣化县| 九龙县|