gpt4 book ai didi

mysql - 使用 GROUP BY 和 ORDER BY 时,如何正确索引选择多个字段的查询?

转载 作者:行者123 更新时间:2023-11-29 03:04:09 25 4
gpt4 key购买 nike

我的问题

我们有一个电子邮件引擎,它可以分块(向许多用户发送同一封电子邮件:即批量简报)或单例(向一个用户发送一封电子邮件:即重置密码)发送电子邮件。我们有一个管理控制台,显示已发送的电子邮件的日志。

目前,该表大约有 750,000 行。对于发送的每个电子邮件,表中都会记录以下内容(缩减为主要项目):

  • 编号
  • 批号
  • 用户编号
  • 主题
  • 发送日期
  • 创建

如果发送了一批电子邮件,则该批处理中的所有电子邮件都将具有相同的 batch_id。当管理员浏览日志控制台时,我们不想在表结果中显示一批中的所有电子邮件 - 只是一个唯一的电子邮件。所以我们这样做了:

SELECT id, batch_id, user_id, subject, send_date, created FROM `emails` 
GROUP BY batch_id
ORDER BY created DESC
limit 10

这行得通,但速度很慢。这是我们对查询进行 EXPLAIN 的结果:

+----+-------------+-------------+-------+---------------+----------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+----------+---------+------+------+---------------------------------+
| 1 | SIMPLE | emails_logs | index | NULL | batch_id | 17 | NULL | 2522 | Using temporary; Using filesort |
+----+-------------+-------------+-------+---------------+----------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)

我们的目标

batch_id 选择唯一记录,按记录创建日期快速降序排列。

我的问题是:如何以最佳方式对这些进行索引,并以适当的方式选择字段以利用这些索引?

谢谢!

最佳答案

这是一个想法。在 emails(created, batchid) 上创建一个索引,在 emails(batchid) 上创建另一个索引。现在做:

select e.id, e.batch_id, e.user_id, e.subject, e.send_date, e.created
from (select batchid, created
from emails
order by created desc
limit 10
) e10 join
emails e
on e.batchid = e10.batchid
group by e.batchid
order by created desc;

想法是在进行聚合和排序之前减少您正在处理的集合。

听起来您的数据如果更加规范化会更好。一张表应该有批处理信息,包括发件人和创建日期。另一个应该有

关于mysql - 使用 GROUP BY 和 ORDER BY 时,如何正确索引选择多个字段的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18488895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com