查询优化——花费太长时间并停止服务器

2024-02-24

我的查询生成一些有关超速、上次时间和平均速度的报告。 这是我的查询:

Select 
    r1 . *, r2.name, r2.notes, r2.serial
From
    (SELECT 
        k.idgps_unit,
            MIN(k.dt) AS DT_Start,
            MIN(CASE
                WHEN k.RowNumber = 1 THEN k.Lat
            END) AS Latitude_Start,
            MIN(CASE
                WHEN k.RowNumber = 1 THEN k.Long
            END) AS Longitude_Start,
            MIN(CASE
                WHEN k.RowNumber = 1 THEN k.Speed_kmh
            END) AS Speed_Start,
            MAX(k.dt) AS dt_end,
            MIN(CASE
                WHEN k.RowNumber = MaxRowNo THEN k.Lat
            END) AS Latitude_End,
            MIN(CASE
                WHEN k.RowNumber = MaxRowNo THEN k.Long
            END) AS Longitude_End,
            MIN(CASE
                WHEN k.RowNumber = MaxRowNo THEN k.Speed_kmh
            END) AS Speed_End,
            AVG(Speed_kmh) AS Average_Speed
    FROM
        (SELECT 
        gps_unit_location . *,
            @i:=CASE
                WHEN Speed_Kmh > 80 AND @b = 0 THEN @i + 1
                ELSE @i
            END AS IntervalID,
            @r:=CASE
                WHEN Speed_Kmh > 80 AND @b = 0 THEN 1
                ELSE @r + 1
            END AS RowNumber,
            @b:=CASE
                WHEN Speed_Kmh > 80 THEN 1
                ELSE 0
            END AS IntervalCheck
    FROM
        gps_unit_location, (SELECT @i:=0) i, (SELECT @r:=0) r, (SELECT @b:=0) b
    ORDER BY dt , idgps_unit_location) k
    INNER JOIN (SELECT 
        IntervalID, MAX(RowNumber) AS MaxRowNo
    FROM
        (SELECT 
        gps_unit_location . *,
            @i:=CASE
                WHEN Speed_Kmh > 80 AND @b = 0 THEN @i + 1
                ELSE @i
            END AS IntervalID,
            @r:=CASE
                WHEN Speed_Kmh > 80 AND @b = 0 THEN 1
                ELSE @r + 1
            END AS RowNumber,
            @b:=CASE
                WHEN Speed_Kmh > 80 THEN 1
                ELSE 0
            END AS IntervalCheck
    FROM
        gps_unit_location, (SELECT @i:=0) i, (SELECT @r:=0) r, (SELECT @b:=0) b
    ORDER BY dt , idgps_unit_location) d
    WHERE
        IntervalCheck = 1
    GROUP BY IntervalID) MaxInt ON MaxInt.IntervalID = k.IntervalID
    WHERE
        k.IntervalCheck = 1
            and k.idgps_unit in (SELECT 
                idgps_unit
            FROM
                instafleet.gps_unit
            where
                id_customer = (select 
                        idcustomer
                    from
                        user
                    where
                        iduser = 14))
    GROUP BY k.IntervalID , k.idgps_unit) r1
        Inner join
    gps_unit r2 ON r1.idgps_unit = r2.idgps_unit

目前,783,723 条记录需要 3 分钟。我认为适当的索引可能会有所帮助;尽管经过一番尝试和错误,我无法弄清楚。如果您认为您可以提供帮助,并且需要一些额外的信息 - 我很乐意为您提供。

Explain Explain

Result Result


添加索引在许多情况下都有帮助,但是您有一个子查询连接另一个子查询,当前表上没有索引可以帮助您加快速度。在这里使用索引的唯一方法是创建临时表。

因此,正如马库斯指出的那样,您需要将查询分解为几个较小的查询,并将其结果存储在临时表中。您可以向它们添加索引并希望加快查询速度。将大查询分解为几个较小的查询的另一个好处是,您可以更好地分析哪个部分较慢并修复它。

您还使用了一个子查询两次,这对性能不利,因为结果未缓存。

以下是如何执行此操作的示例:

DROP TEMPORARY TABLE IF EXISTS tmp_k;
CREATE TEMPORARY TABLE tmp_k
    ENGINE=Memory
SELECT 
    gps_unit_location.*,
    @i:= IF(((Speed_Kmh > 80) AND (@b = 0)), @i + 1, @i) AS IntervalID,
    @r:= IF(((Speed_Kmh > 80) AND (@b = 0)), 1, @r + 1) AS RowNumber,
    @b:= IF((Speed_Kmh > 80), 1, 0) AS IntervalCheck
FROM
    gps_unit_location,
    (SELECT @i:=0) i, 
    (SELECT @r:=0) r, 
    (SELECT @b:=0) b
ORDER BY
    dt,
    idgps_unit_location;

ALTER TABLE tmp_k ADD INDEX (IntervalID);

DROP TEMPORARY TABLE IF EXISTS tmp_max;
CREATE TEMPORARY TABLE tmp_max
    ENGINE=Memory
SELECT 
    IntervalID, 
    MAX(RowNumber) AS MaxRowNo
FROM
    temp_k
WHERE
    IntervalCheck = 1
GROUP BY 
    IntervalID;

ALTER TABLE tmp_max ADD INDEX (IntervalID);

SELECT 
    k.idgps_unit,
    MIN(k.dt) AS DT_Start,
    MIN(IF(k.RowNumber = 1, k.Lat, NULL)) AS Latitude_Start,
    MIN(IF(k.RowNumber = 1, k.Long, NULL)) AS Longitude_Start,
    MIN(IF(k.RowNumber = 1, k.Speed_kmh, NULL) AS Speed_Start,
    MAX(k.dt) AS DT_End,
    MIN(IF(k.RowNumber = m.MaxRowNo, k.Lat, NULL)) AS Latitude_End
    MIN(IF(k.RowNumber = m.MaxRowNo, k.Long, NULL)) AS Longitude_End
    MIN(IF(k.RowNumber = m.MaxRowNo, k.Speed_kmh, NULL)) AS Speed_End,
    AVG(Speed_kmh) AS Average_Speed,
    gu.name,
    gu.notes,
    gu.serial
FROM
    tmp_k AS k
    INNER JOIN tmp_max AS m
        USING(IntervalID)
    INNER JOIN gps_unit AS gu
        USING(idgps_unit)
    INNER JOIN user AS u
    ON (gu.idcustomer = u.idcustomer)
WHERE
    (k.IntervalCheck = 1) 
     AND (u.iduser = 14)
GROUP BY 
    k.IntervalID, 
    k.idgps_unit;

DROP TEMPORARY TABLE tmp_k;
DROP TEMPORARY TABLE tmp_max;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查询优化——花费太长时间并停止服务器 的相关文章

随机推荐

  • Bootstrap - 如何向导航栏类添加徽标?

    我想在导航栏品牌内的顶部导航栏添加一个徽标 我希望它随着视口大小而缩放 所以我使用 img responsive2 类 导航栏品牌中的图像和文本似乎都换行到下一行 该页面可以在以下位置查看http digitalponddesign com
  • 熊猫数据框隐藏索引功能?

    显示 pandas DataFrame 时是否可以隐藏索引 以便只有列名出现在表的顶部 这需要适用于 ipython 笔记本中的 html 表示和to latex 函数 我正在使用它nbconvert 正如 waitingkuo 所指出的
  • WPF 控件的条件加载

    Given
  • Python os.walk 支持 Unicode/UTF-8?

    我研究过这个问题 似乎Python 2 7默认使用的是ASCII 由于库的原因我无法切换到python 3 默认Unicode coding utf 8 print u 似乎打印得很好 没有u but print list os walk
  • 在 SQL Server 中将时间转换为 24 小时时间

    我正在使用 Microsoft SQL Server 2000 需要将时间列转换为 24 小时时间 而不仅仅是上午 9 30 中午 12 30 等 我正在尝试对此列进行排序 但我相信它不起作用 因为它只是用数字而不是时间来看待事物 我认为我
  • Linux 内核模块驱动程序中 THIS_MODULE 的意义是什么?

    在Linux设备驱动程序开发中 file operations结构用途struct module owner 当我们总是用以下命令初始化它时 这个结构有什么用 THIS MODULE 什么时候可以设置这个字段NULL 该字段告诉谁是所有者s
  • Instagram ruby​​ gem - 无法到达回调 URL

    断断续续地尝试过 instagram ruby gem 一些 天 无论我做什么 当尝试创建实时 订阅 我得到https api instagram com v1 subscriptions json https api instagram
  • Jenkins git 插件,轮询某些路径

    我有一个 jenkins 工作 负责一个具有以下结构的 Maven 多模块项目 Module A Module B 桌面应用程序 common 我想仅当更改被推送到特定路径时才执行部署桌面应用程序的作业 使用 git 插件 应该可以做到这一
  • 使用 DateTime.strptime 时不考虑 Rails 夏令时

    我一直致力于解析字符串 并且有一个测试用例给我带来了问题 使用 strptime 解析日期 时间字符串时 不考虑夏令时 据我所知 这是一个错误 我找不到有关此错误的任何文档 这是 Rails 控制台中的一个测试用例 这是 ruby 1 9
  • 将带名称和不带名称的命名空间添加到 XElement

    我需要生成如下 XML
  • 使用多处理来查找网络路径

    我目前正在使用 networkx 函数 all simple paths 来查找网络 G 中给定的一组源节点和目标节点的所有路径 在更大 更密集的网络上 这个过程非常密集 我想知道是否可以使用多处理来解决这个问题 以及是否有人对如何通过创建
  • 嵌入式领域“软复位”和“硬复位”有什么区别?

    在我看来 软复位 从复位向量启动 硬重置 拉cpu的电平 硬复位当然意味着整个CPU芯片及其所有外设都被复位 造成这种情况的原因可能有很多 复位引脚被外部拉动 时钟故障 片上低电压检测 看门狗 非法指令陷阱等 软复位可能意味着返回复位向量的
  • 只要父文件夹中尚不存在任何文件,就将所有文件从“旧”文件夹移至父文件夹中

    只要父文件夹中尚不存在文件 我的代码就应将所有文件从 旧 文件夹移至父文件夹中 Folder 1 old somefiles 2 old somefiles 3 old somefiles Folder 1 somefiles old 2
  • 在elasticsearch中创建TransportClient时限制ThreadPool中的线程数

    我正在 elasticsearch 中创建一个 TransportClient 实例 下面是相同的代码 问题是我试图减少 TransportClient 启动的线程池生成的线程数 但无论我使用什么设置 我的elasticsearch总是用1
  • Delphi 按钮在 Aero 玻璃上显示白色边框

    我一直在尝试在 Delphi 2010 中使用 Aero 来找到一个好看的设计 人们看到的一个明显的用途是玻璃框架被扩展以包括屏幕底部的 确定 取消 按钮 我注意到 这在 Delphi 2010 中看起来不太正确 每个按钮周围都有一个白色边
  • 将字符串转换为 TextView

    String data tv 另外 在我的 xml 文件中 我有一个名为 tv1 的 TextView 我已经在 Activity 中投射了 textView TextView tv1 TextView findViewById R id
  • Windows 中的 msync 等效项

    Windows 中的 rsync unix 系统调用 相当于什么 我正在寻找 C C 空间中的 MSDN api 有关 msync 的更多信息 请访问http opengroup org onlinepubs 007908799 xsh m
  • 如何在 Android 的 SQLite 查询中使用 LIMIT 参数

    我正在尝试使用以下查询来获取按日期列出的最新结果 Cursor cursor mDb query DATABASE TABLE new String KEY DATE KEY REPS KEY WEIGHT null null null n
  • 从 ZIP 字符串中提取文件

    我有一个 BASE64 字符串的 zip 文件 其中包含一个 XML 文件 关于如何获取 XML 文件的内容而无需处理磁盘上的文件 有什么想法吗 我非常希望将整个过程保留在内存中 因为 XML 只有 1 5k 必须编写 zip 提取 XML
  • 查询优化——花费太长时间并停止服务器

    我的查询生成一些有关超速 上次时间和平均速度的报告 这是我的查询 Select r1 r2 name r2 notes r2 serial From SELECT k idgps unit MIN k dt AS DT Start MIN