插入邏輯
插入28
插入70
插入95
插入70锤灿,旋轉(zhuǎn)
- 索引列盡量小,可以使B+樹階數(shù)增加,層數(shù)減少
- 主鍵盡量單調(diào)遞增
刪除邏輯
B+樹使用填充因子(fill factor)來控制樹的刪除變化,50%是填充因子可設(shè)的最小值恨诱。B+樹的刪除操作同樣必須保證刪除后葉節(jié)點中的記錄依然排序,同插入一樣骗炉,B+樹的刪除操作同樣需要考慮下圖所示的三種情況照宝,與插入不同的是,刪除根據(jù)填充因子的變化來衡量句葵。
刪除70
刪除25
刪除60
- 盡可能不要刪除厕鹃,使用deleted字段代替
復合索引
- 可以從這個圖理解為什么復合索引使用時需要遵守最左原則
鎖
http://hedengcheng.com/?p=771
我們要知道對InnoDB來說,“行鎖”是不夠準確的乍丈,因為InnoDB分為聚簇索引和二級索引剂碴,兩種樹上都能分別加鎖。
對于一個sql語句delete from t1 where id = 10;
诗赌,我們分幾種情況分析
-
id是主鍵:在聚簇索引上的id=10這一行加X鎖
-
id是非主鍵唯一索引:如果主鍵是name汗茄,則會在二級索引上id=10的一行加X鎖,并在聚簇索引上的name=d的一行上加X鎖(假設(shè)從二級索引上查到id=10的記錄name=d)
-
id是非主鍵非唯一索引铭若,需要區(qū)分隔離級別
-
當隔離級別是RC(Read Committed)時,對二級索引上id=10的2行加X鎖递览,并在聚簇索引上的name=d,name=d的2行上加X鎖(假設(shè)從二級索引上查到id=10的記錄name=d叼屠,name=d兩行)
-
當隔離級別是RR(Repeatable Read)時,除了跟RC一樣加X鎖之外绞铃,還要加上GAP鎖(間隙鎖)镜雨,是為了防止幻讀,也就是在第一次讀和第二次讀之間儿捧,其他事務無法插入新的滿足條件的記錄荚坞。
-
-
id非索引,需要區(qū)分隔離級別
-
當隔離級別是RC(Read Committed)時,對聚簇索引的所有行加X鎖
-
當隔離級別是RR(Repeatable Read)時菲盾,對聚簇索引的所有行加X鎖颓影,并給所有間隙加GAP鎖
-
JOIN
- join查詢的原理:
select tbl1.col1,tbl2.col2 from tbl1\
inner join tbl2 on tbl1.col3 = tbl2.col3 \
where tbl1.col1 in (5,6,7)
上述sql語句大概執(zhí)行如下偽代碼:
result = []
select rows1 from tbl1 where tbl.col1 in (5,6,7)
for row in rows1:
select rows2 from tbl2 where tbl2.col3 = row.col3
for row2 in rows2:
result.append(row+row2)
可以看到在上述過程中,可以使用到tbl1里的col1索引懒鉴,tbl2里的col3索引
對于left outer join
這一過程也成立诡挂,但full join
則不行碎浇,所以mysql是不支持全外連接的
- 但是,mysql優(yōu)化器有時候會選擇更好的策略璃俗,而不是按上述順序執(zhí)行奴璃。例:
select tbl_a.id,tbl_b.id
-> from tbl_a
-> inner join ab_relation on ab_relation.aid = tbl_a.id
-> inner join tbl_b on tbl_b.id = ab_relation.bid
按上條的邏輯,會首先查出所有tbl_a城豁,然后根據(jù)tbl_a.id查找ab_relation苟穆,再根據(jù)ab_relation.bid查找tbl_b。但是在tbl_a的行數(shù)比tbl_b大的時候唱星,mysql的優(yōu)化器可能會首先查找tbl_b鞭缭,再查找ab_relation,最后查找tbl_a魏颓×肜保可以思考一下,如果上述語句中不是inner join 而是 left outer join甸饱,還能調(diào)換關(guān)聯(lián)順序嗎沦童?
- union雖然看起來跟join有點像,但是會生成一個臨時表叹话,而臨時表里是不能使用索引的偷遗,所以使用union的時候要注意盡量把where條件放到union的子句里