【发布时间】: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(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)) < 10800)改成time_created_column between,然后你应该有索引 -
<table>有多少行? -
~50,000,但事实证明,解决方案只是一个设置不当的数据库。我增加了超时计时器,并且在某些查询中达到了 250 秒。问题似乎是我们仍然在使用默认设置。缓冲池大小现在已增加以适应系统并且已正确索引。运行时间已降至 <.25>
标签: mysql sql mysql-workbench innodb