繁体   English   中英

我需要在复合主键的第二列上建立索引吗?

[英]Do I need an index on the second column of a compound primary key?

我的架构如下所示 -

CREATE TABLE `products` (
    `account_id` varchar(100) NOT NULL,
    `product_id` int NOT NULL,
    `product_name` varchar(100) NOT NULL,
    PRIMARY KEY (`account_id`,`product_id`),
    KEY `idx_product_id` (`product_id`)
) 

该应用程序将有多个帐户(客户),每个客户都将拥有自己的产品,例如多租户电子商务网站。 产品本身没有任何意义,只有与account_id相关联才有意义。 账户 A(客户 A)可以有产品 1,账户 B 也可以有产品 1。但是 Account 和 Product 的组合应该是唯一的,因此主键在account_idproduct_id上。

我知道account_id不需要索引,因为主键会在account_id / product_id组合上创建索引。 我认为在product_id上也不需要单独的附加索引,因为产品将始终在帐户的上下文中被引用,并且主键索引可以解决这个问题。

  1. 我可以提前 go 并从上面的表模式中删除KEY idx_product_id (product_id)吗?

  2. 一般来说,我们需要在复合主键的第二列上建立索引吗?

想想电话簿。 这就像(last_name, first_name)上的索引。 如果您按姓氏查找一个人,那么首先按姓氏排序非常有帮助。 如果您同时按姓氏和名字查找一个人,这也很有帮助。

但是,如果您使用电话簿试图仅通过他们的名字来查找某人,那么这本书将无济于事。 它不按名字排序。 这是一个问题吗? 你会通过他们的名字来查找某人吗? 如果您需要这样做,您将需要按名字排序的第二个电话簿。 但是,如果您从不需要进行这种查找,则不需要它。

二级索引也是如此。 如果您总是按帐户然后按产品查找产品,那么主键的排序顺序就足够了。 如果您有时查找产品以查看哪些帐户使用该产品,那么首先使用product_id的二级索引会有所帮助。

因此,您的问题的答案取决于您打算运行的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM