MySQL索引(純筆記乾貨)

2021-10-17 04:12:09 字數 1195 閱讀 3025

結構預設為b+樹,少部分為hash桶

有聚集索引,非聚集索引之分

加索引後查詢效率變快、但是為了維護b+樹的穩定,增刪改會變慢

主鍵索引為聚集索引,聚集索引只有乙個,索引鍵值的邏輯順序和物理順序一致

非聚集索引和聚集索引一樣,採用b+樹作為索引,每次給字段建立一條索引,欄位中的資料就會被複製出來乙份,用於生成新的索引,給表新增太多索引會增加表的體積,占用磁碟儲存空間。

非聚集索引和聚集索引的區別在於,聚集索引的b+樹葉子結點儲存的是所需要查詢的資料,而非聚集索引的b+樹的葉子結點儲存的是該資料行的主鍵值,查到主鍵值之後再次通過聚集索引的b+樹結構查詢所需要的資料,這個操作叫作回表,回表操作的磁碟io次數必然比不回表多,索引查詢效率勢必更低一些。 不管以任何方式查詢表, 最終都會利用主鍵通過聚集索引來定位到資料, 聚集索引(主鍵)是通往真實資料所在的唯一路徑。

覆蓋索引是非聚集索引之中的特例,覆蓋索引的葉子結點儲存的就是建立所索引時的關聯字段值,所以查到葉子節點的時候,所需要查詢的資料也已經出來了,不需要回表操作。 覆蓋索引是查詢的列可以直接通過索引提取,比如只查詢主鍵的列! 或者查詢聯合索引的所有列或者左邊開始的部分列(注意有順序的) 而聯合索引並不一定只從索引中能獲取到所有的資料,這個取決於你所查詢的列。

什麼時候加索引

(1)列經常被用於where條件中

(2)列中有大量的空值

(3)表幾乎沒有被修改

(4)資料量很大,只有2-4%的資料被選出來

什麼時候索引會失效

(1)對列進行計算或者是使用函式,則該列的索引會失效

(2)不匹配資料型別,會造成索引失效

(3)where語句中使用了is null或者is not null,會造成索引失效

(4)使用了反向操作,該索引將不起作用

(5)使用了link操作,索引就將不起作用

(6)在where中使用or時,有乙個列沒有索引,那麼其它列的索引將不起作用

為什麼innodb儲存引擎索引結構預設是b+樹而不是b樹?

b+樹相對於b樹更加矮胖,查詢效率穩定,由於所有值都儲存在葉子結點,並且葉子結點之間存在雙向指標,使得範圍查詢更容易

為什麼預設為b+樹而不是hash桶?

b+樹支援範圍查詢,hash索引只支援單點查詢,在很多業務邏輯中都需要使用到範圍查詢的情況

三層b+樹結構能夠載入多少資料?是否需要四層?

b+樹的階數是怎麼計算的,b+樹的層高是怎麼計算的?

mysql 優化方案,純乾貨

查詢資料庫的資料盡量使用索引來查詢,避免全表掃瞄。盡量只查詢索引條件的字段,例如,一張user使用者資料表的id欄位為索引,name為使用者為非索引字段,當查詢某條資料時,直接用id查詢比用name查詢效率會高很多。因為葉子節點儲存id的值,這樣不用回表查詢,實現了索引覆蓋。從資料庫中查詢資料,sq...

純乾貨 MYSQL 基礎 一

select from t doctor where doctor name 布隆 分組可能不是特別好理解,我單獨舉例解釋下 假如有一張 表,和任務表,小姐姐的任務是要隨訪自己負責的病人,1個 小姐姐負責多個病人,任務表中存著所有 小姐姐,執行的所有任務。現在查一下,每個 小姐姐,各自做了多少次任務...

《土豆乾貨》Mysql索引底層原理

一 mysql的儲存引擎 myisam和innodb 1 innodb 這是mysql 5.5或更高版本的預設儲存引擎。它提供了事務安全 acid相容 表,支援外來鍵引用完整性約束。它支援提交 回滾和緊急恢復功能來保護資料。它還支援行級鎖定。當在多使用者環境中使用時,它的 一致非鎖定讀取 提高了效能...