优化最新时间戳查询mysql
Posted
技术标签:
【中文标题】优化最新时间戳查询mysql【英文标题】:optimize latest timestamp query mysql 【发布时间】:2018-10-22 05:10:54 【问题描述】:要仅获取具有最新时间戳的数据,我使用此答案中的 mysql 查询:
fetch-the-row-which-has-the-max-value- for-a-column
我的查询如下:
SELECT stock_id,timestamp,price FROM market m1
WHERE timestamp =
(SELECT MAX(timestamp) FROM market m2 WHERE m1.stock_id = m2.stock_id)
但执行需要 10 分钟。
优化它的不同选项是什么? (mysql)
市场有以下架构:(sqlalchemy)
class Market(db.Model):
stock_id=db.Column(db.Integer,db.ForeignKey('stock.id'),primary_key=True)
timestamp=db.Column(db.Integer,primary_key=True)
price=db.Column(db.Float)
【问题讨论】:
更高效的 groupwise-max 方法:mysql.rjweb.org/doc.php/groupwise_max 【参考方案1】:您正在使用所谓的依赖子查询。这些有时效率非常低。
您可以使用此子查询来检索每个 stock_id 值的最大时间戳。
SELECT MAX(timestamp) timestamp, stock_id
FROM market
GROUP BY stock_id
你的复合主键应该会很快,因为 MySQL 会满足 a "loose index scan" to 的要求。
那么你可以把它当做子查询,如下:
SELECT m.stock_id, m.timestamp, m.price
FROM market m
JOIN (
SELECT MAX(timestamp) timestamp, stock_id
FROM market
GROUP BY stock_id
) maxt on m.stock_id = maxt.stock_id AND m.timestamp = maxt.timestamp
这也应该利用您的主键。
【讨论】:
【参考方案2】:您正在使用所谓的依赖子查询。这些有时可能非常低效,因为查询规划器会为外部查询中的每个值重复它们(在您的情况下为m1.stock_id
)。
您可以使用此子查询来检索每个 stock_id 值的最大时间戳。
SELECT MAX(timestamp) timestamp, stock_id
FROM market
GROUP BY stock_id
你的复合主键应该会很快,因为 MySQL 会做 a "loose index scan" 来满足它。
那么就可以将其作为子查询使用,如下:
SELECT m.stock_id, m.timestamp, m.price
FROM market m
JOIN (
SELECT MAX(timestamp) timestamp, stock_id
FROM market
GROUP BY stock_id
) maxt on m.stock_id = maxt.stock_id AND m.timestamp = maxt.timestamp
这也应该利用您的主键。 https://use-the-index-luke.com/
【讨论】:
以上是关于优化最新时间戳查询mysql的主要内容,如果未能解决你的问题,请参考以下文章