У меня есть таблица с этой схемой:
CREATE TABLE `data_realtime` (
`id` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
`timestamp` int(10) NOT NULL,
`ticker_id` smallint(5) unsigned NOT NULL,
`price` decimal(7,2) unsigned NOT NULL,
`volume` mediumint(9) unsigned NOT NULL,
`bid` decimal(7,2) unsigned DEFAULT NULL,
`bid_sz` smallint(6) unsigned DEFAULT NULL,
`ask` decimal(7,2) unsigned DEFAULT NULL,
`ask_sz` smallint(6) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ticker_timestamp` (`ticker_id`,`timestamp`) USING BTREE,
CONSTRAINT `data_realtime_ibfk_2` FOREIGN KEY (`ticker_id`) REFERENCES `tickers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=11330043 DEFAULT CHARSET=latin1
Я пытаюсь выполнить простой запрос, чтобы упорядочить данные по метке времени:
select * from data_realtime ORDER BY timestamp ASC
Это занимает 2,5 с (для ~ 4,5 млн строк, которые в конечном итоге увеличатся примерно до 12 млн строк). Но если я просто бегу
select * from data_realtime
это занимает 0,25 с
У меня есть составной индекс по метке времени (с ticker_id), который, как я думал, поможет решить эту проблему.
Что я могу сделать, чтобы улучшить производительность при заказе?
Спасибо.
EDIT: чтобы добавить к исходной проблеме, у меня есть этот запрос:
SELECT data_latest.*, data_1m.timestamp timestamp_1m, data_1m.price price_1m, data_1m.volume volume_1m FROM
(SELECT B.* FROM
(SELECT ticker_id, max(timestamp) max_timestamp FROM `data_rt` GROUP BY ticker_id)
A
LEFT JOIN
data_rt B
ON
A.ticker_id=B.ticker_id
and A.max_timestamp=B.timestamp)
data_latest
LEFT JOIN
data_rt data_1m
ON
data_latest.timestamp <= (data_1m.timestamp + (60*1) )
AND data_latest.timestamp > (data_1m.timestamp + 60*(1-0.5))
AND data_latest.timestamp>data_1m.timestamp
AND data_latest.ticker_id=data_1m.ticker_id
ORDER BY data_1m.timestamp ASC
Для набора из 1 млн строк требуется около 1,3 с. Добавление последнего ORDER BY резко увеличивает время. Если вместо этого я ЗАКАЗЫВАЮ метку времени, это займет всего 0,05 с.
Что я могу улучшить при сортировке с использованием временного столбца?