MySql 索引 鎖 事務知識點小結

2022-09-25 04:00:15 字數 2420 閱讀 8263

索引,類似書籍的目錄,可以根據目錄的某個頁碼立即找到對應的記錄。

索引的優點:

索引的缺點:

注意點:小表使用全表掃瞄更快,中大表才使用索引。超級大表索引基本無效。

索引從實現上說,分成 2 種:聚集索引和輔助索引(也叫二級索引或者非聚集索引)

從功能上說,分為 6 種:普通索引,唯一索引,主鍵索引,復合索引,外來鍵索引,全文索引。

詳細說說 6 種索引:

注意:主鍵就是唯一索引,但是唯一索引不一定是主鍵,唯一索引可以為空,但是空值只能有乙個,主鍵不能為空。

另外,innodb 通過主鍵聚簇資料,如果沒有定義主鍵且沒有定義聚集索引, mysql 會選擇乙個唯一的非空索引代替,如果沒有這樣的索引,會隱式定義個 6 位元組的主鍵作為聚簇索引,使用者不能檢視或訪問。

簡單點說:

mysql 程式設計客棧將資料按照頁來儲存,預設一頁為 16kb,當你在查詢時,不會只載入某一條資料,而是將這個資料所在的頁都載入到 pagecache 中,這個其實和 os 的就近訪問原理類似。

mysql 的索引使用 b+ 樹結構。在說 b+ 樹之前,先說說 b 樹,b 樹是乙個多路平衡查詢樹,相較於普通的二叉樹,不會發生極度不平衡的狀況,同時也是多路的。

b 樹的特點是:他會將資料也儲存在非頁子節點。

看圖可知:

而這個特點會導致非頁子節點不能儲存大量的索引。

而 b+ tree 就是針對這個對 b tree 做了優化。如下圖所示:

我們看到,b+ tree 將所有的 data 資料都儲存到了葉子節點中,非也子節點只儲存索引和指標。

我們假設乙個非頁子節點是 16kb,每個索引,即主鍵是 bigint,即 8b,指標為 8b。那麼每頁能儲存大約 1000 個索引(16kb/ 8b + 8b).

而一顆 3 層的 b+樹能夠儲存多少索引呢?如下圖:

大約能夠儲存 10 億個索引。通常 b+ 樹的高度在 2-4 層,由於 mysql 在執行時,根節點是常駐記憶體的,因此每次查詢只需要大約 2 -3 次 io。可以說,b+ 樹的設計,就是根據機械磁碟的特性來進行設計的。

知道了索引的設計,我們能夠知道另外一些資訊:

那麼,如果專案中使用了分庫分表,我們通常都會需要乙個主鍵進行 sharding,那怎麼辦呢?在實現上,我們可以保留自增主鍵,而邏輯主鍵用來作為唯一索引即可。

關於 mysql 的鎖,各種概念就會噴湧而出,事實上,鎖有好幾種維度,我們來解釋一下。

1. 型別維度

型別細分:

2. 鎖的粒度(粒度維度)

3. 鎖的演算法(演算法維度)

4. 預設的讀操作,上鎖嗎?

可以選擇手動上鎖:select ***x for update (排他鎖); select ***x lock in share mode(共享鎖),稱之為「一致性鎖定讀」。

使用鎖之後,就能在 rr 級別下,避免幻讀。當然,預設的 mvcc 讀,也能避免幻讀。

既然 rr 能夠防止幻讀,那麼,serializable 有啥用呢?

防止丟失更新。例如下圖:

這個時候,我們必須使用 serializable 級別進行序列讀取。

最後,行鎖的實現原理就是鎖住聚集索引,如果你查詢的時候,沒有正確地擊中索引,mysql 優化器將會拋棄行鎖,使用表鎖。

事務是資料庫永恆不變的話題, acid:原子性,一致性,隔離性,永續性。

四個特性,最重要的就是一致性。而一致性由原子性,隔離性,永續性來保證。

然後再說隔離性。

隔離級別:

每個級別都會解決不同的問題,通常是3 個問題:髒讀,不可重複讀,幻讀。一張經典的圖:

這裡有個注意點,關於幻讀,在資料庫規範裡,rr 級別會導致幻讀,但是,由於 mysql 的優化,mysql 的 rr 級別不會導致幻讀:在使用預設的 select 時,mysql 使用 mvcc 機制保證不會幻讀;你也可以使用鎖,在使用鎖時,例如 for update(x 鎖),lock in share mode(s 鎖),mysql 會使用 next-key lock 來保證不會發生幻讀。前者稱為快照讀,後者稱為當前讀。

原理剖析:

那 rr 和 serializble 有什麼區別呢?答:丟失更新。本文關於鎖的部分已經提到。

mvcc 介紹:全稱多版本併發控制。

innodb 每個聚集索引都有 4 個隱藏字段,分別是主鍵(rowid),最近更改的事務 id(mvcc 核心),undo log 的指標(隔離核心),索引刪除標記(當刪除時,不會立即刪除,而是打標記,然後非同步刪除);

本質程式設計客棧上,mvcc 就是用 undo log 鍊錶實現。

mvcc 的實現方式:事務以排它程式設計客棧鎖的方式修改原始資料,把修改前的資料存放於 undo log,通過回滾指標與資料關聯,如果修改成功,什麼都不做,如果修改失敗,則恢復 undo log 中的資料。

多說一句,通常我們認為 mvcc 是類似樂觀鎖的方式,即使用版本號,而實際上,innodb 不是這麼實現的。當然,這不影響我們使用 mysql。

MySQL知識點小結

3.mysql事務 4.日誌 5.索引 6.大表優化 大多網際網路公司都在用mysql而不是oracle,所以就想將自己掌握的一點小知識做一下記錄。理解過於淺顯,簡稱入門級八股文。mysql是一種開放源 的關係型資料庫管理系統 rdbms 使用最常用的資料庫管理語言 結構化查詢語言 sql 進行資料...

MYSQL 事務知識點

事務是乙個完整的業務邏輯單元,不可再分。例如 銀行轉賬,a b轉賬10000,需要執行兩條update語句。update t act set balance balance 10000 where actno act 001 update t act set balance balance 1000...

Mysql 索引知識點

概述 之前寫過一篇mysql b 樹學習,簡單的介紹了b 數以及mysql使用b 樹的原因,有了這些基礎知識點,對mysql索引的型別以及索引使用的一些技巧,就比較容易理解了。覆蓋索引 建立了乙個輔助索引,如果能直接從這個輔助索引檔案中獲取到資料,而無需去訪問聚集索引 自增主鍵索引 檔案的話,那麼這...