是否可以在MySQL查询中有2个限制?

时间:2009-07-29 10:34:43

标签: php mysql

好的是这种情况(使用PHP / MySQL)你从大型mysql表中获得结果, 假设您的mysql查询返回10,000个匹配结果,并且您有一个分页脚本,每页显示20个结果,您的查询可能看起来像这样

所以第1页查询

SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 0,20

所以第2页查询

SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 20,40

现在您一次抓取20个结果,但总共有10,000行符合您的搜索条件,

如何只返回10,000个结果中的3,000个,并且在查询中仍然使用LIMIT 20进行每页20个的分页?

我认为这是不可能的,但是myspace在那里以某种方式浏览页面,我知道他们不是在使用php / mysql,但它是如何实现的?

更新

我看到有些人回复了几种方法,看起来这些都不会通过将数量限制在3000来提高性能吗?

6 个答案:

答案 0 :(得分:4)

对您的PHP进行规划,以便当它发现自己准备发出以LIMIT 3000, 20或更高结尾的查询时,它就会停止并且不会发出查询。

或者我错过了什么?

<强>更新

MySQL很好地对待LIMIT条款。

除非您的查询中有SQL_CALC_FOUND_ROWS,否则只要找到足够的记录来满足您的查询,MySQL就会停止解析结果,排序等。

当你有类似的东西时:

SELECT  column 
FROM    table_name 
WHERE   userId=1 
        AND somethingelse='something else'
LIMIT 0, 20

MySQL将获取满足条件的第一个20条记录并停止。

与标准匹配的记录数无关紧要:501,000,000,效果会相同。

如果您在查询中添加了ORDER BY而没有索引,那么MySQL当然需要浏览所有记录以找出第一个20。< / p>

但是,即使在这种情况下,它也不会对所有10,000进行排序:它将具有顶级20记录的“运行窗口”,并且只有在找到包含该记录的记录时才会在此窗口中排序值大(或小)足以进入窗口。

这比排序整个无数快得多。

然而,

MySQL在管道传输recorsets方面并不好。这意味着这个查询:

SELECT  column 
FROM    (
        SELECT  column
        FROM    table_name 
        WHERE   userId=1 
                AND somethingelse='something else'
        LIMIT 3000
        )
LIMIT 0, 20

比第一个更差性能。

MySQL将获取3,000个记录,将它们缓存在临时表(或内存中)中,然后仅应用外部LIMIT

答案 1 :(得分:1)

首先,LIMIT参数是Offset和记录数,所以第二个参数应该总是20 - 你不需要增加它。

当然,如果您知道要检索的行的上限,可以将其放入运行查询的逻辑中,即检查Offset + Limit&lt; = 3000

答案 2 :(得分:1)

正如Sohnee所说,或者(根据您的要求)您可以通过SQL获取所有3000条记录,然后在php中使用array_slice来获取数组的块。

答案 3 :(得分:0)

您可以通过子查询来实现这一目标......

SELECT name FROM (
   SELECT name FROM tblname LIMIT 0, 3000
) `Results` LIMIT 20, 40

或者使用临时表,您可以在临时表中选择所有3000行,然后按临时行ID进行分页,这将是顺序的。

答案 4 :(得分:0)

您可以在php代码中将限制指定为页码(20 * p,20 * p + 2)的函数,并将页码的值限制为150.

答案 5 :(得分:0)

或者您可以使用jquery选项卡获取3000条记录,并将记录拆分为每页20条。