MySQL - 与min匹配。范围内的数字 - 使用order by和group提高连接性能

时间:2017-11-24 18:51:28

标签: mysql group-by sql-order-by

我有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列上添加单个索引会有帮助吗?如果是这样,为什么?

感谢您的帮助。

0 个答案:

没有答案