科技知識動態:高性能MySQL

導讀跟大家講解下有關高性能MySQL,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說高性能MySQL,小編也收集到了有關高性能MySQL

跟大家講解下有關高性能MySQL,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說高性能MySQL,小編也收集到了有關高性能MySQL的相關資料,希望大家看到了會喜歡。

MySQL邏輯架構 1.每個客戶連接在服務器進程中都擁有自己的線程,每個連接所屬的查詢都會在指定的某個單獨線程中完成,這些線程輪流運行在某個CPU核心或CPU上。服務器負責緩存線程,因此不需要為每個新的連接重建或撤銷線程。 2.MySQL會解析查詢,并創建一個

MySQL邏輯架構

mysql-arch

1.每個客戶連接在服務器進程中都擁有自己的線程,每個連接所屬的查詢都會在指定的某個單獨線程中完成,這些線程輪流運行在某個CPU核心或CPU上。服務器負責緩存線程,因此不需要為每個新的連接重建或撤銷線程。

2.MySQL會解析查詢,并創建一個內部數據結構(解析樹),然后對其進行各種優化。其中包括重寫查詢,決定查詢的讀表順序,以及選擇需使用的索引等。用戶可以通過特殊的關鍵字給優化器傳遞各種提示,影響它的決策過程。另外還可以請求服務器給出優化過程的各種說明,使用戶可以知曉服務器是如何進行優化決策的,為用戶提供一個參考基準,方便用戶重寫查詢、架構和修改相關配置,便于應用盡可能高效地運行。

優化器并不關心某個表使用哪種存儲引擎,但存儲引擎對服務器的查詢優化過程有影響。優化器會請求存儲引擎為某種具體操作提供性能與開銷方面的信息,以及表內數據的統計信息。

不過,在解析查詢之前,服務器會"詢問"查詢緩存,它只能保存SELECT語句和相應的結果。如果能在緩存中找到將要執行的查詢,服務器就不必重新解析、優化或重新執行查詢,只需直接返回已有結果即可。

并發控制

1.讀鎖(Read Lock)/寫鎖(Write Lock):并發控制的概念很簡單-在處理并發寫或并發讀時,系統會使用一套鎖系統來解決問題。這種鎖系統由兩類鎖組成,通常稱之為 共享鎖 (Shared Lock)和 排他鎖 (Exclusive Lock),或者叫 讀鎖 (Read Lock)和 寫鎖 (Write Lock)。

2.鎖粒度(Lock Granularity):一種提高共享資源并發性的方法就是讓鎖定對象更有選擇性。要記住只鎖定部分需修改的數據,而不是所有的資源。任何時間,在給定的資源上,被加鎖的數據量越小,就可以允許更多的并發修改,只要相互之間互不沖突即可。問題是加鎖也會消耗系統資源。每一種鎖操作,如獲得鎖、檢查鎖是否已解除,以及釋放鎖等,都會增加系統的開銷。所謂的鎖策略,就是在鎖開銷和數據安全之間尋求一種平衡。為此,MySQL提供了多種選擇。每種MySQL存儲引擎都可以實現獨有的鎖策略或鎖粒度。

表鎖(Table Lock):開銷最小的鎖策略

行級鎖(Row Locks):最大并發處理的鎖策略

事務

事務是一組原子性的SQL查詢語句,也可以被看作一個工作單元。如果數據庫引擎能夠成功地對數據庫應用所有的查詢語句,它就會執行所有查詢,但是,如果任何一條查詢語句因為崩潰或其他原因而無法執行,那么所有的語句就都不會執行。也就是說,事務內的語句要么全部執行,要么一句也不執行。

ACID :

原子性(Atomicity) - 一個事務必須被視為一個單獨的內部"不可分"的工作單元,以確保整個事務要么全部執行,要么全部回滾。

一致性(Consistency) - 數據庫總是從一種一致性狀態轉換到另一種一致性狀態。

隔離性(Isolation) - 某個事務的結果只有在完成后才對其他事務可見。

持久性(Durability) - 一旦一個事務提交,事務所做的數據改變將是永久的。

1.隔離級:SQL標準定義了4類隔離級,

READ UNCOMMITTED(讀取未提交內容) - 在READ UNCOMMITTED隔離級,所有事務都可以"看到"未提交事務的執行結果。在這種級別上,可能會產生很多問題,所以很少用于實際應用。讀取未提交數據,也被稱為"臟讀"(Dirty Read)。

READ COMMITTED(讀取提交內容) - 大多數數據庫系統的默認隔離級別是READ COMMITTED(但這不是MySQL默認的!)。它滿足了隔離性的早先定義。也支持所謂的"不可重復讀"(Nonrepeatable Read)。這意味著用戶運行同一語句兩次,看到的結果是不同的。

REPEATABLE READ(可重復讀) - 確保同一事務的多個實例在并發讀取數據時,會"看到同樣的"數據行。不過理論上,這會導致另一個問題: 幻讀 (Phantom Read)。簡單來說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的"幻影"行。InnoDB和Falcon存儲引擎通過多版本并發控制機制解決了幻讀問題。(MySQL的默認事務隔離級)

SERIALIZABLE(可串行化) - 最高級別的隔離級,通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,SERIALIZABLE是在每個讀的數據行上加鎖。在這個級別,可能導致大量的超時(Timeout)現象和鎖競爭(Lock Contention)現象

多版本并發控制

MVCC(Multiversion Concurrency Control)是通過及時保存在某些時刻的數據快照,而得以實現的。這意味著同一事務的多個實例,在同時運行時,無論實例運行多久,它們看到的數據視圖是一致的。而同一時間,對于同一張表,不同事務看到的數據卻是不同的。

InnoDB通過為每個數據行增加兩個隱含值的方式來實現MVCC。這兩個隱含值記錄了行的創建時間,以及它的過期時間(或者叫刪除時間)。每一行都存儲了事件發生時的系統版本號,用來替代事件發生時的實際時間。每一次,開始一個新事務時,版本號都會自動遞增。每個事務都會保存它在開始時的"當前系統版本"的記錄,而每個查詢都會根據事務的版本號,檢查每行數據的版本號。

MySQL的存儲引擎

在文件系統中,MySQL會把每個數據庫保存為數據目錄下的一個子目錄。當創建一個表時,MySQL會在和表名同名的、以.frm為后綴的文件中存儲表的定義。因為MySQL使用文件系統來存儲數據庫名和表定義,大小寫敏感將依賴于具體的平臺。在Windows平臺上,MySQL的實例(Instance)名、表名、數據庫名都是大小寫不敏感的; 在Unix類平臺上,則是大小寫敏感的。

1.MyISAM引擎

一般來說,MyISAM將每個表存為兩個文件:數據文件和索引文件。兩個文件的擴展名分別為.MYD和.MYI。MyISAM的格式是平臺通用的,這意味著用戶可以在不同架構的服務器上毫無問題地相互拷貝數據文件和索引文件。

MyISAM表可以包含動態行和靜態行(即固定長度行)。MySQL會根據表定義決定選用何種格式。MyISAM表的可容納的行總數,一般只受限于數據庫服務器的可用磁盤空間大小,以及操作系統允許創建的最大文件大小。

MyISAM的特性:

-加鎖與并發 - MyISAM對整張表進行加鎖,而不是行。

-...

2.InnoDB引擎

InnoDB專為事務處理設計的一款存儲引擎,特別是用于處理大量短期(Short-lived)事務,短期事務是指一般能正常完成,不需要回滾的事務。

InnoDB將所有數據共同存儲在一個或幾個數據文件中,這種數據文件一般稱之為 表空間 。在MySQL 4.1版以及更新版本中,InnoDB也支持將每個表和相關索引存儲為單獨的分離文件。

InnoDB使用MVCC機制獲取高并發性能,并且實現所有四個標準隔離級別。默認隔離級別是REPEATABLE READ,在這個隔離級上,使用間隙鎖策略防止"幻讀"問題的產生。

InnoDB表是基于 聚簇索引建立的,能提供一種非常快速的主鍵查找性能。不過,它的輔助索引(Secondary Index,也就是非主鍵索引)也會包含主鍵列,所以,如果主鍵定義的比較大,其他索引也將很大。如果想在表上定義很多索引,則爭取盡量把主鍵定義得小一些。InnoDB不會壓縮索引。

選擇合適的引擎

考慮的因素:事務,并發,備份,崩潰后恢復,特有特性

參考資料

高性能MySQL

什么是臟讀、不可重復讀、幻讀

來源:php中文網

免責聲明:本文由用戶上傳,如有侵權請聯系刪除!