mysql 索引及其優化

2021-10-12 06:35:17 字數 2238 閱讀 5297

2、索引的常見模型:雜湊表,有序陣列,搜尋樹。

2.1 雜湊表適用於等值查詢,因為不是有序的所以新增乙個數時會比較快,查詢乙個範圍時就必須全部掃瞄一遍

2.2 有序陣列和雜湊表不同,查詢乙個具體的值/範圍比較方便 二分法可快速查詢,插入乙個數值時就比較慢,需要移動資料,適用於靜態儲存引擎

2.3 搜尋樹 有二叉搜尋樹和多叉搜尋樹,由於其特點查詢和更新的時間複雜度都是o(log(n)), 對於資料量大的節點可採用n叉樹,子節點大小由左向右依次遞增,n叉樹的n取決於資料塊的大小

3、innodb中表是根據主鍵順序以索引方式存放,稱為索引組織表,

3.1 innodb中使用了b+樹的索引模型,所以每個索引都對應一棵b+樹,

3.2 根據樹的葉子節點的內容分為主鍵索引(聚簇索引)和非主鍵索引(二級索引)。主鍵索引中儲存的是對應的資料行 非主鍵索引中儲存的是主鍵的id值

3.3 主鍵查詢和非主鍵查詢的區別是 只需要查主鍵這棵b+樹就可以。非主鍵查詢需要查到主鍵對應的id再用id從主鍵的索引樹中查對應的行,此過程稱為回表

4、索引的維護:

4.1 一般會採用自增主鍵 特殊情況會採用業務字段作為主鍵,如 表中就乙個欄位時

4.2 不用自增主鍵會出現的問題:業務欄位較長其他索引儲存主鍵 總體所佔的空間會比較大。 插入資料時 可能會出現頁** 影響資料頁的利用

4.35、覆蓋索引:使用覆蓋索引可以減少樹的搜尋次數,優化查詢語句,是乙個常用的效能優化,即索引中包含想要返回的字段

– 遇到以下情況執行計畫不會選擇覆蓋查詢

1、select選擇的字段中含有不在索引中的字段,即索引沒有覆蓋全部 的列

2、where條件中不能含有對索引進行like的操作

6、索引的設計:遵循最左字首原則,建立聯合索引時要根據左字首原則考慮如何安排,索引內字段的順序,如果可以少維護乙個字段那麼要優先考慮

7、索引下推:mysql5.6之前找到聯合索引中的第乙個時就會回表查。 5.6之後會根據索引下推對索引包含的字段先做判斷,過濾不滿足條件的行。減少回表的次數

8、索引可能因為刪除或者頁**等原因 導致很多頁空洞, 重建索引的過程中會建立乙個新的索引,把資料按順序插入,這樣頁面利用率就變得更高

重建索引:alter table t drop index k; alter table t add index(k);

重建主鍵的方式 alter table t engine=innodb

9、innodb索引和myisam索引區別:

9.1: 實現上都採用b+樹做為索引結構,

9.2. innodb的資料檔案本身就是索引檔案;myisam索引檔案和資料檔案是分離的,其索引檔案只儲存資料記錄的位址,innodb資料檔案本身就是索引檔案,這棵樹的葉子節點的data域儲存的是完整的資料記錄,索引的key是表的主鍵

9.3. innodb的非聚集索引儲存的data域存的是主鍵的值 而不是位址

10、explain extra**現using filesort:

– mysql官方給到的解釋:

if the extra column of explain output contains using filesort, the index is not used and a filesort is performed(如果explain輸出的extra列包含正在使用檔案排序,則不使用索引,而是執行檔案排序)

– 並不是說extra包含using filesort就會影響效能,對於有的order by沒有命中filesort的慢查詢,可以適當減小max_length_for_sort_data來使其命中filesort從而縮減慢查詢時間;不過一般情況下還是建議優化掉using filesort因為沒有命中引擎層的索引導致了外部排序

順便了解下innodb和myisam引擎的區別:

1、事務支援,myisam強調效能,每次查詢具有原子性速度更快,但是不提供事務支援;innodb提供事務支援具有事務、回滾和崩潰修復的能力

2、表鎖差異:my是只支援表級鎖,crud是會自動加上表鎖;in可支援行鎖,不過當where條件為主鍵時才會支援

3、表主鍵:my允許沒有任何索引和主鍵的存在;in必須有主鍵,如果沒有指定會自動生成乙個

4、表的行數:my可以直接從變數中取;in取行數需要掃表

5、crud操作:select 多可用my; update和insert多可選用in

6、外來鍵支援:my不支援;in支援

7、可移植性備份及恢復:my中資料是以檔案儲存,跨平台資料轉移比較方便;in可以拷貝資料檔案,備份binlog,不過資料量比較大時就很不方便

mysql索引及其優化

10.效能優化 1.建立索引 create unique fulltext spatial index 索引名 on 表名 欄位名 using 索引方法 2.刪除索引 drop index 索引名 3.檢視索引 show index on tablename 1.查詢語句寫的爛 2.索引失效 單值索...

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 ...