- 
                Notifications
    
You must be signed in to change notification settings  - Fork 15
 
Open
Labels
Description
Let's consider the space with multipart unique key. One can be obtained from the playground with the following patch.
diff --git a/doc/playground.lua b/doc/playground.lua
index d4e547f..86293a7 100755
--- a/doc/playground.lua
+++ b/doc/playground.lua
@@ -75,6 +75,7 @@ box.once('customers', function()
     box.space.customers:create_index('primary_index', {
         parts = {
             {field = 1, type = 'unsigned'},
+            {field = 4, type = 'number'},
         },
     })
     box.space.customers:create_index('bucket_id', {
@@ -83,15 +84,12 @@ box.once('customers', function()
         },
         unique = false,
     })
-    box.space.customers:create_index('age', {
-        parts = {
-            {field = 4, type = 'number'},
-        },
-        unique = false,
-    })
 
     -- Fill the space.
     box.space.customers:insert({1, 477, 'Elizabeth', 12})
+    box.space.customers:insert({1, 477, 'Elizabeth', 13})
+    box.space.customers:insert({1, 477, 'Elizabeth', 14})
+    box.space.customers:insert({1, 477, 'Elizabeth', 15})
     box.space.customers:insert({2, 401, 'Mary', 46})
     box.space.customers:insert({3, 2804, 'David', 33})
     box.space.customers:insert({4, 1161, 'William', 81})
If the conditions are specified with index, it is a simple "get by key" procedure.
tarantool> crud.select('customers', {{'==', 'primary_index', {1, 15} }})
---
- metadata: [{'name': 'id', 'type': 'unsigned'}, {'name': 'bucket_id', 'type': 'unsigned'},
    {'name': 'name', 'type': 'string'}, {'name': 'age', 'type': 'number'}]
  rows:
  - [1, 477, 'Elizabeth', 15]
- null
...
tarantool> crud.stats()
---
- spaces:
    customers:
      select:
        details:
          tuples_lookup: 1
          tuples_fetched: 1
...Stats say that we have found the requested data without any scanning.
If the conditions are specified with fields, it is a scan over all tuples satisfying the first condition.
tarantool> crud.select('customers', {{'==', 'id', 1}, {'==', 'age', 15}})
---
- metadata: [{'name': 'id', 'type': 'unsigned'}, {'name': 'bucket_id', 'type': 'unsigned'},
    {'name': 'name', 'type': 'string'}, {'name': 'age', 'type': 'number'}]
  rows:
  - [1, 477, 'Elizabeth', 15]
- null
...
tarantool> crud.stats()
---
- spaces:
    customers:
      select:
        details:
          tuples_lookup: 4
          tuples_fetched: 1
...Stats say that we have scrolled through all id: 1 tuples until we have filtered ones satisfying age: 15 condition.
The same scan is performed in case of crud.select('customers', {{'==', 'id', 1}, {'==', 'age', 12}}): the module does not treat age: 12 condition as the part of the index both to start and to stop.