Mysql07 MySQL深入學習總結

2021-10-25 06:39:13 字數 2797 閱讀 2883

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...