好的是这种情况(使用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
MysqL将获取3,000条记录,将它们缓存在临时表(或内存)中,然后仅应用外部LIMIT.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。