【发布时间】:2013-02-28 19:55:45
【问题描述】:
我有以下两张表
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+。
我可以做些什么来改进这个或表结构的不同方法?
【问题讨论】:
-
没有order by子句的情况如何?
-
如果没有订单,它的执行速度会快很多,但我真的需要这样排序。
标签: mysql database optimization