【发布时间】:2020-06-16 08:39:35
【问题描述】:
我有一张这样的桌子:
USER_RELATIONSHIP
----------------------
user_id follows_id
1 2
1 3
2 1
3 1
user_id 和 follow_id 都是指向 User 表的外键。 USER_RELATIONSHIP 表非常大,我经常检查是否存在用户关系(例如,用户 A 跟随用户 B)。
鉴于这些外键已编入索引,SQL 是否能够在 O(1) 中找到关系(给定 user_id 和 follow_id)?
如果不是,将上面的两个字段压缩为一个索引复合键,该键对 user_id 和 follow_id 进行哈希处理,并具有这样的 USER_RELATIONSHIP 表,是否更高效?
USER_RELATIONSHIP
----------------------
composite_key
298437920
219873423
918204329
902348293
【问题讨论】:
-
@nbk 您的评论与我的问题无关。
-
散列索引有一些限制,尤其是它们变大的速度非常快也见dev.mysql.com/doc/refman/5.6/en/index-btree-hash.html,我的观点是唯一的约束
-
如果您担心 FK 对性能的影响,请摆脱它们(但保留关联的
INDEX)。在大多数情况下,您的应用程序“做正确的事”,从而消除了对 FK 的需求。 (是的,是的,FK 是用来抓捕“做错事”的流氓临时 DML。)