Лучший способ создать индекс базы данных на MySQL - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы искать в моей таблице базы данных MYSQL по комбинациям нескольких атрибутов, и я хотел бы проиндексировать ее.Например, если это моя таблица:

+----+--------+--------+--------+--------+
| id | field1 | field2 | field3 | field4 |
+----+--------+--------+--------+--------+
|    |        |        |        |        |

Я хочу выполнить такие запросы:

select * from table where field1=value1 and field2=value2;
select * from table where field3=value3 and field4=value4;
select * from table where field1=value1 and field2=value2 and field3=value3;
select * from table where field4=value4;

Как лучше всего создать индекс для чего-то подобного?

CREATE INDEX my_index on table(field1, field2, field3, field4); 

или что-то вроде:

CREATE INDEX my_index1 on table(field1); 
CREATE INDEX my_index2 on table(field2); 
CREATE INDEX my_index3 on table(field3); 
CREATE INDEX my_index4 on table(field4); 

или что-то совсем другое?

Ответы [ 2 ]

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

Давайте начнем с создания оптимального индекса для каждого запроса:

select * from table where field1=value1 and field2=value2;
INDEX(value1, value2)  -- in either order

select * from table where field3=value3 and field4=value4;
INDEX(value3, value4)  -- in either order

select * from table where field1=value1 and field2=value2 and field3=value3;
INDEX(value1, value2, value3)  -- in any order

select * from table where field4=value4;
INDEX(value4)

Теперь давайте посмотрим, сможем ли мы сократить количество индексов:

INDEX(value1, value2)  -- in either order, and
INDEX(value1, value2, value3)  -- in any order

можно объединитьследующим образом, чтобы иметь один индекс, который хорошо обрабатывает оба выбора:

INDEX(value1, value2,   -- in either order
      value3)   -- afterwards

Аналогично,

INDEX(value3, value4)  -- in either order
INDEX(value4)

->

INDEX(value4, value3)  -- in THIS order

Итак, для те SELECTs, два составных индекса являются оптимальными:

INDEX(value1, value2,   -- in either order
                      value3)   -- afterwards
INDEX(value4, value3)  -- in THIS order

Но ... Вы предоставили все SELECTs?Я подозреваю, что вы этого не сделали.И вы действительно допускаете все комбинации из нескольких столбцов.Это становится действительно грязным.Вместо того, чтобы выполнять вышеупомянутое упражнение, я рекомендую вам найти наиболее вероятные комбинации, построить несколько составных индексов, а затем сократить их, отметив, что INDEX(a,b,c) - довольно хорошая замена для INDEX(a,b,d).

Но... Становится еще хуже, если у тебя не только =.При построении составного индекса, но сначала столбец (столбцы) =, затем любой INs и, наконец, не более одного теста 'range'.

Но ... Если у вас есть ORвместо AND, ну, забудьте об оптимизации.

Полезное правило. Не используйте более 5 индексов.

Теперь, если вы хотите начать все сначала, наберите реальные имена столбцов и реальные типы данных, то есть реальные подсказки того, что имеет смысл, я могу помочь вам в дальнейшем.

0 голосов
/ 21 февраля 2019

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

CREATE INDEX my_index1 on table(field1); 
CREATE INDEX my_index2 on table(field2); 
CREATE INDEX my_index3 on table(field3); 
CREATE INDEX my_index4 on table(field4); 

Затем вы создадите 4 различных индекса, которые можно использовать независимо, в противном случаевы создадите составной индекс.

Почему один единственный индекс здесь не будет работать?

Поскольку, только с одним единственным индексом с несколькими полями, ваш запрос будет толькоприменять индекс, если вы используете поля в запросе строго слева направо.Я привел несколько примеров:

EXPLAIN SELECT * FROM table WHERE field2=value2 AND field1=value1;

Этот запрос, будет применять индекс для полей field1 и field2.Зачем?Потому что вы используете два самых левых поля из созданного индекса.

Вы можете увидеть его в поле explain possible_keys со значением my_index.

Однако следующий пример:

EXPLAIN SELECT * FROM table WHERE field3=value3 AND field4=value4;

Не применяетсялюбой индекс, потому что вы собираетесь напрямую вызывать методы из самых правых.

Вы можете увидеть его в поле explain possible_keys со значением null.

И простокак последний пример:

EXPLAIN SELECT * FROM table WHERE field1=value1 AND field4=value4;

В этом запросе индекс применяется только для field1, но не для field4.Причина?не используются другие field2 и field3 между ними.

Вы можете увидеть это в explain поле possible_keys, равном my_index и поле extras со значением Using index, using where.

Более подробную информацию о составном индексе вы можете найти здесь:

http://www.mysqltutorial.org/mysql-index/mysql-composite-index/

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