Как MySQL пересекает составной индекс B-дерева для поисков IN () и IN () - PullRequest
1 голос
/ 05 марта 2012

Я изучал индексы и не могу полностью понять, как MYSQL вообще может использовать индексы для операторов типа

IN() AND IN() ... AND IN()

Книга, которую я читаю, предполагает, что когда у нас есть индекс (a, b, ...), но пользователь хочет найти b, и у нас низкая мощность в a, мы можем используйте трюк и просто добавьте IN ()

WHERE a IN ('x1', 'x2', ... 'all possible values go here') AND `b`>123

Допустим, у нас есть следующие данные

x1 1
x1 4
x1 456
x2 5
x3 1
x3 2
x3 3
x4 1234

Как оно может пройти по этому дереву, чтобы удовлетворить запрос выше? Будет ли он просто создавать все возможные комбинации для IN-ов и будет в значительной степени обходить дерево для каждого из этих запросов?

WHERE `a`='x1' AND `b`>123
WHERE `a`='x2' AND `b`>123
...

поэтому делает этот трюк ограниченной полезности, потому что с увеличением числа IN-s количество всех возможных комбинаций IN резко возрастает, и нам придется пробежаться по B-дереву для каждой из этих комбинаций? Если вышеприведенное верно, означает ли это, что есть некоторая теоретическая точка, в которой обман с индексом IN будет выполняться медленнее, чем без использования индекса?

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

Вы правы.

MySQL использует ту же технологию для этого типа оптимизации IN, которую он использует при выполнении JOIN, а MySQL способен выполнять большое количество JOIN, не оказывая заметного влияния на производительность.

Хотя стоимость может в конечном итоге достичь точки, в которой она становится заметной, все же, как правило, преимущество заключается в том, что вообще не используется индекс.

Если индекс вообще не используется, это выгодно толькоточка, в которой вы возвращаете большой процент строк.MySQL может принять решение, когда отказаться от индекса.

0 голосов
/ 05 марта 2012

Объединяет результаты нескольких проходов.Так что да, ваше предположение верно.:)

См. http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

До объединения индекса mysql не мог удовлетворить такие запросы из индекса.

...