我有一张约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
表中提取的数据(通过光标)
从range
表(通过光标)和
C#是来自reference
表的列。
所以基本上我只需要data
表中每个ID的一行,其中包含使用所有这些列计算的最大分数值。
在存储过程中,我有一个递增的计数器,并选择在运行时输出到屏幕...
在我的笔记本电脑上,计数器需要大约一分钟才能增加,所以我猜测插入一行需要花费很长时间。
根据我的计算,数据表中的780,000行大约需要541.7天。 哪个是INSANE ......
有什么建议可以加快速度吗? 或者是否有一个拥有强大服务器或可以更快运行的东西的网站?
这是我的光标声明
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;
答案 0 :(得分:1)
您看不见的光标像狗一样运行(游标非常慢),或者表reference
没有列score
上的索引。
如果是后者,那么为了解析limit 1
,由于order by score desc
光标很可爱,但应该作为最后的手段使用。想想索引计划就可以摆脱这个。
修改强>:
看过您发布的光标select
后,您正在使用笛卡尔积。所有排列。因此,包含m
行的表和带有n
行且带有笛卡尔积的表将返回m*n
行。我们还没有从任何一个表中看到你的索引(但这与交叉连接无关,笛卡尔积)