資料庫索引

2021-10-24 13:42:19 字數 2685 閱讀 1113

#索引

功能:索引,為了查詢更快,但是修改效率降低,因為要更新索引

索引作為檔案儲存到磁碟中,

磁碟單位為頁,4k為1頁.

磁碟預讀:最好將相鄰的資料都載入進記憶體以備訪問,載入的資料一般為一頁的整數倍,記憶體與磁碟以頁為單位交換資料

磁碟io為資料庫瓶頸

索引是幫助mysql高效查詢的資料結構,如某索引記錄了當前索引的資料在哪乙個檔案中,檔案中的偏移量

索引儲存在檔案系統中,索引的檔案儲存形式與儲存引擎有關

索引的資料結構

資料越大,索引也就越大,有時記憶體無法存下這麼大的索引,所以就儲存一部分,用到時再io查詢

表空間:把錶所有資料都存放在一起

代表不同的檔案格式,不同的存放方式(以下兩種都是以本地檔案系統)

不同的儲存引擎,資料檔案和索引檔案存放的位置是不同的,因此有了分類

輔助索引(非聚簇索引):資料檔案和索引檔案分開存放,myisam、myi 存放索引資料\ myd存放實際資料

mysql的innodb引擎會預設將表資料存放於表空間中,不會為單獨的表存放乙份資料檔案,如果要為單獨的表存放資料檔案,則需要設定set global innodb_file_per_table = on

儲存結構:

從包含分

表空間-段-區-頁-行

索引檔案(預設建立主鍵索引)是b+樹的資料結構,每次讀取一小塊,找到指定頁

b+樹先將資料所在的頁查詢出來,再將頁放到記憶體中查詢行

樹:左子樹必須小於根節點,右子樹必須大於根節點

索引資料:

在b+樹中,key為索引列,value為頁

索引:如果是內部列建立索引,則b+樹的葉子節點儲存列的主鍵id,得到主鍵id後再去主鍵索引樹中查詢(回表)

innodb有回表操作

結構也是b+樹

mysaim沒有回表,直接找到資料

他的b+樹葉子結點儲存的是資料位址,位址儲存著整條資料資訊.

而myisam的b+樹主鍵索引和輔助索引的葉子節點是資料檔案的位址指標

在決定為某個列建立索引時,要思考這個列建立索引時的b+樹結構會是什麼樣的

唯一索引

普通索引

全文索引

組合索引

name,age

兩種方式關鍵在於單列索引,name的長度比age大每一頁存放的資料小,代表資料頁會很多,索引樹龐大,而age長度小,代表乙個資料頁內可以維護很多age索引,索引樹會很小,io次數會變少

name與age的位置,mysql優化器在優化我們的sql時會盡量吧查詢列按照順序調換位置匹配上

給內部列建立索引時會進行回表操作.

索引下推與索引最左匹配原則是為聯合索引服務的,只有多個索引的時候才會使用索引下推,

同時聯合索引的b+樹也與單列不通,聯合索引的b+樹每個節點都有索引值存在,所以name、age等屬性可以直接匹配上

1,張三,10

2,張三,20

3,張三,10

4,張三,40

select * from table where name = '張三' and age = 10

如上會先去匹配name為張三的資料,id為1,2,3,4.然後再去id索引樹中查詢4條記錄再判斷age是否匹配10.

現在會先去先去匹配name為張三的資料,id為1,2,3,4 再匹配age的資料

mysql5.6以前,查詢到name為張三的有4條資料,然後進行4次回表操作

mysql5.7查詢到name為張三時,還會匹配age=10的資料,再進行回表

建立name,age,***的聯合索引後會生成乙個索引樹.key為name,age,***

根據sql,匹配第乙個列為張三的,都匹配上,再匹配第二個列age=10的匹配到張三,10,男 返回1,3.

索引下推是在非主鍵索引下的優化,可以有效的減少回表的次數

索引在插入新值的時候,為了維護索引的有效性,必須對索引的位置進行維護

為什麼設定成自增,自增資料新增時主鍵索引的b+樹是往葉子節點追加資料.效率較高

不設定成自增則可能會從中間插入資料,可能會導致一下情況(為了保證有序)

客戶端-聯結器-分析器-優化器-執行器-儲存引擎-資料

bin-log(mysql)

innodb日誌緩衝區

建議為每秒呼叫fsync的方式,預設為第乙個

undo-log(innodb)

獲取老資料

執行器從儲存引擎中找到資料,如果在記憶體中直接返回.如果不在記憶體中則從磁碟查詢後返回

更改資料

將資料寫入記憶體中(innodb)

記錄redo-log(innodb),通知執行器,資料處於prepare階段

寫入bin-log

提交事物,redo-log資料處於commit階段

redo-log有兩個狀態是為了保證bin-log與redo-log中的資料一致性

mysql執行計畫

explain select * from table

type至少是range級別

keyextra

jyperlogler演算法計算基數

基數計算當前唯一列的數量

建立表時,建立的唯一索引

非空唯一索引

組合索引,如name,age,pos共同組合形成的索引

最左匹配

自適應雜湊

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...