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不能唯一确定一条,如果它能够把结果集确定在一定的小范围内,比如5条记录,10条记录,那parentId这个条件无非就是在这10条记录内再扫一遍寻找合适的记录,比起把它加进索引中造成的写入和存储、内存开销,我可能会选择根本不把它放进联合索引里。一个条件能过滤掉的记录越多,我们说它的“选择性”(selectivity)越好。一般情况下,我们在建立索引的时候都要把选择性越好的条件放前面,选择性差的放后面。差到一定程度就别放进来了。这其实是一个时间和空间的平衡。放进索引里的条件省时间(包括CPU时间,查询时间)费空间(包括存储空间,内存空间);不放进索引里的条件费时间,省空间。大部分时候我们是期望得到前者的,什么时候选择后者就看你自己对实际情况的评估了。
key
parentId
索引效率来说肯定是联合索引效率高,很多时候如果用多个字段查询应该考虑用联合索引。
但是事情也没有完全的绝对,也要考虑到索引的开销。
以你的条件为例,假设
key
能够唯一确定一条记录,parentId
是不是就没有必要加上了呢?退一步,即使
key
不能唯一确定一条,如果它能够把结果集确定在一定的小范围内,比如5条记录,10条记录,那parentId
这个条件无非就是在这10条记录内再扫一遍寻找合适的记录,比起把它加进索引中造成的写入和存储、内存开销,我可能会选择根本不把它放进联合索引里。一个条件能过滤掉的记录越多,我们说它的“选择性”(selectivity)越好。一般情况下,我们在建立索引的时候都要把选择性越好的条件放前面,选择性差的放后面。差到一定程度就别放进来了。
这其实是一个时间和空间的平衡。放进索引里的条件省时间(包括CPU时间,查询时间)费空间(包括存储空间,内存空间);不放进索引里的条件费时间,省空间。大部分时候我们是期望得到前者的,什么时候选择后者就看你自己对实际情况的评估了。