ToB企服应用市场:ToB评测及商务社交产业平台

标题: 6.如何判断数据库搜索是否走索引? [打印本页]

作者: 万有斥力    时间: 2024-7-19 06:54
标题: 6.如何判断数据库搜索是否走索引?

判断是否使用索引搜索

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

  1. db.collection.find(query,options).explain(options)
复制代码
创建索引前

查看根据name查询数据的情况:
  1. > db.user.find({"name":"张三"}).explain()
  2. {
  3.   explainVersion: '1',
  4.   queryPlanner: {
  5.     namespace: 'test.user',
  6.     indexFilterSet: false,
  7.     parsedQuery: {
  8.       name: {
  9.         '$eq': '张三'
  10.       }
  11.     },
  12.     queryHash: 'A2F868FD',
  13.     planCacheKey: 'A2F868FD',
  14.     maxIndexedOrSolutionsReached: false,
  15.     maxIndexedAndSolutionsReached: false,
  16.     maxScansToExplodeReached: false,
  17.     winningPlan: {
  18.       stage: 'COLLSCAN',
  19.       filter: {
  20.         name: {
  21.           '$eq': '张三'
  22.         }
  23.       },
  24.       direction: 'forward'
  25.     },
  26.     rejectedPlans: []
  27.   },
  28.   command: {
  29.     find: 'user',
  30.     filter: {
  31.       name: '张三'
  32.     },
  33.     '$db': 'test'
  34.   },
  35.   serverInfo: {
  36.     host: 'ADMIN',
  37.     port: 27017,
  38.     version: '7.0.6',
  39.     gitVersion: '66cdc1f28172cb33ff68263050d73d4ade73b9a4'
  40.   },
  41.   serverParameters: {
  42.     internalQueryFacetBufferSizeBytes: 104857600,
  43.     internalQueryFacetMaxOutputDocSizeBytes: 104857600,
  44.     internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
  45.     internalDocumentSourceGroupMaxMemoryBytes: 104857600,
  46.     internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
  47.     internalQueryProhibitBlockingMergeOnMongoS: 0,
  48.     internalQueryMaxAddToSetBytes: 104857600,
  49.     internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600,
  50.     internalQueryFrameworkControl: 'trySbeRestricted'
  51.   },
  52.   ok: 1
  53. }
复制代码
关键点看: "stage" : "COLLSCAN", 表示全聚集扫描


创建索引后

下面对name创建索引
  1. db.user.createIndex({name:1})
复制代码
看效果
  1. > db.user.find({"name":"张三"}).explain()
  2. {
  3.   explainVersion: '1',
  4.   queryPlanner: {
  5.     namespace: 'test.user',
  6.     indexFilterSet: false,
  7.     parsedQuery: {
  8.       name: {
  9.         '$eq': '张三'
  10.       }
  11.     },
  12.     queryHash: 'A2F868FD',
  13.     planCacheKey: 'A3E454E0',
  14.     maxIndexedOrSolutionsReached: false,
  15.     maxIndexedAndSolutionsReached: false,
  16.     maxScansToExplodeReached: false,
  17.     winningPlan: {
  18.       stage: 'FETCH',
  19.       inputStage: {
  20.         stage: 'IXSCAN',
  21.         keyPattern: {
  22.           name: 1
  23.         },
  24.         indexName: 'name_1',
  25.         isMultiKey: false,
  26.         multiKeyPaths: {
  27.           name: []
  28.         },
  29.         isUnique: false,
  30.         isSparse: false,
  31.         isPartial: false,
  32.         indexVersion: 2,
  33.         direction: 'forward',
  34.         indexBounds: {
  35.           name: [
  36.             '["张三", "张三"]'
  37.           ]
  38.         }
  39.       }
  40.     },
  41.     rejectedPlans: []
  42.   },
  43.   command: {
  44.     find: 'user',
  45.     filter: {
  46.       name: '张三'
  47.     },
  48.     '$db': 'test'
  49.   },
  50.   serverInfo: {
  51.     host: 'ADMIN',
  52.     port: 27017,
  53.     version: '7.0.6',
  54.     gitVersion: '66cdc1f28172cb33ff68263050d73d4ade73b9a4'
  55.   },
  56.   serverParameters: {
  57.     internalQueryFacetBufferSizeBytes: 104857600,
  58.     internalQueryFacetMaxOutputDocSizeBytes: 104857600,
  59.     internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
  60.     internalDocumentSourceGroupMaxMemoryBytes: 104857600,
  61.     internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
  62.     internalQueryProhibitBlockingMergeOnMongoS: 0,
  63.     internalQueryMaxAddToSetBytes: 104857600,
  64.     internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600,
  65.     internalQueryFrameworkControl: 'trySbeRestricted'
  66.   },
  67.   ok: 1
  68. }
复制代码
关键点看: "stage" : "IXSCAN" ,基于索引的扫描

compass查看:

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4