返回介绍

复合索引

发布于 2024-12-09 12:55:35 字数 2811 浏览 0 评论 0 收藏 0

复合索引简单理解就是:两条以上的索引。

不用索引的情况:

  • 数据不超万条时,不需要使用索引。性能的提升并不明显,而且大大增加了内存和硬盘的消耗;
  • 查询数据超过表数据量 30%时,不要使用索引字段查询。实际证明会比不使用索引更慢,因为它大量检索了索引表和我们原表;
  • 数字索引,要比字符串索引快的多,在百万级甚至千万级数据量面前,使用数字索引是个明确的选择;
  • 把我们经常查询的数据做成一个内嵌数据(对象型的数据),然后集体进行索引

现在把 randNum0 这个字段也设置成索引。

> db.randomInfo.ensureIndex({randNum0:1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 3,
	"ok" : 1
}

一共有三个索引,两个自建索引 username 和 randNum0

> db.randomInfo.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "user.randomInfo"
	},
	{
		"v" : 2,
		"key" : {
			"username" : 1
		},
		"name" : "username_1",
		"ns" : "user.randomInfo"
	},
	{
		"v" : 2,
		"key" : {
			"randNum0" : 1
		},
		"name" : "randNum0_1",
		"ns" : "user.randomInfo"
	}
]
/**
 * 200 万数据复合索引检索
 */
var startTime = new Date().getTime(); // 得到程序开始运行的时间
var db = connect('user'); // 链接数据库
var res = db.randomInfo.find({username: 'n7wl5kq', randNum0: 754417}); // 根据用户名和 randNum0 查找用户
res.forEach(item => printjson(item)); // 循环输出
var runTime = new Date().getTime() - startTime; // 得到程序运行时间
print('This run time is: ' + runTime + 'ms');  //打印出运行时间
> load('./customSearch.js')
connecting to: mongodb://127.0.0.1:27017/user
MongoDB server version: 3.6.3
{
        "_id" : ObjectId("5cbb16755328a836aca866fb"),
        "username" : "n7wl5kq",
        "regeditTime" : ISODate("2019-04-20T12:54:01.742Z"),
        "randNum0" : 754417,
        "randNum1" : 405438,
        "randNum2" : 513075,
        "randNum3" : 888891,
        "randNum4" : 586031,
        "randNum5" : 704484,
        "randNum6" : 906708,
        "randNum7" : 303593,
        "randNum8" : 164085,
        "randNum9" : 589671
}
This run time is: 20ms
true

查询时间还是在 20ms 左右。MongoDB 的复合查询是按照我们的索引顺序进行查询的。就是我们用 db.randomInfo.getIndexes() 查询出的数组。

hint 方法指定索引查询

我们都知道数字索引要比字符串索引快,这就需要一个方法来打破索引表的查询顺序,优先使用我们自己指定的索引查询,这个方法就是 hint() .

var res = db.randomInfo.find({username: 'n7wl5kq', randNum0: 754417}).hint({randNum0:1});

由于数据量和复杂程度还是不大,所以我们看不出来明显的性能提升,但是,当我们在工作中遇到大数据时,一定会得到很好的效果。

删除索引

当索引性能不佳或起不到作用时,我们需要删除索引,删除索引的命令是 dropIndex()

db.randomInfo.dropIndex('randNum0_1'); //索引的唯一 ID

需要注意的是:删除索引时填写的值,并不是我们的字段名称(key,即 randNum0),而是我们索引查询表中的 name 值。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文