讀書筆記–高效能MySQL

來源:互聯網
上載者:User

 

 

MySQL伺服器架構邏輯圖

 

 

共用鎖定 排它鎖

解決並發要使用鎖,分為共用鎖定(shared  lock)和排它鎖(exclusive  lock),也就是讀鎖(read  lock)和寫鎖(write  lock)。

讀鎖是共用的,多個使用者可以同時讀取同一資源而互不干擾;寫鎖是獨佔鎖定,阻塞其他的寫鎖和讀鎖,

 

 

鎖粒度

 

為了更好的實現並發,應該只鎖定需要修改的資料而不用鎖定所有的資源,鎖的粒度越小,同時間能進行的並發就越大。但是如果粒度太小,對鎖的管理(檢查鎖、獲得鎖、釋放鎖)就要消耗很多更多的資源,系統效能也會受到影響;而資料庫主要的任務是讀寫,不是去管理鎖,所以應該考慮折中的方式。鎖策略就是考慮鎖開銷和資料安全的平衡。

 

表鎖(table lock)

在整個表上加鎖,讀寫申請隊列中的寫鎖優先順序高於讀鎖,有寫操作時禁止其他讀和寫。

行級鎖(row locks)

可以支援最大的並發,也帶來最大的開銷。

 

 

事務

事務,一組原子性的sql操作,也叫一個工作單元。     

ACID  

Atomicity         原子性          不可分的工作單元,要麼全執行,要麼全失敗

Consistency     一致性          從一種一致性到另一種一致性,提交之前做的操作不會影響資料庫內容。

Isolation      隔離性          事務完成之後結果才可見,中間過程不可見

Durability    持久性          事務提交後的資料改變是永久性的

 

隔離等級

隔離等級分4級,定義了事務過程中哪些結果是可見的,哪些是不可見的。

Readuncommitted              讀取未提交內容

       所有事務都可以看到其他未提交的事務的執行結果,又稱為髒讀(dirty read)

Readcommitted            讀取提交內容

       事務開始時只能看到已提交的事務改變,一個事務從開始到提交前,資料改變對外不可見。又叫不可重複讀取(nonrepeated)

Repeatable              可重複讀

該事務執行過程中,有另外的事務提交,該事務中看不到變化。除非該事務結束後,重新查看,才能看到變化。

有一個例外是幻讀(phantom read),就是在該事務執行過程中,有其他事務新增記錄,那麼該事務會查到多一條記錄。InnoDB除外,根據搜尋引擎的實現不同,不一定會出現幻讀。

Serializable        可序列化,最進階的隔離等級,代價最高,效能最低。通過強制事務排序,解決幻讀問題。在每個讀的資料行上都加鎖,會導致大量的逾時和鎖競爭。

 

死結

InnoDB處理死結的機制是:復原擁有最少排他行級鎖的事務(一種最易復原事務的大致估算)。

 

交易記錄:

事務採取預寫式日誌(write ahead log)的方式。

先更新記憶體中的資料拷貝,然後將日誌寫入記錄檔,涉及順序IO的磁碟操作。等到某個時間再通過日誌同步資料,  從而替代直接將資料寫入磁碟需要的大量隨機IO操作。用兩次磁碟寫入操作把資料寫入磁碟。

 

 

二相鎖協議(two phase lock protocal)

Mysql的一個事務在任何時刻都可以獲得鎖,但是只有在提交或復原的時候,才會釋放鎖。

多版本並發控制(Multiversion concurrency control)

是通過儲存資料快照實現的。這意味著一個事務的執行個體不論運行多久,期間看到的資料都是一樣的。不同事務看到的一張表的資料可能是不同的。

Mvcc只工作在repeatable read 和 read committed交易隔離等級

 

交易隔離等級為repeatable read的實現方式:

 

為每一行添加兩個隱藏欄位,create_version版本號碼和delete _version版本號碼;每一個事務開始時都要產生一個遞增的系統版本號碼,通過對比版本實現。

Insert             記錄create_version為當前事務版本。

Update 建立一條新的行拷貝記錄,記錄create_version為當前事務版本號碼;同時標記舊記錄的delete_version為當前事務版本號碼。

Delete         標記舊記錄的delete_version為當前事務版本號碼。

 

Select         

查詢要求查看在事務開始之前建立的或者當前事務建立的

同時滿足  在該事務之後刪除的或者沒有被刪除過的

(create<=cur)&& ( delete==null ||delete >cur)

 

好處是大量的讀操作都不必加鎖,提高讀速度;

壞處是為每個行都記錄了多餘的資料,有更多的檢查操作和資料整理操作。

這個講得可以:http://blog.csdn.net/chen77716/article/details/6742128

 

 

查看錶狀態

showtable status like 't_sales_opportunity'

 

myisam的表修複  

checktable mytable

repairtable mytable

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.