MySQL索引優化

2021-07-27 23:25:56 字數 3359 閱讀 2973

1.索引在儲存引擎層實現

b+樹只有葉子節點儲存資料,每個葉子節點都包含乙個緊挨著葉子節點的指標,這樣方便葉子遍歷,

b+樹是平衡查詢樹,葉子節點順序存放

myisam儲存引擎使用資料物理位置來引用行,innodb通過主鍵來引用行

什麼情況使用b樹索引?

1.全值匹配的查詢

order_sn= 『1234567』

2.匹配最左字首的查詢

3.匹配列字首 (某一列開頭部分 order_sn like 『123%』 )

4.匹配範圍值得查詢

order_sn > 『1234』

精確匹配左前列並範圍匹配另外一列

5.只訪問索引的查詢

使用b樹索引的限制?

不是按照索引最左列 (先訂單號 再訂單日期) 而我們使用 訂單號的話則不行.

使用索引不能跳過索引中的列

not in 和<>操作無法使用索引

如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引

hash索引 memory

找到對應的行 再進行讀取 (讀取行指標,在通過行指標讀取資料)

key hash碼 value 行指標

hash索引的限制?

索引必須進行二次查詢

索引無法排序

索引不支援部分索引查詢和範圍查詢

索引中hash碼的計算可能存在hash衝突

索引的好處?

索引減少了儲存引擎需要掃瞄的資料量

索引提供排序,避免使用臨時表

索引把隨機io變成順序io

索引加快查詢速度

索引增加寫操作成本(inndb插入快取,多次變一次)

太多的索引會增加查詢優化器的選擇時間,選擇是用什麼索引

索引優化策略

out_date 索引列

1.索引上不能使用表示式或函式

select ... from product where to_days(out_date)-to_days(current_date)<=30 to_days()是函式
可以改為

select ... from product where out_date<=date_add(curernt_date,interval 30 days)
索引鍵值大小限制 innodb767位元組 myisam1000位元組 字串不足 但支援字串字首

create index index_name on

table(cik_name(n));//表示索引字首個數

索引的選擇性是不重複的索引值和表的記錄數的比值 唯一性越高選擇性越高則查詢效率越高

表中有abcd abde bcdef bcaef

如果索引為前2位,有重複值 如果前3位剛剛好,如果前4位則多了

索引保證不重複且盡量小!!

聯合索引

如何選擇索引列的順序

1.經常會被使用到的列優先 放到最左邊 (狀態列除外 選擇性很差)

2.選擇性高的列優先 (過濾更多資料 如果選擇性高)

3.寬度小的列優先(在以上2個的前提下)

覆蓋索引

(鍵值覆蓋所有查詢資料) 葉子節點存行

可以優化快取,減少磁碟io操作

減少隨機io 變為順序

避免innodb主鍵索引二次查詢

避免myisam表進行系統呼叫

不能使用覆蓋索引的情況

儲存引擎不支援覆蓋索引(葉子節點要有鍵值)

查詢使用太多列 則不行 select * ,,不行

雙%好 like查詢 提取行值 記憶體中過濾

使用mysql sakila

language_id為索引 innodb儲存引擎

對於myisam來說,b+樹的葉子節點指標是指向行位址的,如果key存在,取出data的值是位址,在讀取響應的資料記錄。myisam的索引方式是「非聚集」的。輔助索引可以重複

innodb資料本身是乙個索引檔案,myisam和資料檔案是相分離的。innodb的葉子節點data域儲存了完整的資料資訊。索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。包含完整資料記錄,這種索引叫做聚集索引。data域存的是指而非位址。他的輔助索引儲存在data域中,儲存的是主鍵值。

聚集索引這種實現方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

看完這些再看上面這些命令是不是很爽啊 啊啊啊啊啊!!!上面優化可能不清楚,,,再來一次!

《1,2,3》

1.對於全索引where後的條件都是索引,那麼無論順序如何mysql優化器會自動優化順序,完成查詢

《1,2,3》《1,3,2》

2.查詢單個1,然而沒有1這個索引,那麼只用到第一列這個字首

3.查詢1,3條件,和情況2相同,由於2沒提供,無法實現左鏈結上。

4.可以用in彌補 2 in(所有可能情況), 這樣 1 , 2 in (), 3是用上了全索引

5.查詢列3,那麼不是最左字首,用不到索引

6.只支援乙個範圍列,用到所用

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

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

mysql索引優化原則 MySQL 索引優化原則

索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...

mysql索引優化原則 MySQL索引優化

mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...