С индексом (a, b)
B-дерево выглядит так:
a: 1 -
b: 1
2
4
5
10
15
5 -
b: 2
11
22
15 -
b: 3
10 **
20
20 -
b: 5
9
10 **
11
Чтобы найти все строки, где a > 10 AND b = 10
необходимо сначала разделить уровень дерева a > 10
, а затем пройти через каждое из этих поддеревьев, чтобы получить его элемент b = 10
.
С индексом (b, a)
B-дерево будет выглядеть так:
b: 1 -
a: 1
2 -
a: 1
5
4 -
a: 1
5 -
a: 1
20
9 -
a: 20
10 -
a: 1
15 **
20 **
11 -
b: 5
20
20 -
b: 15
22 -
b: 5
Теперь он может просто найти b = 10
на первом уровне дерева и разделить его поддерево, чтобы получить a > 10
. Это не требует сканирования нескольких поддеревьев.
Я выделил выделенные строки с помощью **
на двух диаграммах. С вашим индексом, строки разбросаны по всему B-дереву. С обратным индексом они соприкасаются в дереве, и это то, что нужно базе данных для эффективного использования индекса.