聯合索引優化多條件查詢

2021-08-17 20:06:21 字數 1879 閱讀 1277

聯合索引是由多個字段組成的組合索引。若經常需要使用多個欄位的多條件查詢(where col1 = … and col2 = … and col3 = …),可以考慮使用聯合索引。

現在資料表myindex中i_testid是主鍵列,其他列無任何索引:

多條件查詢名字為xiaoming,城市為beijing,年齡為21的人:

返回了一行資料,從執行計畫中看到,查詢沒有使用任何索引,進行了全表掃瞄,磁碟io大。

為vc_name建立索引:

進行同樣的查詢並檢視執行計畫:

返回了相同的結果,分析執行計畫:sql通過剛剛建立的index_of_name索引,不再進行全表掃瞄,而是先在索引中查詢滿足節點值為xiaoming的節點(有5個),再指向資料庫中相應的行,返回乙個初步結果集後再由另外兩個條件進行一步步篩選得到最終結果。大大減少了磁碟io,查詢效率也高於前者。

雖然在 vc_name 上建立了索引,查詢時mysql不用掃瞄整張表,效率有所提高,但離我們的要求還有一定的距離。同樣的,在 vc_city 和 i_age 分別建立的mysql單列索引的效率相似。為了進一步榨取 mysql 的效率,就要考慮建立組合索引。

為多條件涉及的列建立聯合索引:

值得注意的是,建立索引的時候應該根據需要規定索引長度,例如乙個人的名字長度應該不會超過10個字元,通過vc_name(10)規定索引長度後一定長度可以減少索引所佔記憶體。

現在表中的結構:

進行相同的查詢並檢視執行計畫:

返回相同的結果,從執行計畫可以看到:本次查詢使用了聯合索引name_city_age,在遍歷索引時就確定了只有乙個節點滿足條件,直接指向資料庫表進行查詢(rows:1)。有更少的磁碟io,所用時間更少!

使用聯合索引應該注意:

mysql使用聯合索引只能使用左側的部分,例如index(a,b,c),當條件為a或a,b或a,b,c時都可以使用索引,但是當條件為b,c時將不會使用索引。這好比一本先根據姓,再根據名進行排序的**簿,當查詢的時候有姓的條件,效率會比沒有任何條件高;如果在姓的基礎上還有名的條件,效率會更高;但若只有名的條件,**簿將不起作用。

離散度更高的索引應該放在聯合索引的前面,因為離散度高索引的可選擇性高。考慮一種極端的情況,資料表中有100條記錄,若index(a,b)中a只有兩種情況,而b有100種情況。這樣對於查詢唯一記錄a = …,b = …時,先遍歷全部索引看滿足a條件的有50個索引節點,接下來還要再乙個個遍歷這50個索引節點。如果是index(b,a),先遍歷全部索引發現滿足b條件的索引節點只有乙個,再遍歷這個節點發現也滿足a條件。雖然最後都能找到那個唯一的索引節點,但是第二種索引順序對引擎遍歷索引效率有很大的提高(用**薄的思想去思考問題)。

檢視列的離散程度:

customer_id列的離散程度更高,建聯合索引時應該index(customer_id,staff_id);

聯合索引優化多條件查詢

聯合索引是由多個字段組成的組合索引。若經常需要使用多個欄位的多條件查詢 where col1 and col2 and col3 可以考慮使用聯合索引。現在資料表myindex中i testid是主鍵列,其他列無任何索引 多條件查詢名字為xiaoming,城市為beijing,年齡為21的人 返回了...

多條件查詢

思路 1.獲取引數值 2.生成查詢條件 3.獲取查詢結果 4.繫結查詢選項 呼叫geturlhtml方法生成查詢url 例如 var y2013 pnvshihufu qbeijing sxuhuiqu 得到url變數值 protected string geturlval string name ...

多條件查詢

多條件查詢時在做專案的時候不可缺少的功能,雖然很簡單,但是自己還是記一下,對自己有用 查詢事件 private void button查詢 click object sender,eventargs e initial catalog uid pwd this.dataserver,this.dat...