Mongodb(4)索引,查看执行计划,聚合操作aggregate,表关联查询,批量插入测试数据,执行计划分析详解
- 创建索引,支持:单键索引、复合索引,唯一索引
创建索引后台执行
db.books.createIndex({open: 1, close: 1}, {background: true})
对内嵌文档字段创建索引:
db.books.createIndex({"author.name":1})
创建唯一索引
db.books.createIndex({title:1},{unique:true})
在包含嵌套对象的数组字段上创建多键索引
db.books.createIndex( { "stock.size": 1, "stock.quantity": 1 } )
Hash索引(Hashed Indexes)
db.users.createIndex({username : 'hashed'})
地理空间索引(Geospatial Index)
创建通配符索引
查看执行计划
db.books.find({type:"novel",favCount:{$gt:50}}).explain()
查看索引
查看索引信息
db.books.getIndexes()
查看索引键
db.books.getIndexKeys()
删除索引
删除集合指定索引
db.col.dropIndex("索引名称")
删除集合所有索引 不能删除主键索引
db.col.dropIndexes()
18.聚合操作aggregate,聚合框架相当于 SQL 查询中的GROUP BY、 LEFT OUTER JOIN 、 AS等
常用的管道聚合阶段
阶段运算符 描述 SQL等价运算符
$match 筛选条件 WHERE
$project 投影 AS
$lookup 左外连接 LEFT OUTER JOIN
$sort 排序 ORDER BY
$group 分组 GROUP BY
$skip/$limit 分页
$unwind 展开数组
$graphLookup 图搜索
$facet/$bucket 分面搜索
18.1 $project:字段别名,0 不显示的字段,1显示的字段
db.getCollection("books").aggregate([{$project:{name2: "$title"}}])
db.getCollection("books").aggregate([{$project:{name3: "$title",_id:0,type:1,author.name:1}}])
18.2 $match 筛选
db.books.aggregate([
{$match:{type:"technology"}},
{$project:{name:"$title",_id:0,type:1,author:{name:1}}}
])
18.3 $count 计数并返回与查询匹配的结果数
db.books.aggregate([
{$match:{type:"technology"}},
{$count: "type_count"} 4 ])
18.4 $group对文档进行分组
db.books.aggregate([
{$group:{_id:null,count:{$sum:1},pop:{$sum:"$favCount"},avg:{$avg:"$favCount"}}}
])
db.books.aggregate([
{$group:{_id:"$author.name",pop:{$sum:"$favCount"}}}
])
db.zips.aggregate( [
{ $group: { _id: "$state", totalPop: { $sum: "$pop" } } },
{ $match: { totalPop: { $gt: 1010001000 } } }] )
18.5 $lookup 多表关联查询,相当于左外链接
2表关联查询:
db.getCollection("books").aggregate(
[{
$lookup: {
from: "customer",
localField: "title",
foreignField: "name",
as: "booksName"
} }
])
3表关联查询:
db.order.aggregate([
{$lookup: {
from: "customer",
localField: "customerCode",
foreignField: "customerCode",
as: "curstomer"
}
},
{$lookup: {
from: "orderItem",
localField: "orderId",
foreignField: "orderId",
as: "orderItem"
}
}
])
mongoimport -h 192.168.65.174 -d test -u fox -p fox --authenticationDatabase=admin -c zips --file D:\zips.json
- 批量插入测试数据
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<50;i++){
var typeIdx = Math.floor(Math.random()types.length);
var tagIdx = Math.floor(Math.random()tags.length);
var tagIdx2 = Math.floor(Math.random()tags.length);
var favCount = Math.floor(Math.random()100);
var username = "xx00"+Math.floor(Math.random()10);
var age = 20 + Math.floor(Math.random()15);
var book = {
title: "book-"+i,
type: types[typeIdx],
tag: [tags[tagIdx],tags[tagIdx2]],
favCount: favCount,
author: {name:username,age:age}
};
books.push(book)
}
db.books.insertMany(books);
db.getCollection("books").find({Asin:{$in:[
"B07SC9RTQ8",
"B07SC9RTQ9"
]}}).sort({"Asin":1})
db.getCollection("book").find()
db.getCollection("book").getIndexes()
db.getCollection("book").createIndex({"sku":1})
db.getCollection("book").createIndex({"categoryId":-1})
db.createCollection("book");
db.getCollection("book").insertOne({
uniqueId: "705f6c3aec584c47936b40502fbcafab",
siteCode: "US",
entityName: "Wall Washer Light",
categoryId: "228013,495224,495236,553784,14193181",
categoryName: "Tools & Home Improvement,Lighting & Ceiling Fans,Outdoor Lighting,Landscape Lighting,Spotlights",
status: NumberInt("1"),
addTime: ISODate("2024-10-18T17:32:18.254Z"),
updateTime: ISODate("2024-10-18T17:32:18.254Z"),
});
20.MongoDB执行计划分析详解
db.books.find({_id:"671609d23146000034003cf1"}).explain("queryPlanner")
db.books.find({_id:"671609d23146000034003cf1"}).explain()
queryPlanner 执行计划的详细信息,包括查询计划、集合信息、查询条件、最佳执行计划、查询方式和MongoDB 服务信息等
exectionStats 最佳执行计划的执行情况和被拒绝的计划等信息
allPlansExecution 选择并执行最佳执行计划,并返回最佳执行计划和其他执行计划的执行情况
winningPlan.stage状态分析
是stage的类型。类型列举如下:
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引检索指定文档
SHARD_MERGE 将各个分片返回数据进行合并
SORT 在内存中进行了排序
LIMIT 使用limit限制返回数
执行计划的返回结果中尽量不要出现以下stage:
SKIP 使用skip进行跳过
IDHACK 对_id进行查询
SHARDING_FILTER 通过mongos对分片数据进行查询
COUNTSCAN count不使用Index进行count时的stage返回
COUNT_SCAN count使用了Index进行count时的stage返回
SUBPLA 未使用到索引的$or查询的stage返回
TEXT 使用全文索引进行查询时候的stage返回
PROJECTION 限定返回字段时候stage的返回
执行计划的返回结果中尽量不要出现以下stage:
COLLSCAN(全表扫描)
SORT(使用sort但是无index)
不合理的SKIP
SUBPLA(未用到index的$or)
COUNTSCAN(不使用index进行count)