[英]MySQL Query Optimization?
所以我有一个大约有500万行的DB
,我正在尝试优化加载时间。 我的数据库已经根据我的想法进行了优化的列和索引,所以我假设它的查询。 此查询在一个包含约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相同,但它会发生变化。
我最终做的是混合了JRD,TZHX和MarcB的评论。 我最终做了一个没有时区的选择,但是增加了我的选择半径加减一天。 这使得我的约500万行减少到大约50,但是因为它比我想要的稍微多一点,然后我运行原始查询,但只对第一个选择返回的50个结果。 这导致返回所有完全相同的数据,但仅在0.11秒内。 非常感谢你们!
如何推迟日期过滤:
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
不知道您的数据,您应该确保您有关于transactions(storeId, isvalid, eventdate)
的索引transactions(storeId, isvalid, eventdate)
。
如果这对性能没有帮助,那么您的选择会受到更多限制。 一个是为纽约定义一个“规范”的活动时间。 这需要触发器来进行转换。
第二种选择类似,但它涉及将时差保持为单独的列。
我建议对常数进行时区转换,但两个时区应该相同。 我不知道为什么他们会返回不同的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.