составной индекс не работает в запросе диапазона - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть запрос:

Select * 
from table 
where  a>10 and b=10  

составной индекс (a,b). Мой вопрос заключается в том, почему он может использовать этот составной индекс только в a>10 ,, а b=10 не использует составной индекс в плане объяснения. Я полагаю, что даже когда a>10b также упорядочено в дереве B +, так почему бы не использовать indexg в поле b

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

С индексом (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-дереву. С обратным индексом они соприкасаются в дереве, и это то, что нужно базе данных для эффективного использования индекса.

0 голосов
/ 04 сентября 2018

Вам нужно использовать ref часть ваших индексов (aka b) перед частью диапазона (a). Таким образом, составной индекс должен быть (b,a).

Обе части индекса создают дерево B +. Таким образом, поиск по индексу (a,b) будет включать в себя поиск по всему a>10 для части b=10.

Если это (b,a), вы можете найти b=10, a>10, а затем просто ходить по дереву, пока не останется b=10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...