【问题标题】:Theoretically would this be faster?理论上这会更快吗?
【发布时间】:2012-01-23 01:45:39
【问题描述】:

我有一个简单的模式,用户可以在其中互相发送消息。

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

例如,如果我创建了一个名为“签名”的额外列,我将在其中存储发送者和接收者的两个 ID,按大小顺序用破折号分隔。例如:3-7 或 2356-4566、123-435 等。并且仅索引该 varchar 字段。理论上查询会更快吗?如果我这样检索它:

SELECT * FROM messages 
WHERE signature = '3-7' 
ORDER BY created_at
LIMIT 20

【问题讨论】:

  • 我认为字符串比较会慢得多。
  • 丹尼尔怎么说。如果列被正确索引,数据库应该已经优化了操作的废话。
  • 书签...很好奇答案:)
  • 为什么不直接测试呢?我怀疑如果事物被正确索引,它会更快或更慢,尽管可能会有基于数字和字符串索引的内部优化。
  • 你永远不会启用多个用户之间的通信?一个用户向另外两个用户发送消息?从来没有?

标签: mysql


【解决方案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
    ;

恕我直言,很有可能(略微)更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多