我有一个会议表,每个会议都有一个开始和结束时间,表示为一个整数 Unix 时间戳,以及参加这次会议的一群人。一旦他们当天的所有会议结束,我需要向每一组人发送通知。为此,我需要找到(天,组)的每个组合的最后一次会议。我已经根据我的情况调整了这个答案,它有效:
SELECT MAX(`starts_at`), `id`, `group_id`, DATE(FROM_UNIXTIME(`starts_at`)) `day`
FROM `meeting`
GROUP BY `day`, `group_id`;
但是,尽管尝试了不同的索引组合,但我似乎找不到一个可以使该查询不执行全表扫描的组合。结果EXPLAIN
总是如下:
+------+-------------+---------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | SIMPLE | meeting | ALL | NULL | NULL | NULL | NULL | 16 | Using temporary; Using filesort |
+------+-------------+---------+------+---------------+------+---------+------+------+---------------------------------+
我的表是这样定义的:
CREATE TABLE `meeting` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL,
`starts_at` int(11) NOT NULL,
`ends_at` int(11) NOT NULL,
... other fields ...,
PRIMARY KEY (`id`),
CONSTRAINT `meeting_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`),
)
我在这里需要什么索引组合和什么查询?我看到的一个解决方案是创建一个索引列来存储事件的日期,可能是某种序数,虽然这是一个选项,但我希望尽可能避免它,以免在单个中包含冗余值排。