MySQL hat begonnen, die SQL_CALC_FOUND_ROWS
Funktionalität ab Version 8.0.17 zu verwerfen.
Es wird daher immer bevorzugt , die Ausführung Ihrer Abfrage mit LIMIT
und anschließend eine zweite Abfrage mit COUNT(*)
und ohne in Betracht zu ziehen, LIMIT
um festzustellen, ob zusätzliche Zeilen vorhanden sind.
Aus Dokumenten :
Der Abfragemodifikator SQL_CALC_FOUND_ROWS und die zugehörige Funktion FOUND_ROWS () sind ab MySQL 8.0.17 veraltet und werden in einer zukünftigen MySQL-Version entfernt.
COUNT (*) unterliegt bestimmten Optimierungen. SQL_CALC_FOUND_ROWS bewirkt, dass einige Optimierungen deaktiviert werden.
Verwenden Sie stattdessen diese Abfragen:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
Es wurde auch SQL_CALC_FOUND_ROWS
beobachtet, dass allgemein mehr Probleme auftreten, wie in MySQL WL # 12615 erläutert :
SQL_CALC_FOUND_ROWS weist eine Reihe von Problemen auf. Erstens ist es langsam. Häufig ist es billiger, die Abfrage mit LIMIT und dann mit einem separaten SELECT COUNT ( ) für dieselbe Abfrage auszuführen , da COUNT ( ) Optimierungen verwenden kann, die bei der Suche nach der gesamten Ergebnismenge (z. B. Dateisortierung) nicht möglich sind kann für COUNT (*) übersprungen werden, während bei CALC_FOUND_ROWS einige Dateisortierungsoptimierungen deaktiviert werden müssen, um das richtige Ergebnis zu gewährleisten.)
Noch wichtiger ist, dass die Semantik in einer Reihe von Situationen sehr unklar ist. Insbesondere wenn eine Abfrage mehrere Abfrageblöcke enthält (z. B. mit UNION), gibt es einfach keine Möglichkeit, die Anzahl der Zeilen zu berechnen, die gleichzeitig mit der Erstellung einer gültigen Abfrage vorhanden gewesen wären. Während der Iterator-Executor auf diese Art von Abfragen zusteuert, ist es wirklich schwierig, die gleiche Semantik beizubehalten. Wenn die Abfrage mehrere LIMITs enthält (z. B. für abgeleitete Tabellen), ist nicht unbedingt klar, auf welche davon SQL_CALC_FOUND_ROWS verweisen soll. Daher erhalten solche nicht trivialen Abfragen im Iterator-Executor notwendigerweise eine andere Semantik als zuvor.
Schließlich sollten die meisten Anwendungsfälle, in denen SQL_CALC_FOUND_ROWS nützlich erscheint, einfach durch andere Mechanismen als LIMIT / OFFSET gelöst werden. Beispielsweise sollte ein Telefonbuch nach Buchstaben (sowohl in Bezug auf UX als auch in Bezug auf die Indexnutzung) und nicht nach Datensatznummer paginiert werden. Diskussionen werden zunehmend nach Datum sortiert (was wiederum die Verwendung des Index ermöglicht), nicht nach Postnummer. Und so weiter.
SQL_CALC_FOUND_ROWS
dauerte über 20 Sekunden. Die Verwendung einer separatenCOUNT(*)
Abfrage dauerte weniger als 5 Sekunden (für beide Abfragen mit Anzahl + Ergebnisse).