2. mysql使用b+樹作為索引的資料結構優勢
3. 稠密索引與稀疏索引
4. nyisam與innodb
5. 鎖
6. 事務隔離
1.1 b樹性質
m階b樹滿足下列條件:
1.定義任意非葉子結點最多只有m個兒子;且m>2;
2.根結點的兒子數為[2, m];
3.除根結點以外的非葉子結點的兒子數為[m/2, m];
4.每個結點存放至少m/2(取上整)-1和至多m-1個關鍵字;(至少2個關鍵字,根節點至少乙個關鍵字);
5.非葉子結點的關鍵字個數=指向兒子的指標個數-1;
6.非葉子結點的關鍵字:k[1], k[2], …, k[m-1],m1.2 b+樹性質
b+樹的性質(與b樹不相同的部分)
1.非葉子節點的子樹指標與關鍵字個數相同;
2.非葉子節點的子樹指標p[i],指向關鍵字值屬於[k[i],k[i+1]]的子樹.(b樹是開區間,也就是說b樹不允許關鍵字重複,b+樹允許重複);
3.為所有葉子節點增加乙個鏈指標;
4.所有關鍵字都在葉子節點出現(稠密索引). (且鍊錶中的關鍵字恰好是有序的);
5.非葉子節點相當於是葉子節點的索引(稀疏索引),葉子節點相當於是儲存(關鍵字)資料的資料層;
6.更適合於檔案系統;
1.非葉子節點只存索引並且可以儲存更多的關鍵字,這樣b+樹相對b樹更矮,io讀寫次數更少;
2.關鍵字查詢都要從跟節點到葉子節點,查詢效率更加穩定;
3.為所有葉子節點增加乙個鏈指標,支援範圍查詢,定位到葉子節點後,不用再從根節點出發,直接可以從葉子節點,橫向跨越子樹進行統計,對於資料庫的掃瞄,只用掃瞄葉子即可,非葉子節點不用管。
3.1 稠密索引
葉子節點儲存的不僅僅是鍵值,還儲存了位於同一行的其他列的資訊。稠密索引決定了表的物理排列順序,乙個表只能有乙個稠密索引。
3.2 稀疏索引
葉子節點僅儲存了鍵位資訊以及該行資料的位址,有的稀疏索引只儲存了鍵位資訊以及主鍵。
4.1 myisam
myisam預設用的是表級鎖,不支援行級鎖,不管是主鍵索引、唯一鍵索引、還是普通索引,其索引均屬於稀疏索引,稀疏索引的葉子節點均指向行資料的實體地址,即表資料和索引是分開儲存的。
適合場景
1)頻繁執行count全表的語句,innodb每次執行需要全表掃瞄,而myisam儲存了乙個變數記錄了表的行數;
2)對資料增刪改的頻率不高,查詢非常頻繁;
3)不支援事務的場景。
4.2 innodb
innodb預設是行級鎖,也支援表級鎖,有且僅有乙個稠密索引(一般為主鍵),非主鍵索即為稀疏索引的葉子節點儲存的是相關鍵位和對於的主鍵值(並不儲存行資料的實體地址),故非主鍵索引的查詢包含了兩次查詢,一次是非主鍵索引查詢到主鍵值,然後通過主鍵值查詢對應的行資料,innodb的主鍵索引和對於的資料是儲存在同乙個檔案中的,所以在載入索引的時候,也會將資料載入到記憶體中。
innodb在sql沒有用的索引的時候使用的是表級鎖,在用的索引時是行級鎖,行級鎖事先的開銷遠大於表級鎖,所以使用行級鎖效能會有所損失。
適合場景
1)對資料增刪改的頻率不高;
2)要求可靠性比較高,支援事務。
資料庫檔案,.frm是儲存表的資料結構的檔案,innodb中.ibd是存索引和表資料的檔案,myisam中.myi是存索引的檔案,.myd是存表資料的檔案。
5.1 悲觀鎖
先取鎖,再對資料進行操作的保守策略沒,會產生額外的開銷,增加產生死鎖的概率,資料庫的事務就是悲觀鎖方式。
5.2 樂觀鎖
樂觀的認為不會造成資料衝突,在資料提交的時候才會檢查資料是否衝突,樂觀鎖一般不用資料提供的鎖機制,而是使用版本號或是時間戳,減少死鎖的問題。
事務隔離機制,isolation的級別為read uncommitted(可讀取未提交後的值),就有可能出現,兩個事務分別對同一條資料的某個值(500)進行操作,事務一在執行+200操作後,因為某種原因回滾了, 事務二在事務一+200操作後且回滾之前讀取了值為700,然後進行-300,此時就出現了所謂的髒讀。isolation的級別改為read committed(讀取提交後的值,oracle預設級別)。
不可重複讀,事務二對資料的某個值進行+200操作,在+200操作之前事務一讀取到的值為500,事務二+200操作後並提交結果,事務一在事務二提交前再去讀,結果變為700,會導致同一事務,讀取同一值結果不同的情況,將事務隔離級別再調大一級,也就是mysql預設隔離級別(repeatable read)可避免。
幻讀,事務一對表中資料進行了當前讀(共享讀鎖lock in share mode),此時事務二對表進行新增或刪除操作,事務一然後對當前讀得資料進行批量修改操作,會發現多了一行或少了一行資料更新,出現幻讀,將事務隔離級別設定為最高的隔離級別(serializable–所有的sql執行都會加上鎖)即可。
但在mysql中的innodb的隔離級別repeatable read
MySql學習總結
mysql 5.1參考手冊 使用筆記 除標準sql語言外 1 啟動指令碼位置 選項檔案位置 如果使用rpm包安裝指令碼位置在 etc init.d mysqld 選項位置 etc my.cnf 2 啟動服務方法 啟動服務 service mysqld start 開機自動啟動 chkconfig m...
mysql學習總結
mysql常用命令 建立表a,複製表b的資料結構,不複製資料 create table a like b 複製表b的資料內容到表a中 前提是表a與表b資料結構一致 insert into a select from b 檢視表a的建立語句 show create table a 檢視表a的資料結構 ...
mySql 學習總結
今天基本完成了專案的模組的基本功能,剩下的就是對專案的吃透,對各種工具類的掌握,其中sql語句的書寫就顯得很重要了,特別是新的任務就是 寫乙個統計板塊,sql語句基本從網上各大扒,基本已經成型,上沒有完成的是對sql語句執行完之後得到的資料的封裝並且 給前端 現總結今天的sql函式 select s...