MySQL многоколоночный индекс - PullRequest
0 голосов
/ 20 мая 2011

Должен ли я включить col3 & col4 в свой индекс на MyTable, если это единственный запрос, который я собираюсь выполнить в своей базе данных?

Select MyTable.col3, MyTable.col4
From MyTable 
Inner Join MyOtherTable
On MyTable.col1 = MyOtherTable.col1
And MyTable.col2 = MyOtherTable.col2;

Таблицы, которые я использую, содержат около полумиллиона строк. Для моего вопроса col1 & col2 - уникальный набор, найденный в обеих таблицах.

Вот пример определения таблицы, если вам действительно нужно знать:

CREATE TABLE MyTable 
(col1 varchar(10), col2 varchar(10), col3 varchar(10), col4 varchar(10));

CREATE TABLE MyOtherTable 
(col1 varchar(10), col2 varchar(10));

Так, должно ли это быть?

   CREATE MyIdx ON MyTable (col1,col2);

Или это?

   CREATE MyIdx ON MyTable (col1,col2,col3,col4);

Ответы [ 3 ]

2 голосов
/ 21 мая 2011

Запрос, возвращающий полмиллиона строк, соединенных из двух таблиц, никогда не будет очень быстрым - потому что он возвращает полмиллиона строк.

Индекс для col1, col2 кажется достаточным (как вторичный индекс), но в зависимости от того, какие у вас есть другие столбцы, добавление (col3, col4) может сделать его охватывающим индексом .

В InnoDB это может быть сделать первичный ключ (col1, col2), а затем кластеризовать его, что является чем-то вроде выигрыша.

Но еще раз, если ваш запрос объединяет 500 000 строк без какого-либо другого предложения WHERE и возвращает 500 000 строк, это не будет быстрым, поскольку ему нужно извлечь все строки, чтобы вернуть их.

2 голосов
/ 20 мая 2011

добавление столбцов col3 и col4 не поможет, потому что вы просто извлекаете эти значения после нахождения их по столбцам col1 и col2. Скорость обычно достигается за счет того, что столбцы col1 и col2 проиндексированы.

Вы должны разделить эти индексы, поскольку вы не используете их вместе:

CREATE MyIdx ON MyTable (col1); CREATE MyIdx ON MyTable (col2);

Не думаю, что комбинированный индекс поможет вам в этом случае.

ИСПРАВЛЕНИЕ: Я думаю, что я неправильно сформулировал, поскольку вы намерены использовать только этот запрос к двум таблицам и никогда не объединять отдельные столбцы изолированно. В вашем случае кажется, что вы могли бы получить некоторую скорость, собрав их вместе. Было бы интересно сравнить это, чтобы увидеть, насколько быстро вы увидите увеличение на 1/2 миллиона строк при использовании комбинированного индекса по сравнению с отдельными. (Вы по-прежнему не должны использовать столбцы col3 и col4 в индексе, так как они ничего не объединяют.)

1 голос
/ 21 мая 2011

Я не думаю, что кто-то еще упоминал об этом, поэтому я добавляю, что у вас должен быть составной (col1,col2) индекс для обеих таблиц:

CREATE MyIdx ON MyTable (col1,col2);

CREATE MyOtherIdx ON MyOtherTable (col1,col2);

И еще один момент.Индекс на (col1,col2,col3,col4) будет полезен, если вам когда-либо понадобится использовать вариант DISTINCT в вашем запросе:

Select DISTINCT
    MyTable.col3, MyTable.col4
From MyTable 
Inner Join MyOtherTable
On MyTable.col1 = MyOtherTable.col1
And MyTable.col2 = MyOtherTable.col2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...