2011-06-07 76 views
3

我有挑选出从大型数据库中的特定行/列的查询。假设返回的值是'53'。MYSQL SELECT优化(简单)

我需要得到:

1. The row that is 3000 rows above this value. 
2. The row that is 3000 rows below this value. 

如果练得值以上仅2000行,然后我需要添加的差别到第二查询。

Ex。

1. Find 3000th value up (turns out that only 2000 values are present) 
2. Find 4000th value down. 

这里是我是如何做到的(这是一个存储过程):

SET @s1 = CONCAT('INSERT INTO List1(STD) SELECT t1.STD FROM ',t1,' AS t1 USE INDEX(STD) WHERE t1.STD < ',inp1,' order by STD DESC limit ', inp2); 

PREPARE stmt FROM @s1; 
EXECUTE stmt; 


SET @lim = inp2+(inp2-(SELECT FOUND_ROWS())); 
SET @s2 = CONCAT('INSERT INTO List1(STD) SELECT t1.STD FROM ',t1,' AS t1 USE INDEX(STD) WHERE t1.STD >=', inp1,' order by STD ASC limit ?'); 

PREPARE stmt FROM @s2; 
EXECUTE stmt USING @lim; 

SET @minSD1 = (SELECT MIN(STD) FROM List1); 
SET @maxSD1 = (SELECT MAX(STD) FROM List1); 

这看起来太过迂回的...有没有更好的办法?

而且,是真的没有办法在存储过程中使用一个变量表名,而无需创建另一个存储过程(与PREPARE关键字)?

+0

有很多方面的在这里失去了,如被提及,但没有定义的所有变量的意义。除非您提供更多信息,否则您的问题意义不大。 – 2011-06-07 22:04:46

+0

好吧 - 让我代替摆脱不必要的部分... – 2011-06-07 22:13:37

+0

@Jim这是否现在更有意义? – 2011-06-07 22:16:43

回答

1

在SQL中,“3000行高于/低于一个给定的点”只存在于一个有序的结果集的上下文中,并且未在数据库中定义的概念。除非有一个算法流程的基础上,重点,确定什么是“n行高于/低于”给定的点,然后你被卡住实际读取行和计数,这是你的解决方案似乎有什么企图。我没有验证它是否真的实现了你想要的,但是这种方法或基于游标和计数行的方法是完成这个任务的唯一方法。

+0

嗯,好的。那就是我所想的。使用游标至少会提高内存效率?我不需要实际存储除3000以外的任何值。 – 2011-06-07 22:26:10

+0

游标可能更高效,因为您可以读取并放弃行而不存储它们。写出你想要的最简单的代码,然后决定它是否足够快。没有意义花3天时间写出“完美”的解决方案,只要一小时能够让你得到一些有用的东西,速度足够快(过早的优化被认为是邪恶的......) – 2011-06-08 16:08:45