mysql高效能學習(一)

2021-08-03 02:39:22 字數 2275 閱讀 8036

最上層的服務不是,mysql所獨有的,主要用於連線處理,授權認證,安全等。

第二層是mysql的核心層,所有核心功能都在這一層,包括查詢解析,分析,優化,快取

以及所有的內建函式,所有跨儲存引擎功能 都在這 一層實現:儲存過程,觸發器,

檢視等。

第三層包含了儲存引擎,負責mysql中資料的儲存和提取。

1 read_uncommited(未提交讀):事務沒提交,修改對其他可見,也可以稱為髒讀

2 read commited(提交讀):只能看到已經提交的修改,也可以叫不可重複讀

3 repeatable read(可重複讀):mysql的預設事務隔離級別

可能導致大量超時以及鎖競爭的問題,實際很少使用這種級別

使用事務日誌,儲存引擎在修改表資料時只需要修改記憶體拷貝,再將修改行為記錄到

硬碟上的事務日誌中,如果資料修改已經記錄到事務日誌並持久化,但資料本身沒有

寫回磁碟,此時系統崩潰,儲存引擎在重啟時能夠自動恢復修改的資料。

innodb目前處理死鎖的方法是,將持有最少行級排他鎖的事務進行回滾(這是相對比

較簡單的死鎖回滾演算法)

可以認為mvcc是行級鎖的變種,但是在很多情況下,避免了加鎖的操作,因此鎖的開

銷更低。雖然實現機制有所不同,但是大都是非阻塞的讀操作,寫操作也只鎖定必要的行。

mvcc是通過儲存資料在某個時間點的快照來實現的,不同的儲存引擎的mvcc的實現是

不同的,典型的有樂觀併發控制和悲觀併發控制。

innodb的mvcc,是通過在每行記錄後面儲存兩個隱藏列來實現的,乙個是行建立時間,

乙個是行過期(刪除)時間,這裡的時間指的是系統的版本號,每開啟個新的事務系統

版本號會增加。

下面是repeatable read隔離級別下,mvcc的操作:

select

innodb只查詢版本早於當前事務版本的資料行,這樣確保事務讀取的行,要麼是

開啟前已經存在的,要麼是自身事務插入或者修改過的行的刪除要麼未定義,要麼

大於當前事務的版本號,確保事務讀取到的行在事務開始之前未刪除。

insert

為新插入的每一行儲存當前系統的版本號作為行版本號

delete

為刪除的每一行儲存當前系統版本號作為刪除的版本號

update

插入新紀錄儲存當前系統的版本號作為行號,同時儲存當前系統的版本號到原

來的行作為刪除標識

innodb是mysql的預設儲存引擎,自身支援事務,innodb的效能和自動崩潰

恢復的特性,使得他在非事務型儲存的需求中也很流暢。

innodb的資料儲存在表空間中,表空間由一系列資料檔案組成,4。1版本以後,

innodb將每個表的資料和索引放在單獨的檔案中。

innodb採用mvcc來支援高併發,並實現了4個標準的隔離級別。預設是

reoeatable read,並通過間隙鎖策略防止幻讀的發生。

innodb表是基於聚簇索引建立的,聚簇索引對主鍵查詢有很高的效能。

作為事務型儲存引擎,innodb通過一些機制和工具支援真正的熱備份,

mysql的其他儲存引擎不支援熱備份,要獲取一致性檢視需要停止對所

有表的寫入。

在mysql5.1之前的版本,myisam是預設的儲存引擎,它提供了大量的

特性,全文索引,壓縮,空間函式等,但是它不支援事務和行級鎖,最大

的缺陷就是崩潰後無法恢復,但是也不是一無是處,對於唯讀資料,或者

表比較小,可以忍受修復操作的,可以使用。。該引擎設計簡單,資料以

緊密格式儲存,所以在某些場景下效能很好對於myisam的表建立了以後不

會再修改的,可以採用壓縮表,壓縮表可以極大的減少空間占用,壓縮表也

是支援索引的,但是索引是唯讀的。

如果需要快速訪問資料,並且這些資料不會被修改,重啟以後丟失也沒有關

系,那麼memory表是非常有用的,它要比myisam快乙個數量級,因為所有

的資料儲存在記憶體中,不需要磁碟的i/o操作,memory表的結構重啟以後還

會保留,就是資料會丟失。

例如,可以有以下應用場景:

用於查詢或者對映表

用於快取週期性聚合資料的結果

用於儲存資料分析產生的中間資料

memory支援hash索引,因此查詢操作非常快,是表級鎖,因此併發寫入效能

較低。

《高效能mysql》學習

整型型別 tinyint,smallint,mediumint,int,bigint 有可選的unsigned屬性 表示不允許負值 例 tinyint unsigned 儲存的範圍是0 255,tinyint則表示 128 127 實數型別 float和double型別支援使用標準的浮點運算進行近似...

高效能mysql(一) 建立高效能索引

單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...

高效能MySQL學習筆記一 MySQL架構

mysql最與眾不同的特性是 它的儲存引擎架構,這種架構的設計將查詢處理以及其他系統任務和資料的儲存 提取相分離。這種處理和儲存相分離的設計可以在使用時根據效能 特性,以及其他需求來選擇資料儲存的方式。mysql預設採用自動提交模式。設定是否自動提交 1為自動提交,0禁用,禁用後,使用commit或...