MySQL telah mulai SQL_CALC_FOUND_ROWS
menghilangkan fungsionalitas dengan versi 8.0.17 dan seterusnya.
Jadi, selalu lebih disukai untuk mempertimbangkan mengeksekusi kueri Anda dengan LIMIT
, dan kemudian kueri kedua dengan COUNT(*)
dan tanpa LIMIT
menentukan apakah ada baris tambahan.
Dari dokumen :
SQL_CALC_FOUND_ROWS pengubah permintaan dan fungsi FOUND_ROWS () yang menyertainya tidak digunakan pada MySQL 8.0.17 dan akan dihapus dalam versi MySQL yang akan datang.
COUNT (*) tunduk pada optimasi tertentu. SQL_CALC_FOUND_ROWS menyebabkan beberapa optimasi dinonaktifkan.
Gunakan kueri ini sebagai gantinya:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
Juga, SQL_CALC_FOUND_ROWS
telah diamati memiliki lebih banyak masalah secara umum, seperti yang dijelaskan dalam MySQL WL # 12615 :
SQL_CALC_FOUND_ROWS memiliki sejumlah masalah. Pertama-tama, lambat. Seringkali, akan lebih murah untuk menjalankan kueri dengan LIMIT dan kemudian SELECT COUNT terpisah ( ) untuk permintaan yang sama, karena COUNT ( ) dapat menggunakan pengoptimalan yang tidak dapat dilakukan ketika mencari seluruh rangkaian hasil (misalnya filesort dapat diabaikan untuk COUNT (*), sedangkan dengan CALC_FOUND_ROWS, kita harus menonaktifkan beberapa optimisasi fileort untuk menjamin hasil yang benar)
Lebih penting lagi, ini memiliki semantik yang sangat tidak jelas dalam sejumlah situasi. Secara khusus, ketika sebuah kueri memiliki beberapa blok kueri (misalnya dengan UNION), tidak ada cara untuk menghitung jumlah baris "yang akan pernah" pada saat yang sama dengan menghasilkan kueri yang valid. Ketika eksekutator iterator mengalami kemajuan ke arah pertanyaan semacam ini, sungguh sulit untuk mencoba mempertahankan semantik yang sama. Selain itu, jika ada beberapa LIMIT dalam kueri (misalnya untuk tabel turunan), itu tidak harus jelas ke yang SQL_CALC_FOUND_ROWS mana yang harus dirujuk. Dengan demikian, pertanyaan nontrivial seperti itu tentu akan mendapatkan semantik yang berbeda dalam pelaksana iterator dibandingkan dengan yang mereka miliki sebelumnya.
Akhirnya, sebagian besar kasus penggunaan di mana SQL_CALC_FOUND_ROWS tampaknya berguna harus diselesaikan dengan mekanisme lain selain LIMIT / OFFSET. Misalnya, buku telepon harus diberi nomor halaman dengan huruf (baik dalam hal UX dan dalam hal penggunaan indeks), bukan dengan mencatat nomor. Diskusi semakin tak terbatas-gulir dipesan berdasarkan tanggal (sekali lagi memungkinkan penggunaan indeks), bukan oleh paginasi oleh nomor pos. Dan seterusnya.
SQL_CALC_FOUND_ROWS
waktu lebih dari 20 detik; menggunakanCOUNT(*)
kueri terpisah membutuhkan waktu di bawah 5 detik (untuk kueri hitungan + hasil).