在大表中使用用户标识作为主键

时间:2016-06-06 12:48:51

标签: mysql optimization key primary-key innodb

我有一个表(id(PK,UNIQUE),user_id,[其他列在这里]),有大量(100k +)的用户'订单,其中每个用户只能访问已设置他的user_id的订单。

我想知道如何使用user_id作为主键可能会影响此数据库上SELECT查询的性能。是否有任何有效的解决方案可以在单个InnoDB表中维护绑定到用户的大量行(每个订单都有一个所有者)?

3 个答案:

答案 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)

只要两者的数据类型相同,即intuint,就性能而言,它不会有任何不同。

您可以安全地删除ID并使UID成为主键。

答案 2 :(得分:0)

该表是“用户订单”。如果user_id加上某些列唯一地标识了一个订单而没有那些子集,则该组列是一个候选键(要声明为PK / UNIQUE)。如果没有唯一标识订单的列集,那么您需要使用像id这样的代理。 (出于其他原因,您可能会想要它。)

由于每个用户可以有多个订单,{user_id} 不是此表的候选键。