美文网首页
普通field和nested的field分别做range查询的性

普通field和nested的field分别做range查询的性

作者: 华安火车迷 | 来源:发表于2018-09-04 21:29 被阅读0次

    今天对一个5千万的一个索引的一个普通字段update_time和一个nested的字段sales_info.from 字段做一个range查询,对比一下延迟情况

    查询大概100W 量级的结果时

    从接过来看,当搜索大概100W的结果时,两者差别不大,都能在20ms的量级时间内完成,而nested 查询会稍微多一点点


    查询大概1000W 量级的结果时


    这是我连续执行多次的结果,从这个结果可以开始看出差距了


    查询大概5000W 量级的结果时



    从结果来看,结果集越大,差距就越明显,这里一方面可以看出,结果集非常多时,其实range的查询效率并不是十分理想,所以尽量避免这种会有1000W以上的结果集的range;另一方面,为什么nested在大结果集的时候性能差那么远呢?其实只要profile一下:



    尽管两个查询是用的next doc count 都差不太多,但是由于上面是直接使用了IndexOrDocValuesQuery,所以最后算出来就是parent的docIdSets 而下面的查询用的是ESToParentBlockJoinQuery,虽然查出了两千多W结果,然而最后还需要对这两千多万的结果做一次parentJOIN,拿到ParentId的结果集,这个运算在超过一千万的级别以上时耗时就很客观了。


    通过上面这样一个简单的测试,还是建议以后在index规划时,尽量避免采用nested方式,并且在对nested字段做大结果集查询时就要小心为妙了!

    相关文章

      网友评论

          本文标题:普通field和nested的field分别做range查询的性

          本文链接:https://www.haomeiwen.com/subject/gfinwftx.html