【发布时间】:2013-08-28 13:09:59
【问题描述】:
我的问题
我们有一个电子邮件引擎,它可以以块的形式(向多个用户发送相同的电子邮件:即批量通讯)或单个案例(向一个用户发送一封电子邮件:即,重置密码)向用户发送电子邮件。我们有一个管理控制台,它显示已发送电子邮件的日志。
目前,该表大约有 750,000 行。对于发送的每个 EMAIL,表中都会记录以下内容(精简到主要项目):
- 身份证
- batch_id
- user_id
- 主题
- 发送日期
- 已创建
如果发送了一批电子邮件,则该批中的所有电子邮件都将具有相同的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 的唯一记录,按记录创建日期降序排列。
我的问题是:如何以最佳方式索引这些,并以适当的方式选择字段以利用这些索引?
谢谢!
【问题讨论】:
-
请不要使用 MySQL 的
GROUP BYextension。 -
好的,请详细说明为什么?还是提出可行的解决方案?
-
我建议阅读文档。您正在此处寻找
DISTINCT结果集。 -
我没有选择
DISTINCT行,只是排除了具有相同batch_id的记录 -
然后使用
HAVING COUNT(batch_id) < 2。
标签: mysql sql indexing group-by sql-order-by