如何快速筛选出部门下某用户未读的信件数?

有三张表
t_letter :表示信件表 (60万数据)索引如下:

如何快速筛选出部门未读的信件数?

t_letter_dep_map :部门的信件的关联表 (30万数据)结构如下

如何快速筛选出部门下某用户未读的信件数?

索引如下:

如何快速筛选出部门未读的信件数?

t_read :已读的数据表(150万数据)结构如下

如何快速筛选出部门下某用户未读的信件数?

索引如下:

如何快速筛选出部门未读的信件数?

我最开始写的SQL如下:

SELECT count(distinct `t_letter`.`id`)
FROM `t_letter`
    LEFT JOIN `t_letter_dep_map` `t_l_d_m` ON `t_l_d_m`.`depable_id` = `t_letter`.`id`
WHERE `t_letter`.`site_id` = 145
    AND `del_status` = 0
    AND (`letter_dep_id` = 206
        AND `depable_type` = 9)
    AND (`t_letter`.`id` NOT IN (
            SELECT `readable_id`
            FROM `t_read`
            WHERE `user_id` = 33203
                AND `cat` = 'all'
                AND `readable_type` = 9
        )
        AND `t_letter`.`time` > 1619402413)
    AND `t_letter`.`deleted_at` IS NULL

表示筛选出分配给部门id为206的并且用户id为33203在‘all’分类下还没有读的信件总数,这条sql耗时大概为10s。
explain 信息如下:

如何快速筛选出部门未读的信件数?
我参照网上的教程,讲sql改为left join之后情况也没有太大变化,耗时也是10秒左右

SELECT count(distinct `t_letter`.`id`)
FROM `t_letter`
    LEFT JOIN `t_letter_dep_map` `t_l_d_m` ON `t_l_d_m`.`depable_id` = `t_letter`.`id`
    LEFT JOIN (select * from `t_read` where `user_id` = 33203 and `cat` = 'all' and `readable_type` = 9) as `t_r` on `t_r`.`readable_id` = `t_letter`.`id`
WHERE `t_letter`.`site_id` = 145
    AND `del_status` = 0
    AND (`letter_dep_id` = 206
        AND `depable_type` = 9)
    AND 
        `t_r`.`readable_id` is null

        AND `t_letter`.`time` > 1619402413
    AND `t_letter`.`deleted_at` IS NULL

如何快速筛选出部门未读的信件数?

但是我在删除了部门的信件关联表之后,速度就变得很快,

SELECT count(distinct `t_letter`.`id`)
FROM `t_letter`
WHERE `t_letter`.`site_id` = 145
    AND `del_status` = 0
    AND (`t_letter`.`id` NOT IN (
            SELECT `readable_id`
            FROM `t_read`
            WHERE `user_id` = 33203
                AND `cat` = 'all'
                AND `readable_type` = 9
        )
        AND `t_letter`.`time` > 1619402413)
    AND `t_letter`.`deleted_at` IS NULL

只需要

如何快速筛选出部门未读的信件数?
这么短,那如何快速筛选出部门下某用户未读的信件数?

sql
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

谢谢大家 是因为t_letter_dep_map有一个字段的类型设置错误了 类型不一致 。。

3年前 评论
讨论数量: 3

我发现主要是left join t_letter_dep_map这个表之后非常慢

3年前 评论

但是不这样做 又没办法满足需求 怎么弄呢

3年前 评论

谢谢大家 是因为t_letter_dep_map有一个字段的类型设置错误了 类型不一致 。。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!