使用计算的 where 子句的 MySQL 查询性能

标签 mysql performance

使用MySQL,1M记录表,存在索引“some_timestamp”。

WHERE 子句使用计算,以便可以对不同时间段的记录进行计数。

需要很长时间才能执行。

有更好、更快的方法吗???

这是当前代码:

set @now = now();

(SELECT 
    "45 Days" as "interval", count(*) as "thecount"
    FROM blah.yada
    where TIMESTAMPDIFF(day,some_timestamp,@now) <= 45
        )

UNION
(SELECT 
    "90 Days" as "interval", count(*) as "thecount"
    FROM blah.yada
    where TIMESTAMPDIFF(day,some_timestamp,@now) > 45 and TIMESTAMPDIFF(day,event_timestamp,@now) <=90
        )

UNION
(SELECT 
    "the rest" as "interval", count(*) as "thecount"
    FROM blah.yada
    where TIMESTAMPDIFF(day,some_timestamp,@now) > 90 
        )

最佳答案

在这种情况下,只需稍微修改一下你的逻辑就可以创造奇迹。

TIMESTAMPDIFF(day,some_timestamp,@now) <= 45

可以改为

some_timestamp >= @now - INTERVAL 45 DAY

等等与其余的比较。通过将计算移出字段,可以使用索引。

<小时/>

此外,您也不需要多个查询和 UNION。

SELECT CASE WHEN some_timestamp >= @now - INTERVAL 45 DAY THEN "45 Days"
            WHEN some_timestamp >= @now - INTERVAL 90 DAY THEN "90 Days"
            ELSE "the rest"
       END AS `interval`
     , COUNT(*) AS `theCount`
FROM blah.yada
GROUP BY `interval`
;

关于使用计算的 where 子句的 MySQL 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38153174/

相关文章:

windows - 分析 .exe/.dll (Windows PE) 文件中的代码膨胀

MySQL:如何在 MySQL 表上设置行或字节大小限制?

PHP random_bytes 返回不可读的字符

MySQL跨4张表select数据(多条件)

java - lambda 性能的差异?

performance - HubConnection 的 SignalR 性能问题(服务器中有很多线程,交付之间的延迟很长)

mysql - 使用相同属性名称对 SELECT 请求进行分组

php - 将 HTML 页面保存到 MySQL 数据库,然后将代码插入该 HTML 并再次提供服务

c++ - "high involuntary context"开关是什么意思?

database - MySQL数据库表结构效率建议