MySQL - много столбцов в индексе?Или один за другим? - PullRequest
3 голосов
/ 13 января 2011

Предположим, что у продукта может быть до пяти (5) жалоб. В этом случае есть таблица с пятью (5) столбцами. Эти пять столбцов непосредственно задействованы в другой таблице, где в отчетах указаны коды претензий.

См .: http://img263.imageshack.us/img263/4990/01mysql.jpg

С этого момента я должен установить связь между двумя таблицами. Итак, что из следующего является более правильным для создания индексов:

а) создание индекса один за другим?

ALTER TABLE `complaint` ADD INDEX (`code_01`) 
ALTER TABLE `complaint` ADD INDEX (`code_02`) 
ALTER TABLE `complaint` ADD INDEX (`code_03`) 
ALTER TABLE `complaint` ADD INDEX (`code_04`) 
ALTER TABLE `complaint` ADD INDEX (`code_05`) 

б) Что все поля в одном индексе?

ALTER TABLE `complaint` ADD INDEX (`code_01`, 
                                   `code_02`, 
                                   `code_03`, 
                                   `code_04`, 
                                   `code_05`)

Я считаю, что лучшим вариантом является а), потому что, если я выберу опцию b) и при доступе к «представлению отношений» в phpMyAdmin, это показывает, что есть другие поля, в которых говорится, что «индекс не определен!» в столбцах code_02, code_03 и code_04 code_05.


ВНИМАНИЕ - ДЛЯ ВСТАВКИ И ОБНОВЛЕНИЯ:

Если я использую опцию b) и введу код в записи со столбцами code_02, code_03 и code_04 code_05, MySQL не сообщит о каких-либо ошибках, что введенный код не существует. Возвращает только сообщение об успехе, которое действительно должно быть неверным. Так что в данном конкретном случае я должен использовать опцию а), верно?

Ответы [ 4 ]

4 голосов
/ 13 января 2011

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

Опция a создаст 5 отдельных индексов, а опция B создаст только 1

если вы будете искать или сортировать по любому из столбцов, то вы должны использовать опцию A. Однако, если вы будете искать по столбцам в порядке индекса, тогда используйте опцию B

Пример

SELECT ID
FROM table
WHERE code_03 = 'asd' OR code_02 = 'asds'

использовать опцию A

SELECT ID
FROM table
WHERE code_01 = 'asd' AND code_02 = 'asds'

использовать опцию B

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

1 голос
/ 13 января 2011

Зависит от ваших запросов!

Пожалуйста, прочитайте это:

http://use -the-index-luke.com / SQL / где придаточный / поиск-для-диапазонов / индекс сочетает производительность

Возможно, вам потребуется больше информации с этой страницы.

0 голосов
/ 13 января 2011

Игнорируя тот факт, что многие ожидают, что это будет таблица «многие ко многим», я предполагаю, что вы собираетесь присоединиться к записи жалобы в каждом из полей. * 1001 например *

Products
inner join product_complaint pc
ON p.pid = pc.pid
LEFT JOIN complaints c1
ON pc.code_01 = c1.c_id
LEFT JOIN complaints c2
ON pc.code_02 = c2.c_id
LEFT JOIN complaints c3
ON pc.code_03 = c3.c_id
LEFT JOIN complaints c4
ON pc.code_04 = c4.c_id
LEFT JOIN complaints c5
ON pc.code_05 = c5.c_id

В этом случае используйте опцию 1.

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

0 голосов
/ 13 января 2011

Если можете, нормализуйте свой дизайн.Получите эти 5 столбцов кода из таблицы Complaint и создайте таблицу соединений между Complaints и code_complaint для правильной обработки отношения «многие ко многим».

Как правило, каждый раз, когда вы начинаете нумерацию имен столбцов (code_01), code_02 ...), это должен быть красный флаг, который требует дальнейшей нормализации вашего дизайна.

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