成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL索引,快速記憶法

數據庫 MySQL
3. B+Tree的每個葉子節點增加了一個指向相鄰葉子節點的指針,它的最后一個數據會指向下一個葉子節點的第一個數據,形成了一個有序鏈表的結構。

哈嘍,大家好,我是了不起。面試的時候,面試官總喜歡問一些關于MySQL索引的問題,但是如果單純的記憶,還是有難度的;今天了不起把MySQL索引的知識點進行匯總,方便大家快速記憶MySQL索引的相關知識點。趕快收藏此文章吧!

索引結構:B+樹

索引其實是一種數據結構

注意B+樹是MySQL,索引默認的結構;一張表至少有一個索引(主鍵索引),是可以有多個索引的

MySQL中的B+Tree

  1. 非葉子節點也叫內部節點,只存儲 健值(主鍵的值) + 指針(存儲子節點的地址信息)

主鍵索引:健值(主鍵的值) + 指針(存儲子節點的地址信息)

非主鍵索引:非主鍵列的值 + 指向下一個節點的指針(存儲子節點的地址信息)

  1. 所有的數據都存在葉子節點中;
  • 同時葉子節點上還存有一個指向相鄰葉子節點的指針

  • 如果是聚簇索引(主鍵索引),葉子節點存儲的是實際數據

  • 如果是非聚簇索引,則保存的是聚簇索引的索引key,也就是主鍵索引的值;查詢非聚簇索引會有一個回表操作

  1. B+Tree的每個葉子節點增加了一個指向相鄰葉子節點的指針,它的最后一個數據會指向下一個葉子節點的第一個數據,形成了一個有序鏈表的結構。

為什么B+ 樹比B 樹更適合作為索引?

  1. B+ 樹的磁盤讀寫代價更低 B+ 樹的數據都集中在葉子節點,分支節點 只負責指針(索引);B 樹的分支節點既有指針也有數據 。這將導致B+ 樹的層高會小于B 樹的層高,也就是說B+ 樹平均的Io次數會小于B 樹。
  2. B+ 樹的查詢效率更加穩定 B+ 樹的數據都存放在葉子節點,故任何關鍵字的查找必須走一條從根節點到葉子節點的路徑。所有關鍵字的查詢路徑相同,每個數據查詢效率相當。
  3. B+樹更便于遍歷 由于B+樹的數據都存儲在葉子結點中,分支結點均為索引,遍歷只需要掃描一遍葉子節點即可;B樹因為其分支結點同樣存儲著數據,要找到具體的數據,需要進行一次中序遍歷按序來搜索。
  4. B+樹更擅長范圍查詢 B+樹葉子節點存放數據,數據是按順序放置的雙向鏈表。B樹范圍查詢只能中序遍歷。
  5. B+ 樹占用內存空間小 B+ 樹索引節點沒有數據,比較小。在內存有限的情況下,相比于B樹索引可以加載更多B+ 樹索引。

MyISAM與InnoDB 的區別

  1. InnoDB支持事務,MyISAM不支持
  2. InnoDB支持外鍵,而MyISAM不支持
  3. InnoDB是聚集索引,數據和索引存到同一個文件里;MyISAM是非聚集索引,數據和索引不在同一個文件里;都是使用B+Tree作為索引結構
  4. InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快(注意不能加有任何WHERE條件)

因為InnoDB的事務特性,在同一時刻表中的行數對于不同的事務而言是不一樣的,因此count統計會計算對于當前事務而言可以統計到的行數,而不是將總行數儲存起來方便快速查詢。InnoDB會嘗試遍歷一個盡可能小的索引除非優化器提示使用別的索引。如果二級索引不存在,InnoDB還會嘗試去遍歷其他聚簇索引。

如果索引并沒有完全處于InnoDB維護的緩沖區(Buffer Pool)中,count操作會比較費時。可以建立一個記錄總行數的表并讓你的程序在INSERT/DELETE時更新對應的數據。和上面提到的問題一樣,如果此時存在多個事務的話這種方案也不太好用。如果得到大致的行數值已經足夠滿足需求可以嘗試SHOW TABLE STATUS

那么為什么InnoDB沒有了這個變量呢?

  1. InnoDB支持表、行(默認)級鎖,而MyISAM僅支持表級鎖
  2. InnoDB表必須有唯一索引(如主鍵)(用戶沒有指定的話會自己找/生產一個隱藏列Row_id來充當默認主鍵),而Myisam可以沒有主鍵
  3. Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI
  • Innodb:frm是表定義文件,ibd是數據文件

  • Myisam:frm是表定義文件,myd是數據文件,myi是索引文件

索引失效的場景

  1. 對索引列使用了函數、表達式或運算符:當查詢條件中使用了函數、表達式或運算符時,MySQL就無法使用該列的索引,因為它需要對每行數據進行計算,而不是直接查找索引。
  2. 查詢條件中使用了不等于操作符(<>、!=)、NOT NULL, NOT IN 等
  3. 模糊查詢:當查詢條件中使用了LIKE、%或_等模糊匹配符號時,MySQL無法使用索引進行快速定位。
  4. OR條件:當查詢條件中包含多個OR條件時,MySQL無法使用索引進行快速定位。
  5. 范圍查詢:當查詢條件中使用了BETWEEN、<、>、<=、>=等操作符時,MySQL只能使用索引中的一部分數據,需要讀取更多的數據進行過濾,降低了查詢效率。
  6. 數據類型不匹配,需要隱式轉換類型
  7. 對索引列進行排序,因為它需要將數據按照指定的順序進行排序
  8. 復合索引,如果不使用前列,后續列也將無法使用

小結

正確的使用索引,能夠顯著提高數據庫的查詢效率。本文匯總了MySQL索引的常用知識點,幫助大家快速記憶,快快收藏吧。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2024-07-08 08:25:00

2017-01-10 17:59:37

快速權重神經元存儲

2014-06-30 15:40:41

GCDN

2020-10-14 13:58:14

23種設計模式速記

2015-10-30 15:55:43

MySQL

2020-09-28 15:34:38

ElasticSear索引MySQL

2011-03-31 13:51:54

MySQL索引

2023-09-26 12:32:21

數據分析領導數據

2017-09-04 16:03:46

MySQLMySQL索引索引

2022-03-25 10:38:40

索引MySQL數據庫

2010-10-08 13:53:14

2010-10-12 13:37:54

mysql索引

2024-12-11 08:09:54

2010-10-12 14:09:34

MySQL索引

2010-10-12 14:16:56

MySQL索引

2010-10-12 14:40:03

mysql索引

2022-07-25 15:03:13

PandasPython

2010-10-12 13:42:11

MySQL單列索引

2024-10-28 15:40:26

2020-04-24 21:41:45

MySQL數據庫插入數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲天堂av网 | 超碰在线观看97 | 欧美三级久久久 | 日韩图区| 99久久精品免费看国产高清 | 国产精品夜色一区二区三区 | 精品久久香蕉国产线看观看亚洲 | 国产精品毛片一区二区在线看 | 国产激情一区二区三区 | 九九九视频在线 | 日本一二三区高清 | av中文字幕网 | 久久久精品久久久 | 成年无码av片在线 | 亚洲国产精品成人无久久精品 | 亚洲综合色丁香婷婷六月图片 | 欧美精品区 | 亚洲精品久久嫩草网站秘色 | 久久视频一区 | 欧洲av在线| 日韩欧美在线一区 | 少妇性l交大片免费一 | 日韩中文字幕在线视频 | 午夜天堂精品久久久久 | 日韩欧美福利视频 | 成人在线观看免费观看 | 国产精品久久久久久婷婷天堂 | 欧美精品乱码99久久影院 | 999久久久 | 夜夜爽99久久国产综合精品女不卡 | 色婷婷综合久久久中文字幕 | 国产成人精品av | 成人教育av| 欧美一级久久 | 天天成人综合网 | 精品免费视频 | 一二区视频 | www.黄色在线观看 | a黄视频 | 99在线免费观看 | 欧美中文字幕在线观看 |