次の2つのテーブルがあります
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 条件を省略すると、これはさらに 1 秒以上高くなります。
これを改善するためにできること、またはテーブル構造での別のアプローチはありますか?