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 选择用户电子邮件不在另一个表中执行时间太长的主要内容,如果未能解决你的问题,请参考以下文章