微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – MySQL查询中是否有2个限制?

好的是这种情况(使用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

,MysqL获取满足条件的前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 举报,一经查实,本站将立刻删除。

相关推荐