2 таблицы по-прежнему очень малы по сравнению с тем, как они будут в будущем. Уже при проведении тестов по некоторым регулярным запросам возникают проблемы с производительностью.(MySQL) Наибольшее количество По группам Внутреннее соединение, проблемы с производительностью
Может ли кто-нибудь просветить меня по лучшей структуре таблицы или запросу?
====
Таблица 1: tv_show (в настоящее время 117 строк)
Таблица 2: tv_episodes (в настоящее время 43000 строк).
tv_show содержит идентификатор, который мы называем t_id на tv_episodes.
tv_episodes содержит этот t_id и поле называется episodes_num.
каждый эпизод имеет эпизод номер и сезона номер, episodes_num является общее количество эпизодов, независимо от сезона.
, например: все сезоны 10 эпизодов: Сезон 2 эпизод 1 = episodes_num:
Теперь для запроса: Я хочу, чтобы для каждых ТВ показывают последние episodes_num.
SELECT tv.*,ep.* FROM tv_show tv
INNER JOIN tv_episodes ep ON (tv.id = ep.t_id)
LEFT OUTER JOIN tv_episodes ep2
ON (tv.id = ep2.t_id AND ep.episode_num < ep2.episode_num)
WHERE ep2.t_id is NULL
Это работает, но дает серверу очень трудно (запрос выше 10 секунд!)
Пожалуйста, помогите.
Edit: MySQL версии: * 5.1.47
Update: Спасибо за др решений, это тот, который является самым быстрым.
SELECT tv_episodes.* ,tv_show.*
FROM tv_episodes
INNER JOIN
(
SELECT t_id, MAX(episode_num) AS episode_num
FROM tv_episodes
GROUP BY t_id
) max_eps
ON tv_episodes.t_id = max_eps.t_id AND tv_episodes.episode_num = max_eps.episode_num
INNER JOIN
tv_show ON tv_show.id=tv_episodes.t_id
CREATE TABLE `tv_show` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`specification` varchar(50) NOT NULL,
`year` int(4) NOT NULL,
`status` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `specification` (`specification`),
KEY `year` (`year`),
KEY `status` (`status`)
) ENGINE=MyISAM AUTO_INCREMENT=118 DEFAULT CHARSET=latin1
CREATE TABLE `tv_episodes` (
`id` int(255) NOT NULL AUTO_INCREMENT COMMENT 'e_id',
`t_id` int(200) NOT NULL,
`season` int(2) NOT NULL,
`episode` int(4) NOT NULL,
`episode_num` int(10) NOT NULL,
`airing` date NOT NULL,
`online` enum('1','2') NOT NULL COMMENT '1=yes 2=no',
`added` int(15) NOT NULL,
`title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `t_id` (`t_id`),
KEY `season` (`season`),
KEY `episode` (`episode`),
KEY `season_num` (`episode_num`),
KEY `airing` (`airing`),
KEY `added` (`added`)
) ENGINE=MyISAM AUTO_INCREMENT=43420 DEFAULT CHARSET=latin1
Это только начало: сделать его более понятным. В объединениях будет добавлено больше таблиц, называемых tv_show_info, tv_plots, tv_genres. Мне нужен список последних телевизионных эпизодов с ТВ-шоу name + info. это цель. Ваш последний запрос дал почти такое же время выполнения, как и мое .. спасибо за все ваши данные! –
Большое спасибо! это последний запрос, который я искал ... Время запроса - это хорошо, и он получает результаты. –