sql 消息表状态关联 如何优化?

表结构如下图:
clipboard.png

我现在实现的未读消息为:

SELECT
    `n`.`id`
FROM
    `message` AS `m`
WHERE
    `m`.`id` NOT IN (
        SELECT
            `m_s`.`message_id`
        FROM
            `message_status` AS `m_s`
        WHERE
            `m`.`id` = `n_s`.`message_id`
    );

这种实现语句,子查询可以使用到所有,但是主查询无法使用索引,请问在 MySQL 下有什么好的优化方法吗?

注意消息跟用户是一对多关联,及一条消息,多个用户对应关系。

阅读 2.2k
2 个回答
select m.id
from message m left join (select distinct message_id from message_status) s on m.id = s.message_id 
where s.message_id is null

这个问题最好还是从设计角度解决,消息阅读后在message表上面打标记。

另外,如果用子查询,用not exists效率可能会更好一些。

你这样关联字段来判断是否已读消息不科学啊,后期数据量大起来的话很难受的

一般都是消息表有个状态字段来区分它们,比如:

—————————————————————————————————————————
| Id | 编号 |
—————————————————————————————————————————
| State | 消息状态:1 未读 2 已读 |
—————————————————————————————————————————

关联还是 messageId 与 消息表 Id 关联

但查询未读消息的话就这样

SELECT * FROM [message] WHERE State=1

岂不美哉!!!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题