我有一个简单的架构,用户可以互相发送消息。
id
sender_id
receiver_id
message
created_at
如果我想在两个用户之间检索消息(例如id:3和id:7),我将不得不使用这样的查询:
SELECT * FROM messages
WHERE (sender_id = 3 AND receiver_id = 7) OR (sender_id = 7 AND receiver_id = 3)
ORDER BY created_at
LIMIT 20
我会有复合索引:sender_id,receiver_id
如果我创建了一个名为“signature”的额外列,例如,我将按照大小以红色分隔的顺序存储发送方和接收方的两个ID。例如:3-7,或2356-4566,123-435等。并且只有索引的varchar字段。查询在理论上会更快吗?如果我这样检索它:
SELECT * FROM messages
WHERE signature = '3-7'
ORDER BY created_at
LIMIT 20
答案 0 :(得分:1)
SELECT * FROM messages
WHERE sender_id IN (3,7)
AND receiver_id IN (3,7)
AND receiver_id <> sender_id
ORDER BY created_at
LIMIT 20
;
恕我直言有可能(稍微)更快。