【发布时间】: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