我有以下两张表
CREATE TABLE IF NOT EXISTS `events` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
CREATE TABLE IF NOT EXISTS `events_dates` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`event_id` bigint(20) NOT NULL,
`date` date NOT NULL,
`start_time` time NOT NULL,
`end_time` time NOT NULL,
PRIMARY KEY (`id`),
KEY `event_id` (`event_id`),
KEY `date` (`event_id`)
) ENGINE=MyISAM;
链接在哪里 event_id
我想要的是检索所有唯一事件记录,它们各自的事件日期按一定时期内升序的最小日期排序
基本上,以下查询正是我想要的
SELECT Event.id, Event.title, EventDate.date, EventDate.start_time, EventDate.end_time
FROM
events AS Event
JOIN
com_events_dates AS EventDate
ON (Event.id = EventDate.event_id AND EventDate.date = (
SELECT MIN(MinEventDate.date) FROM events_dates AS MinEventDate
WHERE MinEventDate.event_id = Event.id AND MinEventDate.date >= CURDATE() # AND `MinEventDate`.`date` < '2013-02-27'
)
)
WHERE
EventDate.date >= CURDATE() # AND `EventDate`.`date` < '2013-02-27'
ORDER BY EventDate.date ASC , EventDate.start_time ASC , EventDate.end_time DESC
LIMIT 20
当我想使用 group by 和其他子查询时,此查询是多次尝试进一步改善最初的缓慢时间(1.5 秒)的结果。它是迄今为止最快的,但考虑到总共有 1400 条事件记录和 10000 条事件记录,查询需要 400 多毫秒的时间来处理,我也基于此运行计数(用于分页目的),这需要大量时间好。奇怪的是,在主 where 子句中省略 EventDate 条件会导致它甚至更高 1s+。
我可以做些什么来改进这个或表结构的不同方法吗?