對於varchar和char,前者是可變長,後者固定,其中的數字都表明字符長度,char的長度在0~255,varchar存儲字節數在0~65535.若是某個數據表裏的數據行的長度是可變的,那麼,爲了節約存儲空間,MySQL會把這個數據表裏的固定長度類型的數據列轉換爲相應的可變長度類型.mysql
例外:長度小於4個字符的char數據列不會被轉換爲varchar類型
key_len:表示使用了索引的長度。長度由三個因素決定:算法
字段類型 | 佔用字節數 |
---|---|
char(n) | n |
varchar(n) | n+2 |
tinyint | 1 |
smallint | 2 |
int | 4 |
bigint | 8 |
date | 3 |
timestamp | 4 |
datetime | 8 |
若是字段容許空則還要加一個字節。
若是有一個索引是聯合索引 (a,b) a、b都是varchar(30)非null,編碼是UTF8 那麼若是索引都用上 長度爲30*3+2+30*3+2=184 3是utf8佔用3個字節sql
結構:分爲聚簇索引和非聚簇索引,其中,除了主鍵以外,其餘索引都是非聚簇索引。用的是B+樹。
爲何用B+樹,而不是其餘結構?先看看通常有什麼結構:
哈希表數據庫
有序列表安全
樹併發
平衡二叉樹:紅黑樹mvc
B樹(多路平衡查找樹(Balance Tree))函數
B+樹高併發
以上就是選擇B+樹的緣由。
而聚簇索引和非聚簇索引的區別在於,聚簇索引會把整行數據都保存,非聚簇索引只保存索引相關字段數據,還有主鍵的地址。所以通常狀況下,若是非聚簇索引不是覆蓋索引,須要回表查找,才能獲得須要的結果。工具
事務
事務隔離級別與鎖
一共有如下四種隔離級別
不可重複讀和幻讀的區別:前者重點在於update和delete,後者重點在於insert。
鎖的類型有不少,分類範疇也有不少,下面根據不一樣的分類簡單描述一下。
樂觀鎖和悲觀鎖
共享鎖與排它鎖
兩段鎖協議
將事務分紅兩個階段,加鎖階段和解鎖階段(因此叫兩段鎖)
行鎖、gap鎖和next-key鎖
gap鎖
在索引記錄之間的間隙中加鎖,或者是在某一條索引記錄以前或者以後加鎖,並不包括該索引記錄自己。gap lock的機制主要是解決可重複讀模式下的幻讀問題。
gap lock的前置條件:
next-key lock
即gap lock與record lock的結合,即除了鎖住記錄自己,還要再鎖住索引之間的間隙
如下幾種場景來分析在RR級別下鎖的執行
概括在一個表以下:
死鎖
產生死鎖的條件:
避免死鎖的產生的一些建議:
mvcc
當前讀與快照讀
隱式字段
InnoDB存儲引擎在數據庫每行數據的後面添加了三個字段:
undo log
在回滾段中的undo logs分爲: insert undo log 和 update undo log
insert undo log : 事務對insert新記錄時產生的undolog, 只在事務回滾時須要, 而且在事務提交後就能夠當即丟棄。
update undo log : 事務對記錄進行delete和update操做時產生的undo log, 不只在事務回滾時須要, 一致性讀也須要,因此不能隨便刪除,只有當數據庫所使用的快照中不涉及該日誌記錄,對應的回滾日誌纔會被purge線程刪除
purge
從前面的分析能夠看出,爲了實現InnoDB的MVCC機制,更新或者刪除操做都只是設置一下老記錄的deleted_bit,並不真正將過期的記錄刪除。 爲了節省磁盤空間,InnoDB有專門的purge線程來清理deleted_bit爲true的記錄。爲了避免影響MVCC的正常工做,purge線程本身也維護了一個read view(這個read view至關於系統中最老活躍事務的read view);若是某個記錄的deleted_bit爲true,而且DB_TRX_ID相對於purge線程的read view可見,那麼這條記錄必定是能夠被安全清除的。
read view(讀視圖)
可見性比較算法
設當前新開事務id爲 new_id
當前新開事務建立的快照read view 中最先的事務id爲up_limit_id, 最遲的事務id爲low_limit_id(注意這個low_limit_id=未開啓的事務id=當前最大事務id+1)
可見性算法案例分析
innodb的mvcc與理想mvcc區別
innodb算不上真正的mvcc,由於沒有實現核心的多版本共存。其緣由是理想mvcc對多行數據無能爲力。
譬如,若是事務A執行理想的MVCC, 修改Row1成功, 而修改Row2失敗, 此時須要回滾Row1, 但由於Row1沒有被鎖定, 其數據可能又被事務B所修改, 若是此時回滾Row1的內容,則會破壞事務B的修改結果,致使事務B違反ACID。 這也正是所謂的 第一類更新丟失
的狀況