84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
现在遇到一个性能问题,解决办法就是给字段加索引,现在纠结的是字段组合索引还是单个索引查询效率问题?
场景 现在查询字段是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时间,查询时间)费空间(包括存储空间,内存空间);不放进索引里的条件费时间,省空间。大部分时候我们是期望得到前者的,什么时候选择后者就看你自己对实际情况的评估了。