The index search algorithm operates with key weights, not with key values, regardless of whether the index direction is
ascending
ordescending
. The search operations and their rules require some explanation. To demonstrate how key searches produce their result sets, consider a simple key containing one integer field populated with the dataset[1,2,2,3,4,4,5]
.Following is a table representing the keys’ values and their respective weights after a search operation is performed:
Key Value Key Weight 1 0 2 1 2 1 3 2 4 3 4 3 5 4 Now consider a slightly less trivial example where the key is represented as a structure containing two fields: an integer and a string. The compare function compares integers as in the above sample and the char buffers as ASCII characters. Assume that the dataset is as follows:
[ (1,"ZZZ"), (1,"BBB"), (2,"AAA"), (2,"AAA"), (2,"BBB"), (3,"XXX") ]The resulting key weight-table is:
Key Value Key Weight 1, “BBB” 0 1, “ZZZ” 1 2, “AAA” 2 2, “AAA” 2 2, “BBB” 3 3, “XXX” 4 If the index is in the reverse order (declared as
descending
) the weight tables will be as follows:
Key Value Key Weight 5 0 4 1 4 1 3 2 2 3 2 3 1 4
Key Value Key Weight 3, “XXX” 0 2, “BBB” 1 2, “AAA” 2 2, “AAA” 2 1, “ZZZ” 3 1, “BBB” 4
For B-Tree indexes, there are five search operations which have internal operation codes:
MCO_LT, MCO_LE, MCO_EQ, MCO_GE
, andMCO_GT
. A search operation specifies one of these operation codes and the results are returned in acursor
positioned to the appropriate element of the index.Abbreviating “weight of the specified keys value” as WSKV and “cursor’s current element” as CCE, the following table describes how they are correlated by the eXtremeDB runtime:
Search operation Search condition Description of rules MCO_LT less than (<) Points the CCE to the first key with weight WSKV-1 MCO_LE less than or equal (<=) Points the CCE to the last (rightmost) occurrence from the keys with weight equal to WSKV or (if not found) to the first key with weight WSKV-1 MCO_EQ equal (==) Points the CCE to the first (leftmost) key with weight equal to WSKV MCO_GE greater than or equal (>=) Points the CCE to the first (leftmost) occurrence from the keys with weight equal to WSKV or (if not found) to the first key with weight WSKV+1 MCO_GT greater than (>) Points the CCE to the first key with weight WSKV+1
To illustrate these rules, consider the first example dataset above and a search value of
2
. The following table shows how the cursor is positioned and what would be the result of the cursor navigation operations prev (previous) and next:
Search operation Search result Description of result MCO_LT 1 = CCE 2 2 3 4 4 5 CCE points to key value 1;
prev will return
MCO_S_CURSOR_END
;next will return
MCO_S_OK
and will move CCE to key value 2MCO_LE 1 2 2 = CCE 3 4 4 5 CCE points to rightmost key value 2;
prev will return
MCO_S_OK
and will move CCE to key value 2(the leftmost)next will return
MCO_S_OK
and will move CCE to key value 3MCO_EQ 1 2 = CCE 2 3 4 4 5 CCE points to leftmost key value 2;
prev will return
MCO_S_OK
and will move CCE to key value 1next will return
MCO_S_OK
and will move CCE to key value 2 (the rightmost)MCO_GE 1 2 = CCE 2 3 4 4 5 CCE points to leftmost key value 2;
prev will return
MCO_S_OK
and will move CCE to key value 1next will return
MCO_S_OK
and will move CCE to key value 2 (the rightmost)MCO_GT 1 2 2 3 = CCE 4 4 5 CCE points to key value 3;
prev will return
MCO_S_OK
and will move CCE to key value 2 (the rightmost)next will return
MCO_S_OK
and will move CCE to key value 4 (the leftmost)In the case of the reverse index, again with a search value of
2
:
Search operation Search result Description of result MCO_LT 5 4 4 3 = CCE 2 2 1 CCE points to key value 3;
prev will return
MCO_S_OK
and will move CCE to key value 4(the rightmost)next will return
MCO_S_OK
and will move CCE to key value 2(leftmost)MCO_LE 5 4 4 3 2 2= CCE 1 CCE points to key value 2;
prev will return
MCO_S_OK
and will move CCE to key value 2(the leftmost)next will return
MCO_S_OK
and move CCE to the key value 1MCO_EQ 5 4 4 3 2 = CCE 2 1 CCE points to key value 2;
prev will return
MCO_S_OK
and move CCE to the key value 3next will return
MCO_S_OK
and move CCE to the key value 2(the rightmost)MCO_GE 5 4 4 3 2 = CCE 2 1 CCE points to key value 2;
prev will return
MCO_S_OK
and will move CCE to key value 3next will return
MCO_S_OK
and move CCE to the key value 2(the rightmost)MCO_GT 5 4 4 3 2 2 1 = CCE CCE points to key value 1;
prev will return
MCO_S_OK
and will move CCE to key value 2 (rightmost)next will return
MCO_S_CURSOR_END
Optimizing tree indexes
Normally, the B-Tree implementation doesn't store key values in the index. However, for in-memory databases, sometimes it is beneficial to keep the key value on the index pages. See section “Key-Value-Inclusive and Covering Indexes” in this document.