Using '@arangodb/aql/explainer' module, you can verify which index is used while executing a query.
Syntax
var explain = require("@arangodb/aql/explainer").explain;
explain("query to execute");
Let’s see it with an example.
Step 1: Let’s create an employees collection.
127.0.0.1:8529@abc_org> db._create("employees")
[ArangoCollection 1727, "employees" (type document, status loaded)]
Step 2: Let’s insert some data to employees collection.
127.0.0.1:8529@abc_org> db.employees.toArray()
[
{
"_key" : "1768",
"_id" : "employees/1768",
"_rev" : "_cTmCyn----",
"id" : 1,
"name" : "Krishna",
"age" : 32
},
{
"_key" : "1809",
"_id" : "employees/1809",
"_rev" : "_cTmDloy---",
"id" : 2,
"name" : "Narasimha",
"age" : 35
},
{
"_key" : "1823",
"_id" : "employees/1823",
"_rev" : "_cTmD1ya---",
"id" : 3,
"name" : "Deeraj",
"age" : 38
},
{
"_key" : "1837",
"_id" : "employees/1837",
"_rev" : "_cTmEHae---",
"id" : 4,
"name" : "Sailu",
"age" : 33
}
]
Step 3: Let’s create an index on name attribute by executing below statement.
db.employees.ensureIndex({ type: "persistent", fields: [ "name" ], name: "employee_name_index" });
127.0.0.1:8529@abc_org> db.employees.ensureIndex({ type: "persistent", fields: [ "name" ], name: "employee_name_index" });
{
"deduplicate" : true,
"fields" : [
"name"
],
"id" : "employees/1890",
"isNewlyCreated" : true,
"name" : "employee_name_index",
"selectivityEstimate" : 1,
"sparse" : false,
"type" : "persistent",
"unique" : false,
"code" : 201
}
127.0.0.1:8529@abc_org> db.employees.getIndexes()
[
{
"fields" : [
"_key"
],
"id" : "employees/0",
"name" : "primary",
"selectivityEstimate" : 1,
"sparse" : false,
"type" : "primary",
"unique" : true
},
{
"deduplicate" : true,
"fields" : [
"name"
],
"id" : "employees/1890",
"name" : "employee_name_index",
"selectivityEstimate" : 1,
"sparse" : false,
"type" : "persistent",
"unique" : false
}
]
Step 4: Let’s use explainer module to
var explain = require("@arangodb/aql/explainer").explain;
explain("FOR emp IN employees FILTER emp.name == 'Krishna' RETURN emp", {colors: false});
127.0.0.1:8529@abc_org> var explain = require("@arangodb/aql/explainer").explain;
127.0.0.1:8529@abc_org> explain("FOR emp IN employees FILTER emp.name == 'Krishna' RETURN emp", {colors: false});
Query String (60 chars, cacheable: true):
FOR emp IN employees FILTER emp.name == 'Krishna' RETURN emp
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
6 IndexNode 1 - FOR emp IN employees /* persistent index scan */
5 ReturnNode 1 - RETURN emp
Indexes used:
By Name Type Collection Unique Sparse Selectivity Fields Ranges
6 employee_name_index persistent employees false false 100.00 % [ `name` ] (emp.`name` == "Krishna")
Optimization rules applied:
Id RuleName
1 use-indexes
2 remove-filter-covered-by-index
3 remove-unnecessary-calculations-2
From the output, you can confirm that ArangoDB uses ‘employee_name_index’ to execute queries on name attribute.
No comments:
Post a Comment