好的是这种情况(使用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,但它是如何实现的?
UPDATE
我看到有些人回复了几种方法,看起来这些都不会通过将数量限制在3000来提高性能吗?
解决方法:
对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
无论有多少记录符合标准:50或1,000,000,性能将是相同的.
如果您向查询添加ORDER BY并且没有索引,那么MysqL当然需要浏览所有记录以找出前20个.
但是,即使在这种情况下,它也不会对所有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