mysql - 从最近 3 个访问日期(最后、上一个、之前)中选择数据 - 查询性能
问题描述
我正在尝试返回最近 3 次访问商店的 GPS 坐标。当前访问 上一次访问 在此之前访问。
挑战在于有 15,000 多家商店,每家商店都会在不同的日期(一年内)光顾。
就重新调整最后两次访问(当前和上一次)而言,我只写了我的查询,并且我已经面临着查询永远运行的效率问题。
我的查询返回了正确的数据集,但是由于运行时间非常长(几个小时),因此效率大大降低。
SELECT
MAX(ActionDate) 'VisitDate'
, Store 'Store'
, Route 'Route'
, GPS 'GPS'
FROM
sys_data.mod_visit AA
WHERE
ActionDate = (SELECT
MAX(ActionDate) FROM sys_data.mod_visit MX
WHERE
ActionDate < (SELECT MAX(ActionDate) FROM sys_data.mod_visit WHERE Store = MX.Store)
AND MX.Store = AA.Store
GROUP BY
Store)
AND ActionDate < CURDATE()
AND YEAR(ActionDate) = YEAR(CURDATE())
store 和 actiondate 列都被索引。
我需要找到一种方法来更有效地运行此选择,以便我可以每天使用查询。
解决方案
The action date if is = ( subquery ) don't need AND ActionDate < CURDATE() (alreday use in subquery)
and istead of a where subquery you could try an inner join
SELECT
MAX(ActionDate) 'VisitDate'
, Store 'Store'
, Route 'Route'
, GPS 'GPS'
FROM sys_data.mod_visit AA
INNER JOIN (
SELECT Store, MAX(ActionDate) max_date
FROM sys_data.mod_visit
WHERE ActionDate < CURDATE()
GROUP BY Store
) MX on MX.max_date = AA.ActionDate
AND MX.store = AA.store
WHERE YEAR(ActionDate) = YEAR(CURDATE())
anyway be sure you have proper composite index on
table sys_data.mod_visit columns (store , ActionDate)
推荐阅读
- javascript - 为什么当我使用 vis-network.js 动态添加边时,图形会消失?
- python - 如何获得 tf-idf 分类器的最佳功能?
- google-cloud-platform - 如果在作业运行期间被删除,GCloud Dataflow 会重新创建 BigQuery 表
- java - Android Studio 向导未显示
- firebase - 回到协程内的主线程?
- android - 为什么新的 Firebase Crashlytics(无 Fabric)无法在 Android 中运行?
- vue-component - 如何在 WebStorm 项目中包含 Vuetify
- azure-logic-apps - Azure 逻辑应用 string.format() 等效函数
- python - 添加/删除相邻的多个图像后,如何使用 QPixmaps 调整 QLabels 的大小?
- lambda - 将 F# 函数转换为表达式
>