【问题标题】:What is the least expensive method to get a row count for a SQL Query?获取 SQL 查询的行数最便宜的方法是什么?
【发布时间】:2011-01-21 14:16:14
【问题描述】:

在网页上编写分页查询时,获取总行数最便宜的方法是什么?有没有办法在不运行两次查询的情况下做到这一点 - 一个用于总数,下一个用于限制?

使用 MySQL

例子:(我想知道有没有更便宜的方法)

获取计数

SELECT COUNT(*) FROM table

获取分页

SELECT mycolumns FROM table LIMIT 100

如何在不运行 2 个查询的情况下获得总数。

【问题讨论】:

  • 尝试预先计算表大小并存储值并运行后台进程以不时更新值

标签: sql mysql


【解决方案1】:

表名中选择计数(*)

是获取表tablename行数最有效的方法

【讨论】:

  • “有没有办法在不运行两次查询的情况下做到这一点”
  • 为什么你必须运行这个(或我的)查询两次?
  • 因为一个用于计数,第二个用于分页(限制),因此只有 x 数量的行返回到页面。你有问题看到了 1 | 2 | 3 ...最后在页面底部。
【解决方案2】:
select count(1) as counter from *table_name*

这比使用count(*) 避免检查表中的所有列要好一些。

【讨论】:

【解决方案3】:

您可以使用SQL_CALC_FOUND_ROWS 选项运行第一个查询,然后运行:

SELECT FOUND_ROWS();

http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_found-rows

【讨论】:

  • 优秀 - 这比 2 个查询便宜吗?
  • 我不能保证在所有情况下它都会低于 2次查询,但它肯定不应该更多昂贵。比较将取决于许多因素:存储引擎、表的大小、选择的列、where 子句、索引与全扫描等。
  • 简而言之,如果您担心性能,您可能需要对您的特定数据进行一些测试。
【解决方案4】:

这将在包含总行数的每一行中为您提供一个名为 Count 的附加列:

SELECT mycolumns, (select count(*) from table) as Count 
FROM table 
LIMIT 100

【讨论】:

  • 这比两个查询效率高吗?
  • 这将比单独查询更有效,因为您只需从应用程序中调用一次数据库。
  • 虽然本题标有SQL、MySQL标签,但上述方案只适用于部分SQL变体,如MySQL。其他变体将需要 GROUP BY 子句。
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多