我不知道MySql,但對於很多dbs,我認爲你會發現運行兩次的代價並不像你想象的那麼高 - 如果你這樣做的話,數據庫的優化引擎認爲這兩個查詢具有很多共同點。
運行
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)
這可能是這樣嗎? http://stackoverflow.com/questions/818567/mysql-pagination-without-double-querying – barnyr 2013-05-03 10:10:16