[英]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_id
和product_id
上。
我知道account_id
不需要索引,因为主键会在account_id
/ product_id
组合上创建索引。 我认为在product_id
上也不需要单独的附加索引,因为产品将始终在帐户的上下文中被引用,并且主键索引可以解决这个问题。
我可以提前 go 并从上面的表模式中删除KEY idx_product_id (product_id)
吗?
一般来说,我们需要在复合主键的第二列上建立索引吗?
想想电话簿。 这就像(last_name, first_name)
上的索引。 如果您按姓氏查找一个人,那么首先按姓氏排序非常有帮助。 如果您同时按姓氏和名字查找一个人,这也很有帮助。
但是,如果您使用电话簿试图仅通过他们的名字来查找某人,那么这本书将无济于事。 它不按名字排序。 这是一个问题吗? 你会通过他们的名字来查找某人吗? 如果您需要这样做,您将需要按名字排序的第二个电话簿。 但是,如果您从不需要进行这种查找,则不需要它。
二级索引也是如此。 如果您总是按帐户然后按产品查找产品,那么主键的排序顺序就足够了。 如果您有时查找产品以查看哪些帐户使用该产品,那么首先使用product_id
的二级索引会有所帮助。
因此,您的问题的答案取决于您打算运行的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.