Mongodb(4)索引,查看执行计划,聚合操作aggregate,表关联查询,批量插入测试数据,执行计划分析详解

  1. 创建索引,支持:单键索引、复合索引,唯一索引

创建索引后台执行

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

  1. 批量插入测试数据
    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)

posted @ 2024-10-21 18:11  大树2  阅读(24)  评论(0编辑  收藏  举报