MYSQL SELECT优化(简单)

时间:2011-06-07 21:53:58

标签: mysql sql

我有一个查询从大型数据库中选择一个特定的行/列。让我们说返回的值是'53。'

我需要得到:

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

如果结果只有2000行以上,那么我需要将差异添加到第二个查询中。

实施例。

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关键字),是否真的无法在存储过程中使用变量表名?

1 个答案:

答案 0 :(得分:1)

在SQL中,&#34; 3000行的概念高于/低于给定点&#34;仅存在于有序结果集的上下文中,并且未在数据库中定义。除非有基于密钥的算法过程,否则确定什么是&#34; n行/高于/低于&#34;一个给定的点,那么你实际上是在阅读行和计数,这是你的解决方案似乎尝试。我没有验证它实际上是否符合您的要求,但是这种方法或基于游标和计数行的方法是完成此任务的唯一方法。