mysql07-mysql深入學習總結
索引的本質及索引的資料結構
b樹結構詳細
myslam儲存引擎索引
inodb儲存引擎索引
mysql索引優化與底層資料結構深入
mysql主從架構原理
mvcc底層原理
一、索引的本質及索引的資料結構
1.索引是幫助mysql高效獲取資料的排好序的資料結構
2.索引資料結構
1)為什麼不是二叉樹:當資料單邊增長時,會退化成煉表
2)為什麼不是紅黑樹:紅黑樹是二叉平衡樹,存大資料量時,樹的高度很高
二、b樹結構詳細解析
1.mysql中的b+樹是多叉平衡樹,這樣就控制了樹的高度
2.b樹就是b-樹,b樹非葉子節點儲存資料,所有索引元素不重複,節點中的資料索引從左到右遞增排序
3.b+樹非葉子節點不儲存data,只儲存索引(冗餘)且從左到右遞增排序,葉子結點包含所有索引字段,葉子節點用指標連線,提高區間訪問效能
4.b+樹中查詢元素,先將根節點載入到記憶體中做隨機查詢,當沒有查詢元素時,繼續根據索引元素之間的指標定位下個節點,直到查詢到葉子結點返回data
5.為什麼不在第一層節點就載入完資料? => 當大資料量時,根節點被載入後會占用大量記憶體,現在的b+樹是分批分範圍的查詢
6.儲存計算:
mysql預設乙個節點大小是16k,show global status like 'innodb_page_size';
假設主鍵使用 bigint 佔8byte,指標佔6byte,單個非葉子節點儲存索引元素和指標的個數 = 16k/(8+6)b ≈ 1170 個,葉子節點單個元素為1k時,葉子節點可以放16個元素,當樹的高度為3時,即葉子節點儲存了 1170×1170×16 ≈ 2000+w 個索引元素
另外,通常索引的根節點常駐記憶體中,索引高度為3的b+樹索引,查詢乙個元素需要兩次io訪問就可以定位到元素
7.hash索引方法,只需要一次hash運算就能定位到資料元素,與b+樹相比,hash索引方法缺少了排序功能,當使用where t.age > 10進行範圍查詢時,hash方法明顯劣勢,所以一般推薦只使用b+樹索引,只有在用不到範圍查詢的表上可以建hash索引,而對於排好序的b+樹的葉子節點可以順藤摸瓜的很好支援範圍查詢
三、myslam儲存引擎索引
1.myisam表索引檔案和資料檔案是分離的(非聚集),葉子結點儲存的data元素內容是對應行記錄的磁碟檔案位址
四、inodb儲存引擎索引
1.innodb索引實現(聚集)
1)表資料檔案本身就是按b+樹組織的乙個索引結構檔案
2)聚集索引-葉節點包含完整的資料記錄
3)為什麼innodb表必須有主鍵,並且推薦使用整型的自增主鍵?(主鍵用來組織資料形成聚集索引b+樹;整型便於查詢中頻繁的比較大小且占用空間小;自增主鍵,新增的元素永遠插到索引樹末尾,否則,b+樹的葉子節點會產生**,且還需要重新平衡)
4)為什麼非主鍵索引結構葉子結點儲存的是主鍵值?(一致性和節省儲存空間)
2.innodb表的儲存檔案:.frm檔案和.ibd檔案,即 表結構檔案 和 索引資料檔案
五、mysql索引優化與底層資料結構深入
1.**復合索引資料結構+最左字首原理
六、mysql主從架構原理
1.mysql主從架構原理圖
檢視binlog語句 > # show binary logs;
檢視當前正在寫的binlog檔案 > # show master status;
檢視日誌檔案 > # show binlog events in '[上一條命令查出的log_name]';
從機io thread用於同步主機binlog日誌到從機的中繼日誌relay binlog中,從機 sql thread 用於讀取中繼日誌並完成對從機資料的寫入
主從同步的問題:一致性和延遲
一致性問題解決辦法,強制在插入資料的某短時間內讀主庫的資料;
當主庫、從庫之間產生網路問題,同步異常,使用mysql的第三方外掛程式實現半同步,即主庫的資料強制寫到從庫的中繼日誌才算完成插入 => 半同步【資料同步到從庫中才返回,叫全同步】,犧牲了寫資料的效能
當有多個從庫時,只對乙個從節點進行半同步,否則從機越多,半同步效率越低
七、mvcc底層原理(可重複讀實現原理)
實際是基於大量的undo日誌完成,原理分析:
1.mysql資料庫給每張表新增兩個字段:trx_id, roll_pointer,事務id欄位和回滾指標字段
mysql查詢深入 Mysql查詢 深入學習
1 開篇 在學習的過程中我們一起進步,成長。有什麼寫的不對的還望可以指出。2 查詢 1 多表之間的查詢 笛卡爾積 100 100 10000 查詢的資料量可能非常大 給表名取別名 2 關聯查詢 隱示內連線查詢。sql92 內連線查詢。sql99 left join on 如果我寫 left join...
深入學習mysql 一
相信很多人都說過一句玩笑話,刪庫跑路哈哈哈 說到刪庫跑路,那麼你是否了解過,如何給mysql設定許可權來防止這樣的事情發生呢 如果你使用的是root許可權的賬號,你需要給不同的賬號來分配許可權時,可以使用如下的sql語句來建立對應的賬號和許可權 grant select on practice.to...
Mysql查詢 深入學習
1 開篇 在學習的過程中我們一起進步,成長。有什麼寫的不對的還望可以指出。2 查詢 1 多表之間的查詢 笛卡爾積 100 100 10000 查詢的資料量可能非常大 給表名取別名 2 關聯查詢 隱示內連線查詢。sql92 內連線查詢。sql99 left join on 如果我寫 left join...