0

假设一个houses包含大量字段、相关图像表和 3 个其他相关表的表。我有一个昂贵的查询,它检索所有houses数据,以及相关表中的所有数据。在分页的情况下,我是否需要两次运行相同的昂贵 MySql 查询:一次用于当前结果页面,一次用于获取记录总数?

我正在使用服务器端分页Limit 0,10,并且需要将房屋总数与数据一起返回。使用该函数运行相同的昂贵查询对我来说没有意义count(*),只是因为我限制了分页的结果集。是否有另一种方法来指示 MySQL 计算整个查询,但只带回当前的分页数据?

我希望我的问题很清楚...谢谢

4

2 回答 2

1

我不知道 MySql 但对于许多 dbs,我想你会发现运行它两次的成本并不像你想象的那么高 - 如果你这样做的方式是 db 的优化引擎看到两个查询有很多共同点。

跑步

select count(1) from (
  select some_fields, row_number over (order by field) as rownum
  from some_table
)

接着

select * from (
  select some_fields, row_number over (order by field) as rownum
  from some_table
)
where rownum between :startRow and :endRow
order by row_number

这还有一个好处是您可以只在一个地方使用两个不同的包装器来维护查询,1 个用于分页,1 个用于获取总计数。

顺便说一句,您可以做的最佳优化是确保每次都向数据库发送完全相同的查询。换句话说,如果用户可以更改排序或更改他们可以查询的字段,那么将它们全部烘焙到同一个查询中。例如:

select some_fields,
   case 
     when :sortField = 'ID' and :sortType = 'asc' 
       then row_number over (order by id)
     when :sortField = 'ID' and :sortType = 'desc' 
       then row_number over (order by id desc)
   end as rownum
from some_table
where (:searchType = 'name' 
  and last_name like :lastName and first_name like :firstName)
or  (:searchType = 'customerType' 
  and customer_type = :customer_type)
于 2013-05-03T10:08:26.613 回答
0

cfquery 有一个可能有用的记录计数变量。您还可以使用 cfoutput 的 startrow 和 maxrows 属性来控制显示多少记录。最后,您可以在冷融合中缓存查询结果,这样您就不必每次都针对数据库运行它。

于 2013-05-03T09:31:17.303 回答