Php MySQL查询中是否可能有2个限制?
好的,下面是一个情况(使用PHP/MySQL),您从一个大型MySQL表中获得结果, 假设您的mysql查询返回10000个匹配结果,并且您有一个分页脚本,每页显示20个结果,您的查询可能如下所示 So第1页查询Php MySQL查询中是否可能有2个限制?,php,mysql,Php,Mysql,好的,下面是一个情况(使用PHP/MySQL),您从一个大型MySQL表中获得结果, 假设您的mysql查询返回10000个匹配结果,并且您有一个分页脚本,每页显示20个结果,您的查询可能如下所示 So第1页查询 SELECT column FROM table_name WHERE userId=1 AND somethingelse=something else LIMIT 0,20 SELECT column FROM table_name WHERE userId=1 AN
SELECT column
FROM table_name
WHERE userId=1
AND somethingelse=something else
LIMIT 0,20
SELECT column
FROM table_name
WHERE userId=1
AND somethingelse=something else
LIMIT 20,40
So第2页查询
SELECT column
FROM table_name
WHERE userId=1
AND somethingelse=something else
LIMIT 0,20
SELECT column
FROM table_name
WHERE userId=1
AND somethingelse=something else
LIMIT 20,40
现在,您一次获取20个结果,但总共有10000行符合您的搜索条件
你怎么能只返回10000个结果中的3000个,而仍然在查询中限制20个,每页分页20个?
我认为这是不可能的,但myspace在浏览页面上不知怎么做到了,我知道他们没有使用php/mysql,但如何实现呢
更新
我看到一些人使用了几种方法进行了回复,似乎这些方法都不能通过将数量限制在3000来提高性能?您可以通过子查询来实现这一点
SELECT name FROM (
SELECT name FROM tblname LIMIT 0, 3000
) `Results` LIMIT 20, 40
或者使用临时表,将所有3000行选择到临时表中,然后按临时行id分页,这将是连续的。首先,限制参数是偏移量和记录数,因此第二个参数应始终为20-您不需要增加此参数
当然,如果您知道要检索的行的上限,您可以将其放入运行查询的逻辑中,即检查Offset+limit您可以在php代码中将该限制指定为页码(20*p,20*p+2)的函数,并将页码的值限制为150。如Sohnee所说,或者(取决于您的需求)您可以通过SQL获取所有3000条记录,然后使用php中的array_slice获取数组的块。对
php
进行编程,这样当它发现自己准备发出一个以LIMIT 3000、20
或更高结尾的查询时,它就会停止而不发出该查询
或者我错过了什么
更新:
MySQL
很好地对待LIMIT
子句
除非您的查询中有SQL\u CALC\u FOUND\u ROWS
,MySQL
只要找到足够的记录满足您的查询,就会停止解析结果、排序等
当你有这样的事情时:
SELECT column
FROM table_name
WHERE userId=1
AND somethingelse='something else'
LIMIT 0, 20
,MySQL
将首先获取满足条件的20
记录并停止
无论有多少条记录符合以下标准:50
或1000000
,性能都是相同的
如果您在查询中添加了一个orderby
,但没有索引,那么MySQL
当然需要浏览所有记录以找到第一个20
但是,即使在这种情况下,它也不会对所有10000
进行排序:它将有一个“运行窗口”,其中包含top20
记录,并且只要找到一个值足够大(或小)到可以进入窗口的记录,就只在该窗口内进行排序
这比把所有的万象分类要快得多
然而,MySQL
在管道记录方面不太好。这意味着此查询:
SELECT column
FROM (
SELECT column
FROM table_name
WHERE userId=1
AND somethingelse='something else'
LIMIT 3000
)
LIMIT 0, 20
在性能方面比第一个更差
MySQL
将获取3000
记录,将它们缓存在临时表(或内存)中然后才应用外部限制。或者您可以使用jquery选项卡获取3000条记录,并将它们拆分为每页20条记录。在上面的示例中,最多限制3000行并不能提高每个查询的性能。