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語句,需要先判斷是否要...