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

Mysql 在使用GROUP BY和ORDER BY时,如何正确索引选择多个字段的查询?,mysql,sql,indexing,group-by,sql-order-by,Mysql,Sql,Indexing,Group By,Sql Order By,我的问题 我们有一个电子邮件引擎,它可以向用户发送分块的电子邮件(向许多用户发送同一封电子邮件:即批量时事通讯)或单独发送电子邮件(向一个用户发送一封电子邮件:即重设密码)。我们有一个管理控制台,显示已发送电子邮件的日志 现在,这个表大约有750000行。对于发送的每封电子邮件,表中都会记录以下内容(精简为主要项目): 身份证 批次号 用户id 主题 发送日期 创造 如果发送了批处理电子邮件,则该批中的所有电子邮件将具有相同的批处理id。当管理员浏览日志控制台时,我们不希望在表结果中显示一批

我的问题

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

现在,这个表大约有750000行。对于发送的每封电子邮件,表中都会记录以下内容(精简为主要项目):

  • 身份证
  • 批次号
  • 用户id
  • 主题
  • 发送日期
  • 创造
如果发送了批处理电子邮件,则该批中的所有电子邮件将具有相同的
批处理id
。当管理员浏览日志控制台时,我们不希望在表结果中显示一批邮件中的所有电子邮件-只是一封唯一的邮件。所以我们这样做了:

SELECT id, batch_id, user_id, subject, send_date, created FROM `emails` 
GROUP BY batch_id
ORDER BY created DESC
limit 10
这是可行的,但速度很慢。这是我们对查询的解释结果:

+----+-------------+-------------+-------+---------------+----------+---------+------+------+---------------------------------+
| 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)
我们的目标

为批处理id选择唯一的记录,按记录创建日期降序快速排序

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


谢谢大家!

这里有一个想法。在
电子邮件(已创建,batchid)
上创建一个索引,在
电子邮件(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。好的,请详细说明为什么?或者提出一个可行的解决方案?我建议阅读文档。你在这里寻找一个
DISTINCT
结果集。但是我没有选择
DISTINCT
行,只是排除具有相同
batch\u id
的记录,然后使用
HAVING COUNT(batch\u id)<2
。这是一个很好的解决方案,但子选择中的限制正在对未分组的“重复”记录调用。所以,如果我有一封批量发送的邮件,说有50人,当我选择时,它只会返回1条记录,而不是我想要的10条不同的记录expect@BarryChapman . . . 子查询应该使用第一个索引来查找最佳批次。第二个索引应用于联接。使用减少的集合,查询应该运行得更快。我能够修改此集合以正确解决我的问题,感谢您的帮助Gordon!