關係數據庫管理系統(Relational Database Management System:RDBMS)
一、索引的理解
1.索引是爲了加速對錶中數據行的檢索而創建的一種分散存儲的數據結構
在RDBMS系統中,數據的索引是硬盤級別的(佔用空間大)
2.索引結構
2.1 Hash--->哈希結構
通過key查找數組下標,定位數據位置--->時間複雜度O(1)
特點:等值匹配快,範圍查詢慢。
2.2 B+tree--->樹結構
通過二分遞歸查找,自增ID導致鏈式結構
--->通過平衡二叉樹優化查找,二叉樹高度太高,單次數據量太少,IO交互量太大
--->通過多路平衡樹(B樹)優化查找,關鍵字=子節點-1,數據區在關鍵字中
--->加強版多路平衡樹(B+樹)優化查找,關鍵字左閉合,所有數據區在底層葉子節點,IO、排序、掃表能力增強,查詢穩定,層數固定
》》》
3.數據庫引擎
3.1myisam:db.frm、db.myd、db.myi
myi:存數索引,每個索引對應一個地址
myd:存數數據,每條數據對應一個地址
索引直接是平級的
3.2.innodb:db.frm、db.ibd(主鍵主導型)
主鍵索引:聚集索引,每個葉子節點包含數據區,即記錄所有數據
輔助索引:葉子節點指向主鍵索引
4.使用原則
4.1列的離散型--->離散越高,效果越好
4.2最左匹配原則
4.3三星索引
①where後條件匹配的索引關鍵字列越多,掃描的數據將越少
②避免再次排序--->order by 最好滿足索引標準
③儘可能運用到覆蓋索引進行數據的掃描,減少回表IO操作
5.使用問題
6.1聯合索引避免使用範圍查找
6.2聯合索引會匹配單列索引,因此不需要重複建單列索引
6.3範圍大的時候in比or更高效--->in採用二分查找思路
6.4覆蓋索引,即通過一次查表,無需回表就可返回數據,常用於返回id主鍵,聯合索引拆分查詢,即不需要拿到主鍵索引重新查詢。
6.5儘量減少回表操作--->消耗資源,延長查詢時間
二、事務的理解-Innodb
1.innodb支持事務--->ACID(原子性、一致性、隔離性、持久性)
2.事務解決的三大問題:髒讀(update uncommit)、不可重複讀(update、delete)、幻讀(insert--->innod臨鍵鎖)
隔離級別:讀未提交、 讀已提交(髒讀)、可重複讀(髒讀、不可重複讀)、串行化(不存在併發,基本不用)
3.鎖的理解:
3.1 innodb 表鎖+行鎖----> myisam 表鎖
共享鎖(讀鎖)-行鎖 |
加鎖:select....lock in share mode 解鎖:commit/rollback |
排他鎖(寫鎖)-行鎖 |
自動:delete/update/insert 手動:select ...for update |
意向共享鎖-表鎖 | 提高加表鎖的效率--->快速判斷表內是否有鎖 |
意向排他鎖-表鎖 | 提高加表鎖的效率--->快速判斷表內是否有鎖 |
紀錄鎖 | 鎖住一條記錄 |
間隙鎖 | 鎖住一個區間 |
臨鍵鎖 | 左開右閉=間隙鎖+記錄鎖 |
3.2 innodb行鎖的依據是索引
①無指定索引,使用隱藏索引,直接表鎖
②輔助索引找到主鍵索引,直接行鎖
③主鍵索引,直接行鎖