MySQL, SQL_CALC_FOUND_ROWS
8.0.17 ve sonraki sürümlerle işlevselliği kullanımdan kaldırmaya başladı .
Bu nedenle, her zaman sorgunuzu çalıştırmayı LIMIT
ve sonra ek satırlar olup olmadığını belirlemek için COUNT(*)
ve olmadan ikinci bir sorgu kullanmayı düşünmek tercih edilirLIMIT
.
Gönderen docs :
SQL_CALC_FOUND_ROWS sorgu değiştiricisi ve ona eşlik eden FOUND_ROWS () işlevi MySQL 8.0.17'den itibaren kullanımdan kaldırılmıştır ve gelecekteki bir MySQL sürümünde kaldırılacaktır.
COUNT (*) belirli optimizasyonlara tabidir. SQL_CALC_FOUND_ROWS bazı optimizasyonların devre dışı bırakılmasına neden olur.
Bunun yerine şu sorguları kullanın:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
Ayrıca, MySQL WL # 12615'teSQL_CALC_FOUND_ROWS
açıklandığı gibi, genel olarak daha fazla sorun yaşadığı gözlemlenmiştir :
SQL_CALC_FOUND_ROWS'un bir takım sorunları vardır. Her şeyden önce, yavaş. COUNT ( ), sonuç kümesinin tamamını (ör. Filesort) ararken gerçekleştirilemeyen optimizasyonları kullanabildiğinden, sorguyu aynı sorgu için LIMIT ve ardından ayrı bir SELECT COUNT ( ) çalıştırmak daha ucuz olacaktır. COUNT (*) için atlanabilirken, CALC_FOUND_ROWS ile doğru sonucu garanti etmek için bazı dosya sırası optimizasyonlarını devre dışı bırakmalıyız)
Daha da önemlisi, bazı durumlarda çok net olmayan anlambilimine sahiptir. Özellikle, bir sorguda birden çok sorgu bloğu varsa (örn. UNION ile), geçerli bir sorgu oluştururken aynı zamanda “olurdu” satır sayısını hesaplamanın bir yolu yoktur. Yineleyici yürütücü bu tür sorgulara doğru ilerlerken, aynı semantiği korumaya çalışmak gerçekten zordur. Ayrıca, sorguda birden fazla LIMIT varsa (örneğin, türetilmiş tablolar için) SQL_CALC_FOUND_ROWS'un hangisine başvurması gerektiği açık değildir. Bu nedenle, bu tür önemsiz olmayan sorgular, yineleyici yürütücüsünde daha önce sahip olduklarına kıyasla mutlaka farklı semantikler alacaktır.
Son olarak, SQL_CALC_FOUND_ROWS'un yararlı göründüğü kullanım durumlarının çoğu LIMIT / OFFSET dışındaki mekanizmalarla çözülmelidir. Örneğin, bir telefon defteri kayıt numarasına göre değil, harfle (hem UX açısından hem de dizin kullanımı açısından) sayfalandırılmalıdır. Tartışmalar, posta numarasına göre sayfalandırılmış değil, tarihe göre giderek artan bir şekilde sonsuz kaydırma sırasına göre sıralanır (yine dizin kullanımına izin verir). Ve bunun gibi.
SQL_CALC_FOUND_ROWS
20 saniyeyi aştı; ayrı birCOUNT(*)
sorgu kullanmak 5 saniyenin altında sürdü (hem count + sonuç sorguları için).