我有2张桌子。一个包含带有时间戳,价格,ticker_id的股票信息。
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,
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=1585421 DEFAULT CHARSET=latin1
另一个包含ticker_id和name的股票信息。 (但我认为这不相关)
CREATE TABLE `tickers` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`ticker` text NOT NULL,
`ticker_name` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ticker` (`ticker`(5))
) ENGINE=InnoDB AUTO_INCREMENT=9416 DEFAULT CHARSET=latin1
我运行一个查询,获取每个股票代码的最新行(使用ticker_id)。
SELECT ticker_id, max(timestamp) max_timestamp FROM `data_realtime` GROUP BY ticker_id
我想在3分钟前得到相应的股票价格。 我这样做的原因是加入初始结果(最新价格)所有行超过3分钟;然后通过时间戳排序;然后用ticker_id对它们进行分组。
这是我的疑问:
SELECT * FROM (
SELECT
data_latest.*, data_3m.timestamp timestamp_3m, data_3m.price price_3m
FROM (
SELECT B.* FROM (
SELECT
ticker_id, max(timestamp) max_timestamp
FROM
`data_realtime`
GROUP BY ticker_id)
A
LEFT JOIN
data_realtime B
ON A.ticker_id=B.ticker_id and A.max_timestamp=B.timestamp)
data_latest
LEFT JOIN
data_realtime data_3m
ON
data_latest.timestamp <= (data_3m.timestamp + (60*3) )
AND
data_latest.timestamp>data_3m.timestamp
AND
data_latest.ticker_id=data_3m.ticker_id
ORDER BY
data_3m.timestamp ASC)
data_3m_sorted
GROUP BY ticker_id
正如您在“创建表”中看到的那样,“id”上存在主键,“timestamp”和“ticker”上存在组合唯一键。
查询需要2秒多一点才能在表中运行大约1.5M行。我可以做些什么来改善查询性能。
在ticker_id和timestamp列上添加单个索引会有帮助吗?如果是这样,为什么?
感谢您的帮助。