MySQL事務優化

2022-06-30 12:09:09 字數 3764 閱讀 1219

事務的概念

事務指邏輯上的一組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。

例如:a——b轉帳,對應於如下兩條sql語句

update from account set money=money-100 where name=『a』;

update from account set money=money+100 where name=『b』;

資料庫開啟事務命令

start transaction 開啟事務

rollback 回滾事務

commit 提交事務

事務的特性(acid)

原子性(atomicity)原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 

一致性(consistency)事務必須使資料庫從乙個一致性狀態變換到另外乙個一致性狀態。

隔離性(isolation)事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。

永續性(durability)永續性是指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

事務的隔離級別

多個執行緒開啟各自事務運算元據庫中資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。

如果不考慮隔離性,可能會引發如下問題:

髒讀:指乙個事務讀取了另外乙個事務未提交的資料。 這是非常危險的,假設a向b轉帳100元,對應sql語句如下所示

1.update account set money=money+100 while name=『b』;

2.update account set money=money-100 while name=『a』;

不可重複讀:在乙個事物內讀取表中的某一行資料,多次讀取結果不同。

例如銀行想查詢a帳戶餘額,第一次查詢a帳戶為200元,此時a向帳戶記憶體了100元並提交了,銀行接著又進行了一次查詢,此時a帳戶為300元了。銀行兩次查詢不一致,可能就會很困惑,不知道哪次查詢是準的。

和髒讀的區別是,髒讀是讀取前一事務未提交的髒資料,不可重複讀是重新讀取了前一事務已提交的資料。

很多人認為這種情況就對了,無須困惑,當然是後面的為準。我們可以考慮這樣一種情況,比如銀行程式需要將查詢結果分別輸出到電腦螢幕和寫到檔案中,結果在乙個事務中針對輸出的目的地,進行的兩次查詢不一致,導致檔案和螢幕中的結果不一致,銀行工作人員就不知道以哪個為準了。

虛讀/幻讀是指在乙個事務內讀取到了別的事務插入的資料,導致前後讀取不一致。

如丙存款100元未提交,這時銀行做報表統計account表中所有使用者的總額為500元,然後丙提交了,這時銀行再統計發現帳戶為600元了,造成虛讀同樣會使銀行不知所措,到底以哪個為準。

事務隔離性的設定語句

資料庫共定義了四種隔離級別:

serializable:可避免髒讀、不可重複讀、虛讀情況的發生。(序列化)

repeatable read:可避免髒讀、不可重複讀情況的發生。(可重複讀)

read committed:可避免髒讀情況發生(讀已提交)。

read uncommitted:最低級別,以上情況均無法保證。(讀未提交)

set transaction isolation level 設定事務隔離級別

select @@tx_isolation 查詢當前事務隔離級別

mysql優化

系統優化:硬體、架構

服務優化

應用優化

影響效能的因素:

應用程式、查詢、事務管理、資料庫設計、資料分布、網路作業系統、硬體

系統優化:

1、硬體優化

cpu 64位 一台機器8-16顆cpu 記憶體 96-128g 3-4個例項

硬碟:數量越多越好

效能:ssd(高併發業務) > sas (普通業務)>sata(線下業務) raid 4塊盤,效能 raid0 > raid10 > raid5 > raid1

網絡卡:多塊網絡卡bond

2、軟體優化 作業系統:使用64位系統 軟體:mysql 編譯優化

服務優化:

mysql配置原則

配置合理的mysql伺服器,盡量在應用本身達到乙個mysql最合理的使用

針對 myisam 或 innodb 不同引擎進行不同定製性配置

針對不同的應用情況進行合理配置針對 my.cnf 進行配置,後面設定是針對記憶體為2g的伺服器進行的合理設定

公共選項

選項預設值

推薦值說明

max_connections

1001024

mysql伺服器同時處理的資料庫連線的最大數量

query_cache_size

0 (不開啟)

16m查詢快取區的最大長度,按照當前需求,一倍一倍增加,本選項比較重要

sort_buffer_size

512k

16m每個執行緒的排序快取大小,一般按照記憶體可以設定為2m以上,推薦是16m,該選項對排序order by,group by起作用

record_buffer

128k

16m每個進行乙個順序掃瞄的執行緒為其掃瞄的每張表分配這個大小的乙個緩衝區,可以設定為2m以上

table_cache

64512

為所有執行緒開啟表的數量。增加該值能增加mysqld要求的檔案描述符的數量。mysql對每個唯一開啟的表需要2個檔案描述符。

myisam 選項

選項預設值

推薦值說明

key_buffer_size

8m256m

用來存放索引區塊的快取值, 建議128m以上,不要大於記憶體的30%

read_buffer_size

128k

16m用來做myisam表全表掃瞄的緩衝大小. 為從資料表順序讀取資料的讀操作保留的快取區的長度

myisam_sort_buffer_size

16m128m

設定,恢復,修改表的時候使用的緩衝大小,值不要設的太大

innodb 選項

選項預設值

推薦值說明

innodb_buffer_pool_size

32m1g

innodb使用乙個緩衝池來儲存索引和原始資料, 這裡你設定越大,你在訪問表裡面資料時所需要的磁碟i/o越少,一般是記憶體的一半,不超過2g,否則系統會崩潰,這個引數非常重要

innodb_additional_mem_pool_size

2m128m

innodb用來儲存 metadata 資訊, 如果記憶體是4g,最好本值超過200m

innodb_flush_log_at_trx_commit10

0 代表日誌只大約每秒寫入日誌檔案並且日誌檔案重新整理到磁碟; 1 為執行完沒執行一條sql馬上commit; 2 代表日誌寫入日誌檔案在每次提交後,但是日誌檔案只有大約每秒才會重新整理到磁碟上. 對速度影響比較大,同時也關係資料完整性

innodb_log_file_size

8m256m

在日誌組中每個日誌檔案的大小, 一般是innodb_buffer_pool_size的25%,官方推薦是 innodb_buffer_pool_size 的 40-50%, 設定大一點來避免在日誌檔案覆寫上不必要的緩衝池重新整理行為

innodb_log_buffer_size

128k

8m用來緩衝日誌資料的緩衝區的大小. 推薦是8m,官方推薦該值小於16m,最好是 1m-8m 之間

MySql優化 五 事務

事務在程式裡很常見 當乙個程式要執行多條sql語句時無法保證都能成功 有可能出現插入一半出現了意外 導致下面無法進行 這就無法保證要麼做要不都不做 原子性 也無法保證 資料的一致性 例子 如果你用手機進行銀行轉賬 a 轉給b a應該減少資產 b應該是增加資產 如果 只有一方成功 無法完成轉賬 這個時...

mysql優化(1) mysql事務

事務是mysql等關係型資料庫區別於nosql的重要方面 隨著發展nosql資料庫也開始有了事物的概念 是保證資料一致性的重要手段。本文將首先介紹mysql事務相關的基礎概念,然後介紹事務的acid特性,並分析其實現原理。事務由乙個或多個sql語句組成乙個整體,如果所有的語句執行成功那麼修改將會全部...

MySQL事務 索引和SQL優化

為完善mysql基礎博文,另外開一片博文,講一講事務機制 索引和一些優化技巧。談到事務,不免需要揪出mysql中的引擎,常用的引擎有myisam和innodb,後者才具有事務機制 innodb引擎 並且,在mysql5.7版本之後,預設引擎是innodb,通常情況下選innodb是正確的 這些概念性...