理解mysql 索引的原理及優化技巧

2021-08-04 04:07:40 字數 1314 閱讀 4291

innodb的索引: 

●   innodb採用索引組織資料的形式,它是在儲存引擎層面實現的,與後端的伺服器層沒有關聯。不同的儲存引擎有不同的實現演算法。 

● 索引的原理 

索引採用b tree(平衡樹)樹的形式儲存,所以是有順序的。 

索引的資料儲存在表空間(tablespace)裡面, 

聚集索引(主鍵索引)上面儲存了整個行的資料,而輔助索引上面僅存了指向主鍵的指標,因此輔助索引查詢效率要低於主鍵索引1倍。 

在插入和刪除的時候效能比較低,需要維護平衡樹。 

●  索引的分類: 

1.   聚集索引(主鍵索引), 乙個表只允許乙個主鍵索引,以b+樹結構儲存, 索引上面已經儲存了資料。查詢的時間複雜度為樹的高度 

2.   輔助索引, 儲存了主鍵的指向,查詢時需要先找到輔助索引,然後根據輔助索引的值找到主鍵索引,然後再獲取資料 

3.   聯合索引, 最左原則 

因為右邊的索引在建索引的時候沒有順序,所以會全表掃瞄。 

mysql目前還做不到鬆散索引掃瞄 

4.   倒排索引, 將text分詞得出很多小片段的片語,對這些片語進行索引 

5.   自適應hash索引。 

6.   覆蓋索引 

select 中的字段在索引裡面,不需要到再一次到聚集索引中去獲取值 

用explain查詢,可以看到extra標註:using index 

● 優化點 

1.  索引是字串,但是查詢時沒有帶單引號 ' ' 

2. 一條sql只能走乙個索引, 如果走多個索引建議用聯合索引 

3.  優化過程中優先考慮使用到聚集索引和覆蓋索引,這能很大程度上提高效率 

4.  建議少用in,尤其是巢狀子查詢,因為那樣的話外部表會做全表掃瞄,可以用表關聯 

exists 和 in 能夠很好的去除,不需要distinct、group,避免了臨時表的建立,效率有時會比較高 

是不是一定要禁止使用子查詢(如exists、in), 這要看場景,因為用inner join 容易 出現重覆記錄,剔重需要用distcint,會影響到效率。 

什麼情況下會產生臨時表? 

5. min\max巧用主鍵索引 

6. 巧用子查詢更新表記錄 

update t  inner join (select id, count(1) count from t2 group by id) t3 set t.max_value = t3.count 

索引型別越小越好,對於大資料處理來說,這個可不是小事,從字串替換為數字型別,可以極大地節省記憶體、磁碟儲存以及網路頻寬,減少io的代價,而且很多資料結構和演算法使用數字型別比字串要更快

MySQL優化(三) 索引原理及索引優化

b tree索引,它是目前關係型資料庫中查詢資料最為常用和有效的索引,大多數儲存引擎都支援這種索引。使用b tree這個術語,是因為mysql在create table或其它語句中使用了這個關鍵字,但實際上不同的儲存引擎可能使用不同的資料結構,比如innodb就是使用的b tree。中的b是指bal...

MySQL索引原理及查詢優化

其實在工作中有去優化mysql語句,但之前優化僅僅是降到能夠接受花費時間之下,並有很多可以繼續提供的空間。很多時候在優化完成之後sql,也並不能向外展示。故這裡將自己平時優化的sql方法記錄下來,並找到乙個總結優化sql的地方。索引原理 mysql的建立索引其實就像是字典的目錄有一定的相似之處,通過...

索引優化及原理

oracle 之sql優化 索引的基本原理 一 1 索引的基本概念 1 建立索引的目的 以索引小的io換取表的大io。何時建立索引 當訪問的資料塊少於表中20 的資料時,建議使用索引。2 索引的 會使insert delete速度變慢 索引個數多的話速度就會慢 對於update語句,需要先判斷是否要...