MySql についてはわかりませんが、多くのデータベースでは、データベースの最適化エンジンが2 つのクエリには多くの共通点があります。
ランニング
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
これには、2 つの異なるラッパー (1 つはページング用、もう 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)