mongdodb局部索引

关于索引的创建需要明确以下几点

  1. 将过滤性大的字段放在索引的第一位
  2. 想使用排序索引,一定要将排序字段的索引放在复合索引的最后面形如
  3. 可以使用hint natural指定查询使用的索引,或者不使用索引
{"field1":1,"排序字段":1}

局部索引

局部索引是仅为信息子集维护的索引。例如,假设我们有一个推文数据库,并且正在从我们的账户中查找转发次数最多的推文

import pymongo
import random
import string
from pymongo.collation import Collation

random.seed(10)
letters = string.ascii_lowercase
upper = string.ascii_uppercase


class MongoDBServer():
    def __init__(self,database,collation) -> None:
        self.client = pymongo.MongoClient('mongodb://ellis:[email protected]:32000/')
        self.database = self.client[database]
        
        self.colleceion = self.database[collation]
        
    def insert_many(self,documents):
        self.colleceion.insert_many(documents)
        

server = MongoDBServer("partial","partial")

value=[{"username":"ellis","text":"一部好戏","retweet_count":0},
        {"username":"v","text":"一部好戏","retweet_count":1},
        ]

server.insert_many(value)

# server.colleceion.create_index([("username", 1),("retweet_count",1)], partialFilterExpression = {"retweet_count": {"$gt":0}}, background = True)

print(server.colleceion.find({"username":"ellis"}).sort([('retweet_count',1)]).explain())

我们可以看到这个查询并没有使用索引。为了使用索引我们可以在username以及retweet_count上创建索引,这虽然可以解决问题。但这将是一个非常大的索引。由于大部分的推文并没有被转发,因此我们可以只在那些被转发的推文上创建一个局部索引

server.colleceion.create_index([("username", 1),("retweet_count",1)], partialFilterExpression = {"retweet_count": {"$gt":0}}, background = True)

当我们查找从未被转发的推文的时候,该索引将无济于事。

请注意为了利用这个索引,我们需要在查询时指定一个过滤条件。以确保MongoDB知道我们需要的所有数据都在索引中。

import pymongo
import random
import string
from pymongo.collation import Collation

random.seed(10)
letters = string.ascii_lowercase
upper = string.ascii_uppercase


class MongoDBServer():
    def __init__(self,database,collation) -> None:
        self.client = pymongo.MongoClient('mongodb://ellis:[email protected]:32000/')
        self.database = self.client[database]
        
        self.colleceion = self.database[collation]
        
    def insert_many(self,documents):
        self.colleceion.insert_many(documents)
        

server = MongoDBServer("partial","partial")

# value=[{"username":"ellis","text":"一部好戏","retweet_count":0},
#        {"username":"vv","text":"一部好戏","retweet_count":1},
#        ]

# server.insert_many(value)

server.colleceion.create_index([("username", 1),("retweet_count",1)], partialFilterExpression = {"retweet_count": {"$gt":0}}, background = True)

print(server.colleceion.find({"username":"ellis","retweet_count":{"$gt":0}}).sort([('retweet_count',1)]).explain())

你可能感兴趣的:(MongoDB,python,mongodb)