【问题标题】:Optimize MIN & MAX query优化 MIN & MAX 查询
【发布时间】:2017-11-05 20:18:42
【问题描述】:

我的数据库表包含超过 1000 万条记录。我正在我已经索引的 created_date 列上编写一个包含 MIN 和 MAX 函数的查询。但是当我运行我的 select 语句时,它会花费太多时间,并且有时执行时间会结束并且没有收到任何输出。

有什么方法可以优化我的查询。我正在尝试的查询如下。

SELECT MIN(created_date) AS Min, MAX(created_date) as Max FROM network ORDER
BY id DESC LIMIT 1000000

上述查询将为您提供最近 1 000 000 行中的 MIN AND MAX,created_date

【问题讨论】:

  • 上述查询不会为您提供最新 1000000 的最小值和最大值。ORDER BY 和 LIMIT 子句在聚合发生后应用,因此是多余的。
  • @Strawberry 你能写下优化查询吗
  • 为了什么?最近 1000000 行的最大值和最小值?

标签: mysql indexing max query-optimization min


【解决方案1】:
SELECT MIN(created_date) AS Min,
       MAX(created_date) AS Max   -- Get min and max from the 1M rows
    FROM (
        SELECT created_date
            FROM network
            ORDER BY created_date desc
            LIMIT 1000000
         ) AS recent          -- Collect the latest 1M rows

这个索引会帮助一些

INDEX(created_date)

重读问题

最新日期只是MAX(created_date)。第百万个日期是`( SELECT created_date FROM network ORDER BY created_date DESC LIMIT 1000000, 1 )

所以,这是首选:

SELECT ( SELECT created_date FROM network
            ORDER BY created_date DESC LIMIT 1000000, 1 ) AS Min,
       MAX(created_date) AS Max
    FROM network;

汇总表

CREATE TABLE Dates (
    create_date DATETIME NOT NULL,
    ct INT UNSIGNED NOT NULL,
    PRIMARY KEY(ct)
) ENGINE=InnoDB;

然后,每隔一小时(或其他时间单位),计算记录数并将其存储在那里。

MIN(created_date)有点乱;这意味着通过该表求和以找到计数加起来约为 1M 的时间,并声明时间(或其他时间)是何时发生的。

另一种方法(可能更好)是捕获每 1000 行的确切 DATETIME。这意味着经常探测network,并仅存储created_date(删除ct 列)。然后这找到1M前的近似时间:

SELECT created_date
    FROM Dates
    ORDER BY created_date DESC
    LIMIT 1000, 1

(并将其用作 Min. 的子查询)

【讨论】:

  • 谢谢瑞克。但我的要求是在 0-5 秒内得到结果。目前,您发布的查询需要将近 13-20 秒
  • 如果 1M 不必完全是那个值,我可以建议一种使用可能是亚秒级的汇总表的方法。
  • 欢迎您提出建议。请让我解释一下汇总表
  • 另外 3 条建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多