对不起,如果这个问题很愚蠢。我是整个数据库索引的新手,想知道我是否发出了以下命令
> db.posts.ensureIndex({location:"2d"})
即使发布了新条目,数据库是否也会始终被索引?还是我需要在每个新条目后输入此命令?
索引对包含 2000 多个条目的数据库也有很大影响吗?
对不起,如果这个问题很愚蠢。我是整个数据库索引的新手,想知道我是否发出了以下命令
> db.posts.ensureIndex({location:"2d"})
即使发布了新条目,数据库是否也会始终被索引?还是我需要在每个新条目后输入此命令?
索引对包含 2000 多个条目的数据库也有很大影响吗?
一旦索引到位,它将始终用于任何后续读取和写入。您不需要继续执行该命令。
请记住,ensureIndex
在现有的大型数据集上发布将导致它立即索引那里的所有内容,并且可能会阻塞。
这里有一个关于索引建议的完整官方常见问题解答:http
://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ
您应该创建与您正在执行的查询类型相匹配的索引。此外,它非常易于使用explain
并查看查询需要多长时间。当您看到您一遍又一遍地执行特定类型的查询时,您可以正确索引它以提高性能。
MongoDB 包含一个解释命令,用于确定查询的处理方式,特别是它们是否使用索引。explain 可以从驱动程序中使用,也可以从 shell 中使用:
db.comments.find({ tags : 'mongodb'}).sort({ created_at : -1 }).explain();
这将返回许多有用的信息,包括扫描的项目数、查询处理所需的时间(以毫秒为单位)、查询优化器尝试使用的索引以及最终使用的索引。
还是我需要在每个新条目后输入此命令?
不会。更新数据库中的条目时会更新索引。
索引对包含 2000 多个条目的数据库也有很大影响吗?
不容易说。这取决于您正在运行的查询以及 MongoDB 在内存中的数据量。
如果您的查询最终加载了 2000 个条目中的大部分,那么索引可能不会做太多事情。如果您的查询只加载一个条目,那么索引可能很有用。
MongoDB 中的索引与其他关系数据库服务器(SQLServer、MySQL 等)中的索引非常相似,并且具有相同的优缺点:
如果您的应用程序读取量很大,您将看到在适当的索引到位的情况下数据库响应时间的显着改善。关注jdi 在他的帖子中发布的 10Gen Indexing 链接——这是一个很好的起点。