【问题标题】:MySQL Query Optimization?MySQL 查询优化?
【发布时间】:2016-01-25 18:51:13
【问题描述】:

所以我有一个DB,有~500 万行,我正在尝试优化加载时间。我的数据库有尽可能优化的列和索引,所以我假设它是查询。此查询在具有 ~500 万行 的表上运行并返回其中 40 行,但需要 101 秒。

如果我删除 timezone 转换,则相同的查询需要 0.0015 秒,但由于时区差异,返回的结果略有不同。我怎样才能优化以更快地获得正确的结果?

SELECT *, date(CONVERT_TZ(eventDate, "US/Eastern", "America/New_York")) as `timezoneDate`
FROM `transactions`
WHERE `isValid` = X
AND `storeID` = X
AND date(CONVERT_TZ(eventDate, "US/Eastern", "America/New_York")) >= '2014-11-19'
AND date(CONVERT_TZ(eventDate, "US/Eastern", "America/New_York")) <= '2014-11-25'
ORDER BY `eventDate` 

另外,如果之前不清楚,我要转换的第二个时区会根据用户而变化,所以现在它的 America/New_York 与 US/Eastern 相同,但它会发生变化。

【问题讨论】:

  • 你不能。您正在使用派生值,这意味着没有索引。例如where foo=1 很好,可以使用任何适用的索引。 where somefunc(foo)=1 不是,因为 somefunc 的结果是未索引的。
  • 是否会更快,例如,删除时区限制,在某一天使用 + 和 - 获取结果,然后运行 ​​PHP 循环来计算并删除额外的结果?我认为在 10-12 额外的行上运行时区转换并删除一些会快于 100 秒。
  • 如果返回的数字足够小,也许在不调用 CONVERT_TZ 和稍宽的网络(可能是 2014-11-18 到 2014-11-26)的情况下运行它,然后再缩小它。呃,我打字的时候你遇到了,抱歉。
  • 仅在选择中的时区转换查询是否也很慢?如何在 0.0015 秒内返回行?
  • 反转逻辑。对您的固定值进行 tz/time 转换,例如eventdate = date(convert_tz('2014-11-19')) 类型的东西。那么你可以使用索引。因为索引字段被“原始”使用。

标签: php mysql sql database optimization


【解决方案1】:

我最终做的是 JRD、TZHX 和 MarcB 的 cmets 的混合。我最终做了一个没有时区的选择,但我的选择半径增加了正负一天。这使我的大约 500 万行减少到大约 50 行,但是由于它比我想要的略多,所以我运行了原始查询,但只针对第一个选择返回的 50 个结果。这导致返回所有完全相同的数据,但只用了 0.11 秒。非常感谢大家!

【讨论】:

    【解决方案2】:

    推迟日期过滤怎么样:

    select * from (     
    SELECT *, date(CONVERT_TZ(eventDate, "US/Eastern", "America/New_York")) as `timezoneDate`
        FROM `transactions`
        WHERE `isValid` = X
        AND `storeID` = X
    )
    where timezoneDate between '2014-11-19' and '2014-11-25'
    ORDER BY timezoneDate
    

    【讨论】:

    • 无法按说明工作,因为 WHERE 需要表达式,而不是别名。
    • 说什么?我不跟。 select alias from (select 'text' as alias) q where alias = 'text'; 完全有效。
    【解决方案3】:

    不知道你的数据,你应该确定你在transactions(storeId, isvalid, eventdate)上有一个索引。

    如果这无助于提高性能,那么您的选择就会更加有限。一是为纽约定义一个“规范”的活动时间。这需要一个触发器来进行转换。

    第二个选项类似,但它涉及将时间差保留为单独的列。

    我建议对常量进行时区转换,但两个时区应该相同。我不知道他们为什么会返回不同的结果。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2011-07-07
      • 2018-12-21
      • 2010-12-15
      • 2011-11-04
      • 2023-03-19
      相关资源
      最近更新 更多