2013-07-24 4 views
0

У меня есть таблица с тремя колонками. Он имеет уникальный индекс и еще два (для двух разных столбцов) для более быстрых запросов.Два не первичных/уникальных индекса в таблице из трех столбцов

+-------------+-------------+----------+ 
| category_id | related_id | position | 
+-------------+-------------+----------+ 

Иногда запрос

SELECT * FROM table WHERE category_id = foo

и иногда это

SELECT * FROM table WHERE related_id = foo

Так что я решил сделать как category_id и related_id индекс для лучшей производительности. Это плохая практика? Каковы недостатки такого подхода?

В случае, если у меня уже есть 100 000 строк в этой таблице, и я вставляю еще 100 000, это будет перебор. нужно обновить индекс с каждой новой вставкой? Будет ли эта операция слишком длительной? Спасибо

+0

Вы имеете в виду, что вы сделали КАЖДЫЙ один индекс? тогда хорошо. Недостатком является то, что вы должны поддерживать этот индекс во время вставки или обновления. обычно не слишком много накладных расходов. – Randy

+0

есть, каждый. Итак, в случае, если у меня уже есть 100 000 строк в этой таблице, и я вставляю еще 100 000, это будет излишним, нужно обновить индекс каждой новой вставкой? Будет ли эта операция слишком длительной? – srgb

ответ

0

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

В ваших интересах индексировать те поля, которые имеют менее повторяющиеся значения. Напр. Индексирование поля, содержащего логический флаг, может быть не очень хорошей идеей.

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

Кроме того, вставки будут медленнее, но поскольку вы сохраняете id's, разница в времени, требуемом для вставки, не будет большой. Вперед и сделайте вставку.

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

+0

спасибо - не могли бы вы ответить на дополнительный вопрос, который я добавил на дно? – srgb

+0

Обновлен ответ. – Manu

1

Нет недостатков, если он делает именно то, что вы хотите, вы запрашиваете в определенном столбце много, поэтому вы индексируете этот столбец, вот и все. Теперь у вас есть таблица с 60 столбцами и добавление индексов в столбцы, которые вы никогда не запрашиваете, тогда вы тратите ресурсы, потому что эти индексы должны поддерживаться в операциях INSERT/UPDATE/DELETE.

+0

спасибо - не могли бы вы ответить на дополнительный вопрос, который я добавил на дно? – srgb

1

Если вы создали индекс для каждого столбца, то вы обязательно получите выгоду от него.

Не переходите на составные индексы (несколько индексов купонов).

Вы сами можете увидеть преимущество индекса в своем запросе с помощью EXPLAIN (оператор предоставляет информацию о том, как MySQL выполняет инструкции).

Пример:

EXPLAIN SELECT * FROM table WHERE category_id = foo; 

Надеется, что это поможет.

~ K

Смежные вопросы