6.如何判断数据库搜索是否走索引?

img

判断是否使用索引搜索

索引在数据库中是一个不可或缺的存在,想让你的查询结果快准狠,还是需要索引的来帮忙,那么在mongo中如何判断搜索是不是走索引呢?通常使用执行计划(解释计划、Explain Plan)来查看查询的情况,如查询耗费的时间、是否基于索引查询等。

索引语法

db.collection.find(query,options).explain(options)

创建索引前

查看根据name查询数据的情况:

> db.user.find({"name":"张三"}).explain()
{
  explainVersion: '1',
  queryPlanner: {
    namespace: 'test.user',
    indexFilterSet: false,
    parsedQuery: {
      name: {
        '$eq': '张三'
      }
    },
    queryHash: 'A2F868FD',
    planCacheKey: 'A2F868FD',
    maxIndexedOrSolutionsReached: false,
    maxIndexedAndSolutionsReached: false,
    maxScansToExplodeReached: false,
    winningPlan: {
      stage: 'COLLSCAN',
      filter: {
        name: {
          '$eq': '张三'
        }
      },
      direction: 'forward'
    },
    rejectedPlans: []
  },
  command: {
    find: 'user',
    filter: {
      name: '张三'
    },
    '$db': 'test'
  },
  serverInfo: {
    host: 'ADMIN',
    port: 27017,
    version: '7.0.6',
    gitVersion: '66cdc1f28172cb33ff68263050d73d4ade73b9a4'
  },
  serverParameters: {
    internalQueryFacetBufferSizeBytes: 104857600,
    internalQueryFacetMaxOutputDocSizeBytes: 104857600,
    internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
    internalDocumentSourceGroupMaxMemoryBytes: 104857600,
    internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
    internalQueryProhibitBlockingMergeOnMongoS: 0,
    internalQueryMaxAddToSetBytes: 104857600,
    internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600,
    internalQueryFrameworkControl: 'trySbeRestricted'
  },
  ok: 1
}

关键点看: "stage" : "COLLSCAN", 表示全集合扫描

image-20240314233813092

image-20240314233637504

创建索引后

下面对name建立索引

db.user.createIndex({name:1})

看效果

> db.user.find({"name":"张三"}).explain()
{
  explainVersion: '1',
  queryPlanner: {
    namespace: 'test.user',
    indexFilterSet: false,
    parsedQuery: {
      name: {
        '$eq': '张三'
      }
    },
    queryHash: 'A2F868FD',
    planCacheKey: 'A3E454E0',
    maxIndexedOrSolutionsReached: false,
    maxIndexedAndSolutionsReached: false,
    maxScansToExplodeReached: false,
    winningPlan: {
      stage: 'FETCH',
      inputStage: {
        stage: 'IXSCAN',
        keyPattern: {
          name: 1
        },
        indexName: 'name_1',
        isMultiKey: false,
        multiKeyPaths: {
          name: []
        },
        isUnique: false,
        isSparse: false,
        isPartial: false,
        indexVersion: 2,
        direction: 'forward',
        indexBounds: {
          name: [
            '["张三", "张三"]'
          ]
        }
      }
    },
    rejectedPlans: []
  },
  command: {
    find: 'user',
    filter: {
      name: '张三'
    },
    '$db': 'test'
  },
  serverInfo: {
    host: 'ADMIN',
    port: 27017,
    version: '7.0.6',
    gitVersion: '66cdc1f28172cb33ff68263050d73d4ade73b9a4'
  },
  serverParameters: {
    internalQueryFacetBufferSizeBytes: 104857600,
    internalQueryFacetMaxOutputDocSizeBytes: 104857600,
    internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
    internalDocumentSourceGroupMaxMemoryBytes: 104857600,
    internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
    internalQueryProhibitBlockingMergeOnMongoS: 0,
    internalQueryMaxAddToSetBytes: 104857600,
    internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600,
    internalQueryFrameworkControl: 'trySbeRestricted'
  },
  ok: 1
}

关键点看: "stage" : "IXSCAN" ,基于索引的扫描

image-20240314234018601

compass查看:
image-20240314234112535

建立的索引是否有效,效果如何,都需要通过执行计划查看,以此来判断你的SQL是否需要优化,是否需要创建索引,耗时多久等等,用处可不少呢。

相关推荐

  1. 【笔记】MySQL now()/sysdate()是否索引

    2024-03-20 16:24:01       67 阅读
  2. ES6---判断对象是否为{}

    2024-03-20 16:24:01       50 阅读
  3. Oracle中sql怎么判断联合索引是否生效

    2024-03-20 16:24:01       48 阅读
  4. 如何判断服务器是否被入侵了

    2024-03-20 16:24:01       58 阅读
  5. 企业如何判断定岗定编是否合理?

    2024-03-20 16:24:01       51 阅读
  6. JVM 如何判断对象是否可回收

    2024-03-20 16:24:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-20 16:24:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-20 16:24:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-20 16:24:01       82 阅读
  4. Python语言-面向对象

    2024-03-20 16:24:01       91 阅读

热门阅读

  1. 快速幂求逆元-C语言

    2024-03-20 16:24:01       41 阅读
  2. pushd cd

    pushd cd

    2024-03-20 16:24:01      34 阅读
  3. 从原理总结chatGPT的Prompt的方法

    2024-03-20 16:24:01       39 阅读
  4. C语言实现数据结构中的通讯录问题

    2024-03-20 16:24:01       30 阅读
  5. 【python】一些常用命令汇总(持续更新……)

    2024-03-20 16:24:01       42 阅读
  6. 第十四届蓝桥杯模拟赛(第三期)Excel表

    2024-03-20 16:24:01       37 阅读