atp*_*atp 107 mysql double pagination
我想知道是否有办法从MySQL查询中获取结果数量,同时限制结果.
分页的方式(据我所知),首先我做的事情
query = SELECT COUNT(*) FROM `table` WHERE `some_condition`
Run Code Online (Sandbox Code Playgroud)
获得num_rows(查询)后,我得到了结果数.但是为了实际限制我的结果,我必须做第二个查询,如:
query2 = SELECT COUNT(*) FROM `table` WHERE `some_condition` LIMIT 0, 10
Run Code Online (Sandbox Code Playgroud)
我的问题:无论如何都要检索将给出的结果总数,并限制在单个查询中返回的结果?或者更有效的方法.谢谢!
Der*_*ick 64
我几乎从不做两个查询.
只需返回多于所需的一行,仅在页面上显示10,如果有多个显示,则显示"下一步"按钮.
SELECT x, y, z FROM `table` WHERE `some_condition` LIMIT 0, 11
Run Code Online (Sandbox Code Playgroud)
// iterate through and display 10 rows.
// if there were 11 rows, display a "Next" button.
Run Code Online (Sandbox Code Playgroud)
您的查询应首先以最相关的顺序返回.很可能,大多数人都不会关心去412页中的第236页.
当您进行谷歌搜索,并且您的结果不在第一页时,您可能会转到第二页,而不是九.
sta*_*san 63
不,这就是有多少想要分页的应用程序必须这样做.它是可靠且防弹的,尽管它使查询两次.但是你可以将计数缓存几秒钟,这将有很大帮助.
另一种方法是使用SQL_CALC_FOUND_ROWS子句然后调用SELECT FOUND_ROWS().除了FOUND_ROWS()事后你必须打电话之外,还有一个问题:MySQL中存在一个错误,这会影响ORDER BY查询,使得它在大型表上比两个查询的天真方法慢得多.
tho*_*ter 25
避免双查询的另一种方法是首先使用LIMIT子句获取当前页面的所有行,然后在检索到最大行数时仅执行第二次COUNT(*)查询.
在许多应用程序中,最可能的结果是所有结果都适合一个页面,并且必须进行分页是例外而不是常态.在这些情况下,第一个查询将不会检索最大结果数.
例如,stackoverflow问题的答案很少溢出到第二页.对答案的评论很少超过5个左右的限制,以显示所有答案.
因此,在这些应用程序中,您只需先使用LIMIT进行查询,然后只要未达到该限制,就可以确切知道有多少行而无需执行第二次COUNT(*)查询 - 这应该是涵盖了大多数情况.
tho*_*ter 15
在大多数情况下,在两个单独的查询中执行它比在一个查询中执行它要快得多且资源更少,即使这似乎是违反直觉的.
如果使用SQL_CALC_FOUND_ROWS,那么对于大型表,它会使查询慢得多,甚至比执行两个查询慢得多,第一个使用COUNT(*),第二个使用LIMIT.这样做的原因是SQL_CALC_FOUND_ROWS导致在获取行而不是之前应用LIMIT子句,因此它在应用限制之前获取所有可能结果的整个行.索引无法满足这一要求,因为它实际上是在获取数据.
如果采用两种查询方法,第一种方法只获取COUNT(*)而不实际获取和实际数据,这可以更快地满足,因为它通常可以使用索引而不必获取实际的行数据它看到的每一行.然后,第二个查询只需要查看第一个$ offset + $ limit行然后返回.
来自MySQL性能博客的这篇文章进一步解释了这一点:
http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
对于在 2020 年寻找答案的任何人。根据 MySQL 文档:
“SQL_CALC_FOUND_ROWS 查询修饰符和随附的 FOUND_ROWS() 函数自 MySQL 8.0.17 起已弃用,并将在未来的 MySQL 版本中删除。作为替代,考虑使用 LIMIT 执行查询,然后使用 COUNT(*) 执行第二个查询并且没有 LIMIT 来确定是否有额外的行。”
我想这就解决了。
https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows
| 归档时间: |
|
| 查看次数: |
54545 次 |
| 最近记录: |