mysql 事務的 acid 特性中,d 代表永續性(durability):在使用 innodb 引擎時,當返回客戶端乙個成功完成事務的確認時, innodb 就會保證資料的一致性,即使該資料在此時還沒有寫入磁碟,因為 innodb 引擎的重做日誌已經連續地記錄了已完成的事務。innodb 不是在事務執行的時候直接將資料寫入磁碟,即不會立即將更新的資料寫入磁碟,而是由 innodb 儲存引擎的後台 worker 執行緒負責執行。可以根據在配置檔案中的配置來設定日誌寫入磁碟的頻率,預設情況下是每次事務會刷寫到磁碟一次。
不同的永續性設定會對資料庫的效能產生很大的影響,預設情況下配置檔案 my.ini 或 my.cnf 中 innodb_flush_log_at_trx_commit 的值為 1:
mysql>select
@@global
.innodb_flush_log_at_trx_commit;+--
---------------------------------------+
|@@global.innodb_flush_log_at_trx_commit |+--
---------------------------------------+|1
|+-----------------------------------------+
不同的設定會改變 innodb 的永續性和效能,該選項有 3 個值:
1(預設)
對於每個事務日誌,innodb 都會把日誌寫入(write)並刷寫(flush)到磁碟。速度最慢,但是最持久
2innodb 將所有發生的事務日誌寫入(write)磁碟,並且每秒對這些資料刷寫(flush)一次
0innodb將最近一秒中所發生的所有事務日誌寫入(write)磁碟,然後將這些日誌刷寫(flush)到磁碟。
(寫日誌在 write 時發生 ,寫入資料檔案到磁碟在作業系統 flush buffer 時發生)
在一些場景下可以通過破壞真正的永續性來顯著提高效能。
測試一下 myisam 引擎、 innodb 引擎(不同永續性下)的插入速度。
測試環境:
centos6.6 64-bit/2g
mysql 5.6.29
mysql> selectversion();
+------------+
| version() |
+------------+
| 5.6.29-log |
+------------+
php 7.0.7
[root@localhost test]# php -vphp
7.0.7 (cli) (built: feb 11
2017
16:47:30
) ( nts )
1997-2016
the php group
zend engine v3.
表結構:
myisam
create
table
`m` (
`id`
int(10) not
null
auto_increment,
`number` int(10) not
null
default'0
',primary
key(`id`)
) engine
=myisam default charset=latin1
innodb
createtable
`i` (
`id`
int(10) not
null
auto_increment,
`number` int(10) not
null
default'0
',primary
key(`id`)
) engine
=innodb default charset=latin1
php 檔案:
<?phpset_time_limit(0);
$host = 'localhost';
$user = 'root';
$pwd = 'root';
$database = 'test';
$mysqli = new mysqli($host, $user, $pwd, $database
);if($mysqli->connect_error)
$table_name = 'example_myisam';
//$table_name = 'example_innodb';
$times = 10000;
$sql_truncate = "truncate table ";
$mysqli->query($sql_truncate
);$time = -microtime(true
);for($i = 0; $i
< $times; $i++)
(`number`) values ()";
if(false === $mysqli->query($sql
))
}$time += microtime(true
);echo '用時',$time,'秒';
myisam
innodb.innodb_flush_log_at_trx_commit =1
innodb.innodb_flush_log_at_trx_commit =2
innodb.innodb_flush_log_at_trx_commit =0
第1次第2次
第3次
平均 第1次
第2次
第3次
平均 第1次
第2次
第3次
平均 第1次
第2次
第3次
平均 1w
0.697s
0.722s
0.822s
0.747s
18.204s
19.012s
17.173s
18.130s
0.842s
0.871s
1.058s
0.924s
0.796s
0.795s
0.966s
0.852s
10w
6.579s
6.421s
6.703s
6.568s
201.111s
198.429s
140.926s
180.155s
9.208s
9.566s
9.068s
9.281s
8.022s
7.838s
7.918s
7.926s
mysql InnoDB儲存引擎
innodb的組成部分 1.後台執行緒 2.儲存引擎記憶體池 innodb儲存引擎記憶體緩衝池 1.記憶體緩衝池 innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩...
Mysql Innodb儲存引擎
鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...
MYSQL INNODB 儲存引擎
innodb 是事務安全的mysql儲存引擎,設計上採用了類似於oracle的架構。一般而言,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。同時,也是因為innodb的存在,才使得mysql變得更有魅力。第一 innodb儲存引擎概述 innodb由innobase oy 公司開...