mysql复合唯一索引,mysql – 复合键VS主键不是唯一索引

这是我有的:

表内容:cat_id product_id data1 data2等

这些类别显然不是唯一的.

产品ID是独一无二的.

2个查询:

1 – SELECT * WHERE cat_id =:cat – 必须尽可能快

2 – SELECT * WHERE product_id =:prodId

在第二个选择中,我可以添加:AND cat_id =:cat

效率更高的是什么?

> 1 – cat_id上的索引(非唯一)(适用于选择1)

> 2 – product_id上的主键(唯一 – >选择2的优秀)

> 3 – product_id上的cat_id PK上的索引(非唯一)(分别适用于1和2)

> 4 – 使用复合[cat_id product_id]的唯一约束(适用于1& 2)

> 5 – 与4相同,但将复合定义为PK

> 6 – 复合(4或5)单指数/ PK

有关信息,我将在每个类别中有大约20种产品和许多类别(比如3000) – 并且(因为它在表中是独一无二的)一个产品只属于一个类别 – 事实上,这不是真正的猫和产品,这是为了简单的解释;)

谢谢!

解决方法:

没有主键的数据库只有一半打扮,根据你的说法,product_id是主键的理想候选者,所以我们选择它.主键将用于

SELECT * WHERE product_id = :prodId

if和cat_id =:cat_id是否成为查询的一部分并不重要,除非您有数千个与每个product_id关联的cat_id.

然后在cat_id上选择一个索引.这将用于

SELECT * WHERE cat_id = :cat

如果数据的基数良好,这将非常快.这意味着表中有大量的cat_ids分布. cat_id的索引不会在第一个查询中使用.因此,您有两个不同的索引,并且可以预期两个查询都非常快.

由于[cat_id product_id]!= [product_id cat_id]在索引时,如果你只有一个复合索引,那么另一个将很慢.

例如,假设我们现在有一个复合索引(cat_id,product_id)

以下查询无法使用此索引.

SELECT * FROM tablename WHERE product_id = :prodId

但这两个查询都可以使用(cat_id,product_id)索引

SELECT * FROM tablename WHERE cat_id = :cat_id and product_id = :prodId

SELECT * FROM tablename WHERE cat_id = :catId

所以总结一下.选择1和2.但是如果cat_id的数量很小或者每个product_id都有很多cat_id,请选择4,但要确保主键也就位.

标签:mysql,database,innodb,database-indexes

来源: https://codeday.me/bug/20190824/1704922.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值