成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL的復合索引,生效了嗎?來篇總結

數據庫 MySQL
最近頻繁出現慢SQL導致系統性能問題,于是決定針對索引進行一些優化。一些表結構本身已經有了不少索引,如果再繼續添加索引,勢必會影響到插入數據的性能。

[[442711]]

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯系程序新視界公眾號。

背景

最近頻繁出現慢SQL導致系統性能問題,于是決定針對索引進行一些優化。一些表結構本身已經有了不少索引,如果再繼續添加索引,勢必會影響到插入數據的性能。那么,是否可以使用組合索引來達到目的呢?這篇文章咱們來一探究竟。

認識復合索引

如果where條件中使用到多個字段,并且需要對多個字段建立索引,此時就可以考慮采用復合索引(組合索引)。比如查詢地址時需要輸入省、市,那么在省、市上建立索引,當數據量大時會明顯提高查詢速度。

組合索引有啥優勢呢?

  • 減少查詢開銷:建立復合索引(c1,c2,c3),實際上相當于建立了(c1),(c1,c2),(c1,c2,c3)三個索引。對于大表來說,可以極大減少開銷。
  • 覆蓋索引:MySQL可以直接通過遍歷索引取得數據,而無需回表,減少了很多的隨機io操作。
  • 效率高:索引列越多,通過索引篩選出來的數據就越少,從而提升查詢效率。

缺點:

  • 索引字段越多,創建的索引越多,每個索引都會增加磁盤空間的開銷;
  • 索引越多對查詢效率提升越高,但對需要更新索引的增刪改操作會有效率影響;

復合索引使用建議:單表最好不要超過1個復合索引,單個復合索引最好不超過3個字段。一旦超過,就需要考慮必要性和是否有其他替代方案。

最左匹配原則

復合索引遵從最左匹配原則,顧名思義,在組合索引中,最左側的字段優先匹配。因此,在創建組合索引時,where子句中使用最頻繁的字段放在組合索引的最左側。

輔助索引是B+樹實現的,雖然可以指定多個列,但是每個列的比較優先級不一樣,寫在前面的優先比較高。一旦出現遺漏,在B+樹上就無法繼續搜索了(通過補齊等措施解決的除外),因此是按照最左連續匹配來的。既然是在B+樹上搜索,對于條件的比較自然是要求精確匹配(即"="和"IN")。

在where子句中用到兩個字段c1和c2,那么創建索引時,兩個字段的順序應該是(c1,c2)還是(c2,c1)呢?

正確的做法是:把重復值最少的放前面。比如,95%的值都不重復,則可考慮放最前面。

字段順序的影響

復合索引遵從最左匹配原則,那么在where查詢條件中的字段是否也需要按照索引的順序來寫呢?

比如,復合索引為(c1,c2,c3),下面兩個查詢條件是否會對索引有影響呢?

  1. select * from t_user where c1 = 1 and c2 = 4; 
  2. select * from t_user where c2 = 4 and c1 = 1; 

看到有文章提出第一條SQL語句的效率更高,是否可信?兩種查詢方式條件一樣,結果也應該一樣,正常來說Mysql也會讓它們走同樣的索引。

通過Mysql的查詢優化器explain分析上述兩個條語句,會發現執行計劃完全相同。也就是說:SQL語句中的字段順序并不需要與復合索引字段順序一致,查詢優化器會自動調整順序。

如果說有效率影響,那么也就是查詢優化器矯正順序的影響吧,幾乎可以忽略不計。

單字段是否可以觸發索引?

對于復合索引為(c1,c2,c3),相當于(c1),(c1,c2),(c1,c2,c3)三個索引,如果查詢條件中只有c1,很顯然是會走索引的。

但如果where條件如下呢:

  1. from t_user where c2 = 4; 

上述語句是否會走索引呢?這得分幾種情況來說明。

執行explan查詢c1為條件的SQL語句:

  1. explain select * from t_user where c1 = 1; 

上述語句走的索引類型為:ref。ref類型表示Mysql會根據特定的算法快速查找到符合條件的索引,而不會對索引中每一個數據都進行掃描判斷。這種類型的索引為了快速查出數據,索引就需要滿足一定的數據結構。

執行explan查詢c2為條件的SQL語句:

  1. explain select c2 from t_user where c2 = 4; 

上述語句走的索引類型為:index。index類型表示Mysql會對整個索引進行掃描,只要是索引或索引的一部分Mysql就可能會采用index方類型的方式掃描。由于此種方式是一條數據一條數據查找,性能并不高。

在這個例子中,對查詢的字段有一定的要求,where中條件為c2,select中查詢出的字段也只能是c2,才會走index類型的索引。

如果將c2換成*或其他字段:

  1. explain select * from t_user where c2 = 4; 

上述語句會發現,不再走index索引,而是走全表掃描了。這也從側面說明了Mysql為什么要講最左匹配原則了。

所以結論是:如果單個字段為復合索引的首個字段,則會正常走索引;如果單個字段是復合索引的其他字段,且僅有該字段出現在select后面,則會走index類型索引;而其他情況,則走全表掃描。

復合索引可以替代單一索引嗎?

單一索引:(c1),復合索引:(c1,c2)。

當c1作為查詢條件時,單一索引和復合索引查詢速度幾乎一樣,甚至比復合索引還要略快。

如果僅用復合聚集索引的非起始列(c2)作為查詢條件的話,復合索引是不起任何作用的。

對于一張表來說,如果有復合索引(c1,c2),則無需再建單一索引(c1)。

如果已經存在單一索引(c1),因查詢所需,可添加復合索引(c1,c2)來提升效率。

小結

本篇文章整理了Mysql復合索引使用時所需注意的一些知識點,在使用時可以通過explain來查看一下你的SQL語句是否走了索引,走了什么索引。

但還要了解的是:Mysql的執行計劃和查詢的實際執行過程并不完全吻合。

 

別問我為什么知道,因為在實踐中遇到過。同一條SQL語句,查詢條件不同,有可能會走索引,也有可能不會走索引。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2022-12-06 07:53:33

MySQL索引B+樹

2023-01-06 10:52:30

SQL索引存儲

2020-12-09 08:59:59

MongoDB復合索事故

2023-11-16 17:12:33

數據庫oracle

2021-12-30 09:39:28

Android 12App開發者

2023-01-08 13:12:57

論文

2011-08-05 14:57:55

2019-05-17 08:19:42

SD-WAN運維軟件定義廣域網

2024-04-16 09:53:56

PostgreSQL數據庫優化索引

2015-11-20 11:31:26

mysql數據庫索引

2021-03-18 08:53:44

MySQL數據庫索引

2011-08-05 14:02:17

MySQL數據庫異常處理

2022-03-03 09:05:17

索引MySQL數據查詢

2024-04-18 10:48:24

MongoDB

2011-07-11 13:11:54

MySQL索引數據結構

2010-05-13 17:23:14

MySQL搜索索引

2021-07-29 10:08:15

NumPy索引切片

2011-07-05 10:22:44

Qt Sqlite

2011-07-27 18:55:02

Oracle數據庫DBLINK操作

2010-10-12 13:37:54

mysql索引
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久欧美久久一区 | 色综合久久伊人 | 国产女人与拘做视频免费 | www.夜夜骑 | 特a毛片 | 久久久久久999 | 日日操夜夜操天天操 | 久久青| 人人擦人人| 69av网 | 91免费版在线 | 免费的日批视频 | 国产亚洲一区二区三区 | 91国在线| 国产一区二区在线播放视频 | 国产99久久精品一区二区300 | 久久久久久国产精品 | av网站免费在线观看 | 国产一区二区三区 | 欧美爱爱视频网站 | 91久久久精品国产一区二区蜜臀 | 99精品网 | 久久综合久久久 | 一级aaaaaa毛片免费同男同女 | 日韩欧美在线观看 | 丝袜美腿一区二区三区动态图 | 色婷婷av一区二区三区软件 | 日韩欧美一区二区三区四区 | 国产在线一区二区 | 亚洲一区二区视频在线播放 | 日韩久久综合网 | 天天干天天操 | 中国美女一级黄色片 | www网站在线观看 | 午夜一区二区三区在线观看 | 国产精品国产a | 欧美日韩在线国产 | 性天堂网| 亚洲二区视频 | 天天综合久久 | 亚洲高清在线 |