MySql索引優化實踐

2021-09-25 11:13:59 字數 2752 閱讀 9226

mysql 查詢官方預設底層索引這一頁大小 

show global status like 'innodb_page_size';

variable_name value

innodb_page_size 16384(位元組0 / 1024 = 16k

如果乙個節點設定為 bigint 的話mysql 預設是8個位元組,冗餘位元組的話,mysql底層是6個位元組

那麼就是14b。遞增儲存的就是總的 1170個冗餘節點

如果我們樹總高度定為3的話,那麼我們能儲存最多的資料是多少呢?

1170117016=21,902,400‬,為2千萬。

#### 生產環境如果遇到慢查詢的話,怎麼辦?

可能是第一反應就是 加索引。

那麼為什麼加索引就提公升sql查詢效率

如果不加索引的話,我們mysql是逐行讀取的,一行一行去讀取,那麼我們cpu執行操作的時候。就是一行是一次磁碟i/o讀取。

如果cpu讀取記憶體是很快。cpu和磁碟互動很慢的/。如果一次sql查詢資料量很大的話。而且資料在最後一行。例如

select * from *** where id = 15400000. 這樣對於線上服務是一種災難。

myisam索引實現

如下圖:所示。myisam對應檔案裡面儲存的是什麼?

.frm檔案裡儲存的是建立表時候的表結構。

.myd 表裡面所有資料行

.myi index就是索引

這裡設表一共有三列,假設我們以col1為主鍵,則圖8是乙個myisam表的主索引(primary key)示意。可以看出myisam的索引檔案僅僅儲存資料記錄的位址。在myisam中,主索引和輔助索引(secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。如果我們在col2上建立乙個輔助索引,則此索引的結構如下圖所示:

innobd索引實現

如下圖:test-lock

.frm: 為建立表的結構

.idb: index 和 data

innodb索引實現

雖然innodb也使用b+tree作為索引結構,但具體實現方式卻與myisam截然不同。

第乙個重大區別是innodb的資料檔案本身就是索引檔案。從上文知道,myisam索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的位址。而在innodb中,表資料檔案本身就是按b+tree組織的乙個索引結構,這棵樹的葉結點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。

圖10是innodb主索引(同時也是資料檔案)的示意圖,可以看到葉結點包含了完整的資料記錄。這種索引叫做聚集索引。因為innodb的資料檔案本身要按主鍵聚集,所以innodb要求表必須有主鍵(myisam可以沒有),如果沒有顯式指定,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。

第二個與myisam索引的不同是innodb的輔助索引data域儲存相應記錄主鍵的值而不是位址。換句話說,innodb的所有輔助索引都引用主鍵作為data域。例如,圖11為定義在col3上的乙個輔助索引:

這裡以英文本元的ascii碼作為比較準則。聚集索引這種實現方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

了解不同儲存引擎的索引實現方式對於正確使用和優化索引都非常有幫助,例如知道了innodb的索引實現後,就很容易明白為什麼不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調的字段作為主鍵在innodb中不是個好主意,因為innodb資料檔案本身是一顆b+tree,非單調的主鍵會造成在插入新記錄時資料檔案為了維持b+tree的特性而頻繁的**調整,十分低效,而使用自增字段作為主鍵則是乙個很好的選擇。

那麼mysql 裡面為什麼少用 !=或者 <> 呢?

因為即使你有索引的話。也是會走全表掃瞄。

聯合索引的底層儲存結構長什麼樣子?

mysql索引實用優化實踐

最近在寫一些資料統計的面板,裡面有sql對錶資料的聚合統計,我的主表現在有100來萬的資料,其間看了很多資料。記錄一下sql索引的優化過程.sql 如下,只有乙個連表查詢,再加上函式聚合出結果 select count if b.severity 1,true null severityallnum...

mysql索引實踐 MySQL索引實踐

資料庫索引本質上是一種資料結構 儲存結構 演算法 目的是為了加快資料檢索速度。1 索引的型別 待完善 主鍵索引 給表設定主鍵,這個表就擁有主鍵索引。唯一索引 unique 普通索引 增加某個欄位的索引,比如使用者表根據使用者名稱查詢。組合索引 使用多個字段建立索引,遵循最左原則,比如建立索引 col...

mysql 優化 聚集索引 mysql 索引優化

一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...