2012-01-18 1 views
3

У меня есть 2 стола: изделия и Категории. Каждая категория имеет много продуктов, и продукт может принадлежать многим категориям.Внешние ключи и указатели

продукты

product_id - int primary auto increment 
name - unique 
etc. 

категории

category_id - int primary auto increment 
name - unique 
etc. 

У меня есть 3-ий стол для отношений manyTomany.

products_categories

product_id -> foreign key: products.product_id 
category_id -> foreign key: category.category_id 

Мой вопрос: должен ли я создать индексы для product_id и category_id в product_categories для ускорения запросов на выборку, и если да, какие показатели?

Благодаря

ответ

2

Это зависит от того, какие запросы будут наиболее частыми.

Вы можете получить три индекса.

  1. Если у вас есть ... WHERE products_categories.product_id = XXX, создать индекс по product_id.

  2. То же самое для category_id

  3. Создать индекс на обоих category_idиproduct_id если у вас есть ... WHERE products_categories.category_id = XXX AND products_categories.product_id = YYY

Однако following the MySQL manual, имейте в виду, что индекс (category_id, product_id) может быть избыточными с индекс на (category_id). Кроме того, индекс на (product_id, category_id) может быть избыточным с индексом на (product_id). Таким образом, вы можете, наконец, получить два индекса (вместо трех), охватывающих все ваши частые запросы.

+2

просто сказать, что вы должны придерживаться одного способа: либо сделать запрос category_id AND product_id, либо наоборот. Тогда вам понадобится только один составной индекс, и вы можете добавить второй простой. – mkk

+0

Благодарим вас за объяснение и за представление меня нескольким индексам столбцов. –

1

Вы определенно должны создавать индексы, поскольку ограничение FOREIGN KEY ничего не говорит об исходном поле для ограничения, поэтому оно не создает автоматическое создание индекса.

На вопрос «какой индекс» вы, конечно, не хотите уникальный индекс, и я бы придерживался стандартного индекса, который является БРИТЕТ.

+0

Благодарим вас за это: ограничение FOREIGN KEY ничего не говорит об исходном поле для ограничения. –