首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将索引添加到Mysql中的复合原始键中

将索引添加到Mysql中的复合原始键中
EN

Stack Overflow用户
提问于 2021-05-09 10:11:45
回答 3查看 432关注 0票数 1

假设我有三张桌子:

客户(CustomerID,出生日期,城市,地址,电话,销售,性别) 采购(CustomerIDItemIDdate) 商品(ItemID,描述,颜色,价格,供应,库存)

因此,cutomerID是客户的主键,ItemID是项目的主键,(CustomerID,ItemID,Date)是购买表的主键。

据我所知,不需要对主键应用索引(在本例中,表1为customerID,表3为ItemID ),因为mysql是自动的。

复合主键呢?

我是否应该在复合pk上应用唯一的索引(CustomerID,ItemID,Date)?还是最好在三列上添加单独的非唯一索引(所以,customerID上的非唯一索引,ItemID上的非唯一索引,dateID上的非唯一索引)?

请考虑这三个表中非常丰富的数据,并且需要许多连接。

EN

回答 3

Stack Overflow用户

发布于 2021-05-09 10:24:19

主键具有关联的索引。这不取决于主键是否是复合的。

来自文档

表的主键表示在最重要的查询中使用的列或列集。它有一个关联索引,用于快速查询性能。

如果您有将条件放在Purchase.Date字段上的查询,那么您可能会从该字段上的非唯一索引中获益。但是,是否在实际查询中使用此索引,必须使用explain进行验证。这将使您最终确认是否确实使用了该索引。如果您发现它没有被使用,那么就删除它,因为索引还会为相关表的每个DML更新带来额外的开销。

票数 1
EN

Stack Overflow用户

发布于 2021-05-09 11:00:24

Purchase上的复合主键基于(CustomerID, ItemID, date)上的唯一索引。

这并不等同于(CustomerID)(ItemID)(Date)上的单独索引。

你需要单独的索引吗?对于从PurchasesCustomersItems的任何连接,Purchases上的索引并不是很重要--重要的是它是引用表上的主键。

什么时候需要二级索引?可能更少用于联接,而更多用于筛选。特别是,我可以想象,在date上进行过滤是很重要的,而且可能值一个索引。

此外,如果您有诸如“获取所有尚未购买的商品(例如两个日期之间)”之类的查询,则通常将其表述为:

代码语言:javascript
复制
select i.*
from items i
where not exists (select 1 from purchases p where p.itemId = i.itemId);

在这种情况下,Purcahses(itemId)上的索引将是有帮助的。

票数 1
EN

Stack Overflow用户

发布于 2021-05-09 10:25:31

不,盗版钥匙是自动编入索引的

表的主键表示在最重要的查询中使用的列或列集。它有一个相关的索引,用于快速查询性能。

https://dev.mysql.com/doc/refman/8.0/en/primary-key-optimization.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67456523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档