外键和索引

时间:2012-01-18 12:56:04

标签: mysql indexing foreign-keys

我有2个表:产品类别。每个类别都有很多产品,产品可以属于多个类别。

产品

product_id - int primary auto increment
name - unique
etc.

类别

category_id - int primary auto increment
name - unique
etc.

我有很多关系的第三张表。

products_categories

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

我的问题是:我应该在 product_categories 中为product_idcategory_id创建索引,以便更快地选择查询,如果是,那么索引是什么?

由于

2 个答案:

答案 0 :(得分:2)

这取决于最常见的查询。

您最终可能会有三个索引。

  1. 如果您有... WHERE products_categories.product_id = XXX,请在product_id上创建索引。

  2. category_id

  3. 相同
  4. 如果您有category_id

  5. ,请在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)上的索引也是如此。因此,最终可能会有两个索引(而不是三个)覆盖所有频繁的查询需求。

答案 1 :(得分:1)

你肯定应该创建索引,因为FOREIGN KEY约束没有说明约束的源字段,因此它不会自动创建索引。

对于问题“哪个索引”你当然不想要一个唯一索引 - 我会坚持使用BTREE的默认索引。