假设我有三张桌子:
客户(CustomerID,出生日期,城市,地址,电话,销售,性别) 采购(CustomerID,ItemID,date) 商品(ItemID,描述,颜色,价格,供应,库存)
因此,cutomerID是客户的主键,ItemID是项目的主键,(CustomerID,ItemID,Date)是购买表的主键。
据我所知,不需要对主键应用索引(在本例中,表1为customerID,表3为ItemID ),因为mysql是自动的。
复合主键呢?
我是否应该在复合pk上应用唯一的索引(CustomerID,ItemID,Date)?还是最好在三列上添加单独的非唯一索引(所以,customerID上的非唯一索引,ItemID上的非唯一索引,dateID上的非唯一索引)?
请考虑这三个表中非常丰富的数据,并且需要许多连接。
发布于 2021-05-09 10:24:19
发布于 2021-05-09 11:00:24
Purchase上的复合主键基于(CustomerID, ItemID, date)上的唯一索引。
这并不等同于(CustomerID)、(ItemID)和(Date)上的单独索引。
你需要单独的索引吗?对于从Purchases到Customers或Items的任何连接,Purchases上的索引并不是很重要--重要的是它是引用表上的主键。
什么时候需要二级索引?可能更少用于联接,而更多用于筛选。特别是,我可以想象,在date上进行过滤是很重要的,而且可能值一个索引。
此外,如果您有诸如“获取所有尚未购买的商品(例如两个日期之间)”之类的查询,则通常将其表述为:
select i.*
from items i
where not exists (select 1 from purchases p where p.itemId = i.itemId);在这种情况下,Purcahses(itemId)上的索引将是有帮助的。
发布于 2021-05-09 10:25:31
不,盗版钥匙是自动编入索引的
表的主键表示在最重要的查询中使用的列或列集。它有一个相关的索引,用于快速查询性能。
https://dev.mysql.com/doc/refman/8.0/en/primary-key-optimization.html
https://stackoverflow.com/questions/67456523
复制相似问题