我有一个很小的数据库,有200万条电话记录。
当我执行:
db.getCollection('calls').find({
'IsIncoming':true, 'DateCreated' : { '$gte':ISODate('2010-12-02T02:26:22.478Z') }, 'CallerIdNum':"2545874578"
}).limit(100).count({})这是晚餐快,它需要95 is。注意,IsIncoming**,** DateCreted 和 CallerIdNum 都有索引。每次我使用这些字段进行搜索时,都是超快的。
当我搜索包含部分文字的东西的时候,它是非常缓慢的。例如,这个查询现在需要25秒:
db.getCollection('calls').find({
'IsIncoming':true, 'DateCreated' : { '$gte': ISODate('2010-12-02T02:26:22.478Z') }, 'CallerIdNum' : /2545874/
}).limit(100).count({})我知道原因是因为我在CallerIdNum中搜索。如果我在哪里预先知道完整的来电者身份,就像在我的第一个查询中一样,那么它就会很快。
问题
我希望最后一个查询执行得更快。我知道这可能是不可能的,获得良好性能的唯一方法就是通过整个CallerIdNum进行搜索。但是也许/希望我错了,有人可以帮我找到更快地执行最后一个查询的方法。
发布于 2020-12-02 03:12:43
这里的问题是,您正在搜索调用者ID号/2545874/的子字符串。这是不可行的,而且一般不能使用索引。假设您真的想要以该前缀开头的数字,那么使用这个可使用的版本:
db.getCollection('calls').find({
'IsIncoming':true, 'DateCreated' : { '$gte': ISODate('2010-12-02T02:26:22.478Z') }, 'CallerIdNum' : /^2545874/
}).limit(100).count({})您还可能希望在所有三个字段上添加一个复合索引,尽管至少我上面提供的查询版本可以使用涉及CallerIdNum字段的索引。
https://stackoverflow.com/questions/65101650
复制相似问题