84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
現在遇到一個效能問題,解決方法就是在欄位加索引,現在糾結的是欄位組合索引還是單一索引查詢效率問題?
場景 現在查詢欄位是parentId,key ,兩個欄位同時查詢。
現在見索引的方案是 1 分別給 parentId,key加上索引
2 建立一個組合索引 {parentId:1,key:1}這樣的方式:
這兩個查詢效能是不是差不多啊?
求證
索引效率來說肯定是聯合索引效率高,很多時候如果用多個欄位查詢應該考慮用聯合索引。 但是事情也沒有完全的絕對,也要考慮到索引的開銷。 以你的條件為例,假設key能夠唯一確定一筆記錄,parentId是不是就沒有必要加上了呢? key能够唯一确定一条记录,parentId是不是就没有必要加上了呢?退一步,即使key不能唯一确定一条,如果它能够把结果集确定在一定的小范围内,比如5条记录,10条记录,那parentId退一步,即使key不能唯一確定一條,如果它能夠把結果集確定在一定的小範圍內,比如5條記錄,10條記錄,那parentId這個條件無非就是在這10筆記錄內再掃一遍尋找合適的記錄,比起把它加進索引中造成的寫入和存儲、內存開銷,我可能會選擇根本不把它放進聯合索引裡。 一個條件能過濾掉的記錄越多,我們說它的「選擇性」(selectivity)越好。一般情況下,我們在建立索引的時候都要把選擇性越好的條件放前面,選擇性差的放後。差到一定程度就別放進來了。 這其實是一個時間和空間的平衡。放進索引裡的條件省時間(含CPU時間,查詢時間)費空間(包含儲存空間,記憶體空間);不放進索引裡的條件費時間,省空間。大部分時候我們是期望得到前者的,什麼時候選擇後者就看你自己對實際狀況的評估了。
key
parentId
索引效率來說肯定是聯合索引效率高,很多時候如果用多個欄位查詢應該考慮用聯合索引。
但是事情也沒有完全的絕對,也要考慮到索引的開銷。
以你的條件為例,假設
key
能夠唯一確定一筆記錄,parentId
是不是就沒有必要加上了呢?key
能够唯一确定一条记录,parentId
是不是就没有必要加上了呢?退一步,即使
key
不能唯一确定一条,如果它能够把结果集确定在一定的小范围内,比如5条记录,10条记录,那parentId
退一步,即使key
不能唯一確定一條,如果它能夠把結果集確定在一定的小範圍內,比如5條記錄,10條記錄,那parentId
這個條件無非就是在這10筆記錄內再掃一遍尋找合適的記錄,比起把它加進索引中造成的寫入和存儲、內存開銷,我可能會選擇根本不把它放進聯合索引裡。一個條件能過濾掉的記錄越多,我們說它的「選擇性」(selectivity)越好。一般情況下,我們在建立索引的時候都要把選擇性越好的條件放前面,選擇性差的放後。差到一定程度就別放進來了。
這其實是一個時間和空間的平衡。放進索引裡的條件省時間(含CPU時間,查詢時間)費空間(包含儲存空間,記憶體空間);不放進索引裡的條件費時間,省空間。大部分時候我們是期望得到前者的,什麼時候選擇後者就看你自己對實際狀況的評估了。