有没有比我的笔记本电脑更快地执行我的 mysql 的地方? [关闭]

Posted

技术标签:

【中文标题】有没有比我的笔记本电脑更快地执行我的 mysql 的地方? [关闭]【英文标题】:Is there a place that i execute my mysql faster than my laptop? [closed] 【发布时间】:2015-10-27 23:38:17 【问题描述】:

我有一个大约 640,000 行的表,我们称之为'reference'

另一个大约 780,000 行的表,我们称之为'data'

然后我有另一个 1 行的表,我们称这个表为 'range'。

任何表都没有索引,只有原始数据...我不知道添加索引是否会更快,因为我只是对所有行执行数学运算。

我有一个存储过程,它有一个从数据中选择的游标,范围以逐行获取数字(72 列用于执行数学运算)。 然后对于每一行作为游标运行... 我计算以下

INSERT INTO results(ID,info,score)
    SELECT ID, info,
                -ABS(_C1 - C1 )/R_C1
                -ABS(_C2 - C2 )/R_C2
                -ABS(_C3 - C3 )/R_C3
                ...
                -ABS(_C70 - C70 )/R_C70
                -ABS(_C71 - C71 )/R_C71
                -ABS(_C72 - C72 )/R_C72
            as score
        FROM reference
        ORDER BY score desc
        LIMIT 1;

在哪里

_C# 是从data 表中获取的数据(通过游标)

R_C# 是从range 表中获取的(通过游标)和

C# 是来自reference 表的列。

所以基本上我只希望data 表中的每个 ID 有一行,该表具有使用所有这些列计算的最大分值。

在存储过程中,我有一个计数器,它在运行时递增并选择输出到屏幕...

在我的笔记本电脑上,计数器增加大约需要一分钟,所以我猜插入一行需要那么长的时间。

根据我的计算,数据表中的 780,000 行大约需要 541.7 天。 这太疯狂了……

有什么建议可以加快速度吗? 或者有没有一个网站有强大的服务器或者可以运行得更快的东西?

这是我的光标声明

DECLARE cur1 CURSOR FOR SELECT 
    t.ID,t.info,t.C1,t.C2,t.C3,t.C4,t.C5,t.C6,t.C7,t.C8,t.C9,t.C10,t.C11,t.C12,t.C13,t.C14,t.C15,t.C16,t.C17,t.C18,t.C19,t.C20,t.C21,t.C22,t.C23,t.C24,t.C25,t.C26,t.C27,t.C28,t.C29,t.C30,t.C31,t.C32,t.C33,t.C34,t.C35,t.C36,t.C37,t.C38,t.C39,t.C40,t.C41,t.C42,t.C43,t.C44,t.C45,t.C46,t.C47,t.C48,t.C49,t.C50,t.C51,t.C52,t.C53,t.C54,t.C55,t.C56,t.C57,t.C58,t.C59,t.C60,t.C61,t.C62,t.C63,t.C64,t.C65,t.C66,t.C67,t.C68,t.C69,t.C70,t.C71,t.C72,
m.C1,m.C2,m.C3,m.C4,m.C5,m.C6,m.C7,m.C8,m.C9,m.C10,m.C11,m.C12,m.C13,m.C14,m.C15,m.C16,m.C17,m.C18,m.C19,m.C20,m.C21,m.C22,m.C23,m.C24,m.C25,m.C26,m.C27,m.C28,m.C29,m.C30,m.C31,m.C32,m.C33,m.C34,m.C35,m.C36,m.C37,m.C38,m.C39,m.C40,m.C41,m.C42,m.C43,m.C44,m.C45,m.C46,m.C47,m.C48,m.C49,m.C50,m.C51,m.C52,m.C53,m.C54,m.C55,m.C56,m.C57,m.C58,m.C59,m.C60,m.C61,m.C62,m.C63,m.C64,m.C65,m.C66,m.C67,m.C68,m.C69,m.C70,m.C71,m.C72,m.C72
    FROM data t,range m;

【问题讨论】:

你为什么要使用光标。我认为这是一个很好的问题(可能)。 如果单行的单次插入需要一分钟时间,那就大错特错了。听起来您正在执行某种大规模循环游标,但您没有提供足够的信息来诊断真正的问题。 我正在使用游标,因为如果我使用查询计算所有内容,它将创建 640,000 x 780,000 行数据,我认为我的计算机没有足够的空间来存储。 让我这样说。游标是通往中国的缓慢之路。使用好的索引方案,上面的第三条评论是不正确的。游标(请注意根据您提出的问题我们不知道的游标)可以轻松强制执行伪表扫描。并不是说游标必须很慢,而是它们在面对快速的守护进程解析时会飞起来,说“这是我的程序最小设置,我强加给你” 发布表模式、少量示例数据以及您希望从该数据中获得的结果。 我写得很糟糕的 SQL,当与数据一起使用时,我只会基于游标模糊地描述,我不会包含有关执行缓慢的信息。我该如何解决? 简直无法回答。至于您对可以运行它的网站的问题,您的问题的那部分在这里是题外话 - 我们不会找到或推荐网站、链接、书籍或任何其他场外信息。 【参考方案1】:

要么你看不见的光标像狗一样跑(众所周知,光标速度很慢),要么表reference 在列score 上没有索引。

如果是后者,那么为了解决limit 1,由于order by score desc而强制进行表扫描

光标很可爱,但应该作为最后的手段使用。考虑一下索引计划以摆脱这个问题。

编辑

看到您发布的光标select,您正在做一个笛卡尔积。所有排列。因此,带有m 行的表和带有n 行的带有笛卡尔积的表返回m*n 行。我们尚未从任一表中看到您的索引(但这与交叉连接、笛卡尔积无关)

【讨论】:

分数是计算出来的,它不存在,我不能索引吗?我可以吗? 理论上你可以在整个块上有一个覆盖索引。 Percona Covering Index article。 Yeehaw,没有数据页查找 顺便说一句,在我看来,您的硬件并没有什么破绽。远远不够 我想你需要问我是否有 3 行,而我有 5 行,为什么我需要做 15 行的笛卡尔积来做上面的数学运算。可悲的是,在你的情况下,它不是 15,而是 499.2 万亿 覆盖整个块的索引是什么意思?比如添加一个与所有 72 列组合的索引?

以上是关于有没有比我的笔记本电脑更快地执行我的 mysql 的地方? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的线性搜索比我在 Python3 中的二分搜索运行得更快?

如何在条件满足之前用 N 行中的一些对条件行进行子集化,比我的代码更快?

为啥我的mysql导入sql文件很慢,3000多条的insert语句都要5分钟,我朋友电脑却不超

为啥我的 python DataFrame 执行如此缓慢

如何从我的 Windows 笔记本电脑舒适地设计基于 Linux 的终端应用程序?

为啥 mySQL 查询,左连接“明显”比我的内连接快