MySQL InnoDB 引擎的永續性與效能

2022-04-13 12:07:49 字數 3515 閱讀 9101

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> select

version();

+------------+

| version() |

+------------+

| 5.6.29-log |

+------------+

php 7.0.7

[root@localhost test]# php -v

php

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

create

table

`i` (

`id`

int(10) not

null

auto_increment,

`number` int(10) not

null

default'0

',primary

key(`id`)

) engine

=innodb default charset=latin1

php 檔案:

<?php 

set_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 公司開...