gpt4 book ai didi

php - MySQL 查询中是否可以有 2 个限制?

转载 作者:可可西里 更新时间:2023-11-01 07:57:46 24 4
gpt4 key购买 nike

好的,这是您从大型 mysql 表中获取结果的情况(使用 PHP/MySQL),假设您的 mysql 查询返回 10,000 个匹配结果,并且您有一个分页脚本每页显示 20 个结果,您的查询可能如下所示

So page 1查询

SELECT column 
FROM table_name
WHERE userId=1
AND somethingelse=something else
LIMIT 0,20

So page 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 来实际提高性能?

最佳答案

对您的 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 条记录并停止。

无论有多少记录符合条件:501,000,000,性能都是一样的。

如果您在查询中添加一个ORDER BY 并且没有索引,那么MySQL 当然需要浏览所有记录以找出第一个20

但是,即使在这种情况下,它也不会对所有 10,000 进行排序:它将有一个包含前 20 记录的“运行窗口”,并尽快仅在此窗口内排序因为它找到了一个值大(或小)到足以进入窗口的记录。

这比对整个无数项进行排序要快得多。

MySQL 但是,在流水线记录集方面并不擅长。这意味着这个查询:

SELECT  column 
FROM (
SELECT column
FROM table_name
WHERE userId=1
AND somethingelse='something else'
LIMIT 3000
)
LIMIT 0, 20

在性能方面比第一个差

MySQL 将获取 3,000 记录,将它们缓存在临时表(或内存中)中,并仅在此之后应用外部 LIMIT

关于php - MySQL 查询中是否可以有 2 个限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1199297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com