【问题标题】:Foreign keys and indexes外键和索引
【发布时间】:2012-02-13 04:33:26
【问题描述】:

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

产品

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 创建索引以便更快地进行选择查询,如果是,哪些索引?

谢谢

【问题讨论】:

    标签: mysql indexing foreign-keys


    【解决方案1】:

    这取决于最频繁的查询。

    您最终可能会得到三个索引。

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

    2. category_id 也一样

    3. 如果您有... WHERE products_categories.category_id = XXX AND products_categories.product_id = YYY,则在category_id product_id 上创建索引

    但是,following the MySQL manual,请记住,(category_id, product_id) 上的索引可能与(category_id) 上的索引是多余的。同样,(product_id, category_id) 上的索引可能与(product_id) 上的索引是多余的。因此,您最终可能会使用两个索引(而不是三个)来满足您所有的频繁查询需求。

    【讨论】:

    • 只是这么说,你应该坚持一种方式:要么查询 category_id AND product_id ,要么反过来。然后你只需要一个复合索引,你可以添加第二个简单的
    • 感谢您的解释,以及向我介绍多列索引。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您:FOREIGN KEY 约束没有说明约束的源字段。
    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2020-01-29
    • 2011-05-25
    • 1970-01-01
    • 2023-03-24
    • 2010-11-01
    相关资源
    最近更新 更多