我有一个表(id(PK,UNIQUE),user_id,[其他列在这里]),有大量(100k +)的用户'订单,其中每个用户只能访问已设置他的user_id的订单。
我想知道如何使用user_id作为主键可能会影响此数据库上SELECT查询的性能。是否有任何有效的解决方案可以在单个InnoDB表中维护绑定到用户的大量行(每个订单都有一个所有者)?
答案 0 :(得分:1)
如果大多数查询都包含user_id
的特定值,则效率更高:
PRIMARY KEY(user_id, id), -- to get the benefit of 'clustering' around user_id
INDEX(id) -- to make AUTO_INCREMENT happy
答案 1 :(得分:0)
只要两者的数据类型相同,即int
或uint
,就性能而言,它不会有任何不同。
您可以安全地删除ID并使UID成为主键。
答案 2 :(得分:0)
该表是“用户订单”。如果user_id加上某些列唯一地标识了一个订单而没有那些子集,则该组列是一个候选键(要声明为PK / UNIQUE)。如果没有唯一标识订单的列集,那么您需要使用像id这样的代理。 (出于其他原因,您可能会想要它。)
由于每个用户可以有多个订单,{user_id} 不是此表的候选键。