【问题标题】:What is the optimize way of getting latest date from the sql table?从 sql 表中获取最新日期的优化方法是什么?
【发布时间】:2023-03-30 20:55:01
【问题描述】:
  • 您好,我正在寻找从 SQL 中获取最新日期的最佳方法,而不是在 SQL 中使用 max(date)。

选择 max(CreatedDate) as createdDate, max(LastModifiedDate) as modifiedDate from user.order;

需要关于解决方案的建议。

感谢您的帮助,

【问题讨论】:

  • CREATE INDEX IX_LastModified ON user.order ( LastModifiedDate ); CREATE INDEX IX_Created ON user.order;dev.mysql.com/doc/refman/8.0/en/create-index.html
  • 那么理想的解决方案是使用 MAX() 函数本身。您不想使用MAX() 有什么特别的原因吗?
  • @Salvino 表格很大,像 max 这样的聚合大约需要 7 秒才能返回结果
  • @Dai 为什么只使用单一索引,而不是复合索引。有什么原因吗?
  • @AdityaVyas 复合索引在这种情况下无济于事:复合索引仅在查询使用两列 ( a, b ) 时才有用,而 b 中的数据依赖于 a - 但是在这种情况下(aCreatedDatebLastModifiedDate)这两列彼此无关,因此您需要两个单独的索引。

标签: mysql sql max aggregate


【解决方案1】:
SELECT  max(CreatedDate) as createdDate,
        max(LastModifiedDate) as modifiedDate
    from  user.order;

连同这两个索引:

INDEX(CreatedDate)
INDEX(LastModifiedDate)

非常快。 MySQL 的优化器足够聪明,可以对每个索引进行一次简单的探测。 EXPLAIN 会说“选择优化的表”。我认为这意味着它在决定如何执行查询的准备步骤中获得了所需的所有数据。

这是 MySQL 使用多个索引的极少数情况之一。而且它非常有效。

(在冷系统上,对 3M 行表执行等效查询需要 2 毫秒。此外,`SHOW SESSION STATUS LIKE 'Handler%' 确认只触及了 2 行。)

【讨论】:

    【解决方案2】:

    您有一个简单的查询,并且没有更佳的解决方案。 如果您的查询花费的时间太长,则意味着表中有大量数据。 您可以为您的表使用索引。

    索引

    索引用于快速查找具有特定列值的行。如果没有索引,MySQL 必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。

    CREATE INDEX YourIndex ON YourTable(column1[,column2,...]);
    

    【讨论】:

    • 很久以前,我在其他一些数据库中看到了这个问题。我惊喜地发现 MySQL 在这方面很聪明。
    猜你喜欢
    • 2016-08-03
    • 2015-12-07
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多