优化最新的时间戳查询 mysql
optimize latest timestamp query mysql
为了仅获取具有最新时间戳的数据,我使用来自此答案的 mysql 查询:
我的查询如下:
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)
market 具有以下架构:(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)
您正在使用所谓的 依赖子查询。 这些有时效率很低,因为查询规划器会为外部查询中的每个值重复它们 (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/
您正在使用所谓的 依赖子查询。 这些有时可能非常低效。
您可以使用此子查询检索每个 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
这也应该利用您的主键。
为了仅获取具有最新时间戳的数据,我使用来自此答案的 mysql 查询:
我的查询如下:
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)
market 具有以下架构:(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)
您正在使用所谓的 依赖子查询。 这些有时效率很低,因为查询规划器会为外部查询中的每个值重复它们 (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/
您正在使用所谓的 依赖子查询。 这些有时可能非常低效。
您可以使用此子查询检索每个 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
这也应该利用您的主键。