Codeigniter 选择用户电子邮件不在另一个表中执行时间太长

Posted

技术标签:

【中文标题】Codeigniter 选择用户电子邮件不在另一个表中执行时间太长【英文标题】:Codeigniter select user email NOT IN another table is taking too long to execute 【发布时间】:2021-09-08 16:24:13 【问题描述】:

我的 emails_queue 表包含超过 900k 条记录,因此查询变得很慢,无法找到该表中不存在的记录。 我正在使用 Codeigniter

这是我的查询

$key = $this->config->item('encryption_key');

        $query = $this->db
            ->select(
                "
                users.id, AES_DECRYPT(users.email, '$key') as email, 
                AES_DECRYPT(users.first_name, '$key') as first_name, 
                AES_DECRYPT(users.state, '$key') as state,
                AES_DECRYPT(users.phone_number, '$key') as phone,
                prescriptions.user_id, prescriptions.expire_date
            "
            )
            ->from('users')
            ->join('prescriptions', 'users.id = prescriptions.user_id', 'LEFT')
            ->where(
                "AES_DECRYPT(users.email, '$key') NOT IN (SELECT to_email FROM emails_queue WHERE template = 'renewal_template')",
                null,
                false
            )
            ->where(
                "users.id NOT IN (SELECT user_id FROM prescriptions GROUP BY user_id HAVING count(user_id) > 1)",
                null,
                false
            );

我怎样才能让它执行得更快?

【问题讨论】:

【参考方案1】:
NOT IN ( SELECT ... )

通常优化不佳。尝试将其变成以下之一:

WHERE NOT EXISTS ( SELECT 1 ... )

LEFT JOIN .. WHERE .. IS NULL

(如需进一步讨论,请提供生成的 SQL。)

【讨论】:

以上是关于Codeigniter 选择用户电子邮件不在另一个表中执行时间太长的主要内容,如果未能解决你的问题,请参考以下文章

更改另一个选择框值上的选择框在codeigniter中不起作用

T-SQL:如何在值列表中选择不在表中的值?

如果不在另一个表中,则仅从一个表中选择用户

Codeigniter 从另一个表插入数据并添加到输入帖子

codeigniter ajax 错误用户电子邮件检查

Codeigniter 抛出错误并且不向用户发送确认邮件