MySQL/InnoDB 表总是聚集在一起的(更多关于聚集在这里和这里)。
由于主键还充当集群键1,因此使用代理主键意味着您在物理上对表进行排序,这对客户端应用程序没有有用的意义,也不能用于查询。
此外,聚簇表中的二级索引可能比基于堆的表“更胖”,并且可能需要双重查找。
由于这些原因,您希望避免使用代理并使用更多“自然”键,类似于以下内容:
({USER_ID, PICTURE_NO}
在表中VOTE
引用了中的同名字段PICTURE
。VOTE.VOTER_ID
引用。如果可以,USER.USER_ID
请使用整数*_ID
和字段。)*_NO
该物理模型将能够非常有效地查询:
- 给定用户的图片(对
PICTURE
主/集群索引的简单范围扫描)。
- 对给定图片投票(对
VOTE
主/集群索引的简单范围扫描)。根据具体情况,这实际上可能足够快,因此您不必将总和缓存在PICTURE
.
如果您需要给定用户的投票,请将VOTE
PK 更改为:{VOTER_ID, USER_ID, PICTURE_NO}
。如果您需要两者(图片投票和用户投票),请保留现有PK,但在{VOTER_ID, USER_ID, PICTURE_NO, VOTE_VALUE}
.
1在 InnoDB 中。在某些 DBMS(例如 MS SQL Server)中,集群键可能与主键不同。