【问题标题】:MySQL queries are timing out on MySQL WorkbenchMySQL 查询在 MySQL Workbench 上超时
【发布时间】:2018-07-31 13:13:29
【问题描述】:

InnoDB MySQL 5.7

大家好,正如标题所述,我一直在使用的查询在 MySQL Workbench 上超时。我正在使用与一周前相同的查询,但不是 0.5 秒,而是 15-25 秒。示例如下:

SELECT * FROM <table> ORDER BY <time column> DESC;

另一方面,我正在使用一些相当长的 MySQL 查询来从数据中收集一些粗略的统计信息,我预计这些需要更长的时间,但我不确定是否存在更好的解决方法。我还应该提到,我目前只有SELECT/SHOW 权限。这是超时的更长查询:

SELECT DATE(<time_sent_column>) as Update_Date, 
ABS(AVG(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) AS AVG_Latency,
AVG((SELECT 
    ABS(AVG(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) 
    FROM <table_name> 
    WHERE ((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>) < 10800))))
AS Total_Average_Latency,
STDDEV(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)) as STDDEV_Latency,
AVG((SELECT 
    ABS(STDDEV(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) 
    FROM <table_name> 
    WHERE ((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>) < 10800))))
AS Total_STDDEV_Latency,
VAR_SAMP(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(create_date)) as Variance_Latency,
AVG((SELECT 
    ABS(VAR_SAMP(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) 
    FROM <table_name>
    WHERE ((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>) < 10800))))
AS Average_Variance_Latency,
MIN(ABS((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)))) AS Min_Latency,
MAX(ABS((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)))) AS Max_Latency
FROM <table_name>
WHERE ((ABS(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)) < 10800) AND created_at > '2018-05-01')
GROUP BY DATE(<time_created_column>)
ORDER BY DATE(<time_created_column>) DESC;

我可以分解所有这些,但是如果可能的话,我希望在查询之后将它们放在一个表中。我对 MySQL 还是很陌生,所以我不确定是否我可以使用JOINs 或只有SELECT/SHOW 权限的任何东西..

数据库的连接率为 50%,流量最小,密钥效率为 98.7%,InnoDB 缓冲区使用率为 87.5%,每秒 0 次读取/写入。任何建议都会很棒!谢谢!

【问题讨论】:

  • 你跑了很长时间,因为你在你的子查询中扫描了整个表。
  • 如何将其限制为仅计算的特定数据点?我实际上不知道有任何其他方法可以做到这一点。我希望一些结果显示每天的结果,但随后一些结果(例如“Average_Variance_Latency”)显示一个结果,即整个数据的乘积设置..我已经将每日延迟值和标准偏差/方差分成单独的查询,但是即使我只查询总平均延迟,我也会在 30 秒时超时..
  • 你有created_at的索引吗?你也应该把这个((ABS(UNIX_TIMESTAMP(&lt;time_created_column&gt;) - UNIX_TIMESTAMP(&lt;time_sent_column&gt;)) &lt; 10800)改成time_created_column between,然后你应该有索引
  • &lt;table&gt; 有多少行?
  • ~50,000,但事实证明,解决方案只是一个设置不当的数据库。我增加了超时计时器,并且在某些查询中达到了 250 秒。问题似乎是我们仍然在使用默认设置。缓冲池大小现在已增加以适应系统并且已正确索引。运行时间已降至 <.25>

标签: mysql sql mysql-workbench innodb


【解决方案1】:

(在下面,我假设time_created 小于time_sent;如果不是给定的,请调整代码。)

我会开始

CREATE TEMPORARY TABLE t
    SELECT DATE(time_sent)    AS Update_Date,
           DATE(time_created) AS Created_Date,
           UNIX_TIMESTAMP(time_sent) - UNIX_TIMESTAMP(time_created)) AS Latency
        FROM table_name
        WHERE UNIX_TIMESTAMP(time_sent) - UNIX_TIMESTAMP(time_created)) < 10800
          AND created_at > '2018-05-01';

然后从该临时表构建查询。下一个查询将需要 很多 次击键。而且它不需要任何子查询。

(我认为create_date 是错字?)

(也许你想要&gt;= 中的created_at &gt; '2018-05-01';?)

请注意,&lt; 10800 的测试可能在除WHERE 之外的所有表达式中都是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2013-05-28
    相关资源
    最近更新 更多