mysql - 优化mysql最新时间戳查询

标签 mysql sqlalchemy query-optimization greatest-n-per-group database-optimization

为了仅获取具有最新时间戳的数据,我使用此答案中的 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)

最佳答案

您正在使用所谓的依赖子查询。这些查询有时效率非常低。

您可以使用此子查询来检索每个 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 - 优化mysql最新时间戳查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50298166/

相关文章:

php - var_dump 显示数据,但 echo 说未定义索引 - 不知所措

php - 使用 php/html 显示的 mysql blob 图像

grails - 如何优化Grails中的select属性?

sql - 为不同的查询在单个表上添加多个索引

mysql - 优化嵌套语句

php - 将两列合并为一列

mysql - SQL 和带有别名的 LIKE

python - sqlalchemy 关联代理的 json 序列化

python - SQL炼金术 : eager loading relationships of relationships of relationship

python - SQLAlchemy 对一个类的多个身份进行多态