2012-03-13 2 views
0

Table (InnoDB):Mysql оптимизация индекса покрытия

CREATE TABLE `product_category` (
    `product_id` int(11), 
    `category_id` int(11), 
    PRIMARY KEY (`product_id`,`category_id`), 
    UNIQUE KEY `category_id` (`category_id`,`product_id`) 
) 

мне нужно запускать запросы последующих SQL в моем проекте:

1. select `category_id` from `product_category` where `product_id`=? 
2. select `product_id` from `product_category` where `category_id`=? 

я создаю PRIMARY KEY(product_id,category_id) для SQL запроса 1

и создание UNIQUE(category_id,product_id) KEY для SQL-запроса 2

Я хочу знать это правильно?

любая другая оптимизация возможна?

Большое спасибо

+1

'category_id' может быть обычным индексом btree (' category_id') без дополнительного уникального ограничения, столбцы PK неявно добавляются к ключу. – newtover

ответ

2

Если вы используете INNODB двигатель, нет необходимости для второго сводного индекса (на category_id,product_id). Достаточно иметь индекс только на category_id, потому что все вторичные индексы сохраняют копию первичного ключа

1

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

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

Оптимизация. Если у вас нет так много категорий или продуктов, вы должны определить эти поля меньшего размера (возможно, int (5)).

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