結構預設為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相容 表,支援外來鍵引用完整性約束。它支援提交 回滾和緊急恢復功能來保護資料。它還支援行級鎖定。當在多使用者環境中使用時,它的 一致非鎖定讀取 提高了效能...