好的是这种情况(使用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来提高性能吗?
答案 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
条记录并停止。
与标准匹配的记录数无关紧要:50
或1,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条。