《mysql高性能-學習筆記》要點:
本文介紹了mysql高性能-學習筆記,希望對您有用。如果有疑問,可以聯系我們。
Mysql架構與歷史總結
1.mysql的邏輯結構
a.第一層,基于網絡的客戶端/服務器的工具或者服務都有類似的結構,比如連接處理,授權認證,平安等
b.第二層:包括查詢解析,分析,優化,緩存以及所有內置函數,存儲過程,觸發器,視圖等
c.存儲引擎,負責mysql中數據的存儲和提取,
1.1 連接管理與平安性
每個連接擁有一個線程,服務器會負責緩存線程,因此不需要為每一個新建的連接創建或者銷毀線程.
當連接時,會進行認證,基于用戶名,原始主機信息和密碼,一旦連接成功,會繼續認證該客戶端是否具有執行某個特定查詢的權限
1.2 優化和執行
mysql會解析查詢,并創建內部數據結構,然后對其進行優化,包括重寫查詢,決定表的讀取順序,以及選擇合適的索引等.
2.mysql并發控制
mysql并發控制主要在兩個層面,服務器層和存儲引擎層面.
解決并發控制的經典做法是:通過共享鎖(讀鎖)和排他鎖(寫鎖),寫鎖會阻塞其他的寫鎖和讀鎖.鎖的策略就是在平安性和鎖的開銷之間的平衡性.鎖的開銷主要有獲得鎖、檢查鎖、釋放鎖,鎖的粒度的問題,mysql主要提供了兩種粒度的鎖:表鎖、行級鎖.表鎖是開銷最小的鎖策略,會鎖定整張表.行鎖能最大限度的支持并發處理,相應的是開銷最大,行鎖實現在存儲引擎層,在服務器層沒有實現.
3.事務處理
事務就是一組原子性的sql查詢,事務內的語句要么全部執行,要么執行失敗,事務需要具有ACID特性,典型例子就是銀行轉賬,ACID表示原子性(atomicity)、一致性( consistency)、隔離性(isolation)和持久性(durability),在應用邏輯中實現事務的ACID幾乎不可能.
數據庫隔離級別主要有四種,mysql使用的是可串行化、repetable read(可重復讀)、(read commited)提交讀、(read uncommited)未提交讀,提交讀:對表進行更新,不提交事務,讀取數據發現還是原數據,提交事務后讀取的是新的數據,在提交事務前所做的修改對于讀是不可見的.不可重復讀:進行一個A事務,讀記錄,B事務插入數據,A事務執行相同的查詢,兩次得到不同的結果(幻讀的問題).
一組原子性的sql查詢,
隔離級別: 未提交讀,提交讀,可重復讀,可串行化
事務日志:幫助提高事務的效率,使用事務日志,存儲引擎在修改表的數據時只需要修改其內存拷貝,
mysql中的事務: InnoDb,NDB cluster
4.多版本并發控制(MVCC)
MySQL的大多數事務存儲引擎的實現都不是簡單的行級鎖,基于提升并發性能的考慮,它們一般都實現了MVCC,不僅MySQl, Oracle,PostgreSQL等其他數據庫系統也都實現了MVCC,但各自的實現機制各不相同,MVCC并沒有統一的實現標準.可以認為MVCC是行級鎖的一個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低.雖然實現機制各不相同,但是大都實現了非阻塞的讀操作,鎖操作也只鎖定必要的行.
MVCC的實現,是通過保存數據在某個時間點的快照實現的.也就是說,不管執行多長時間,每個事務看到的數據都是一致的.
不同存儲引擎的MVCC實現是不同的,典型的有樂觀并發控制和悲觀并發控制.
InnoDB的MVCC, 是通過在每行記錄后面保存兩個隱藏的列來實現的.這兩個列,一個保存了行的創建版本,一個保存了行的過期版本(刪除版本);.每開始一個新的事物,系統版本號都會遞增.事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每個記錄的版本號比較
5.鎖粒度
一般情況下,鎖定的數據量越少,則系統的并發程度越高.鎖策略是在鎖的開銷和平安性之間尋求平衡.大多數一般是在表上施加行級鎖.Mysql中每個存儲引擎都可以實現自己的鎖策略和鎖粒度.Mysql中有表鎖和行級鎖.
表鎖
是Mysql中最基本的鎖策略,并且是開銷最小的策略,它會鎖定整個表.一個用戶對表進行寫操作,需要首先獲得寫鎖,這回阻塞其他用戶對該表的所有讀寫操作.
盡管存儲引擎可以管理自己的鎖,但是Mysql本身還是會使用各種有效的表鎖來實現不同的目的.比如:服務器會為諸如:ALTER Table之類的語句使用表鎖,而忽略存儲引擎的鎖機制.
行級鎖
行級鎖可以最大程度的支持并發處理,INNodb和XtraDB存儲引擎中實現了行級鎖.行級鎖只在存儲引擎層實現,而在Mysql服務器層沒有實現.服務器層完全不了解存儲引擎中的鎖實現
6.mysql的存儲引擎
InnoDB存儲引擎
事務型,用來處理大量的短期(short-lived)事務,采用MVCC支持高并發,默認使用REPEATABLE READ(可重復讀)隔離級別,可防止幻影行插入,基于聚簇索引建立,支持熱備份;熱備份就是可以不用停止讀或寫就可以獲得一致性視圖.
MyISAM存儲引擎
非事務型,不支持事務和行級鎖,采用表級鎖,奔潰后無法平安恢復;支持基于分詞創建的全文索引;其表級鎖表現為:讀取時加共享鎖,寫入時加排他鎖,但讀取時也可以插入新記錄;MyISAM引擎設計簡單,數據以緊密格式存儲,某些場景性能很好.但根本問題是表級鎖問題,使查詢處于Locked狀態.
維易PHP培訓學院每天發布《mysql高性能-學習筆記》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7896.html