Ich benutze SQLAlchemy mit einer MySQL-Datenbank und ich möchte die Zeilen in einer Tabelle (etwa 300k) zählen. Die SQLAlchemy-Funktion count dauert etwa 50-mal so lange wie das Schreiben derselben Abfrage direkt in MySQL. Mache ich etwas falsch?Warum ist SQLAlchemy count() viel langsamer als die rohe Abfrage?
# this takes over 3 seconds to return
session.query(Segment).count()
jedoch:
SELECT COUNT(*) FROM segments;
+----------+
| COUNT(*) |
+----------+
| 281992 |
+----------+
1 row in set (0.07 sec)
Der Unterschied in der Geschwindigkeit erhöht sich mit der Größe des Tisches (es ist kaum spürbar unter 100 K Zeilen).
aktualisieren
Mit session.query(Segment.id).count()
statt session.query(Segment).count()
den Trick zu tun scheint und es um Geschwindigkeit aufzustehen. Ich bin immer noch verwirrt, warum die erste Abfrage langsamer ist.
Ich weiß nicht, dass SQLAlchemy Sache, aber es klingt, als würde es über das Ergebnis iterieren anstatt eine Zählung (*) an das Backend zu senden. –
Die [docs] (http://docs.sqlalchemy.org/ru/latest/orm/query.html#sqlalchemy.orm.query.Query.count) scheinen zu sagen, dass die count-Funktion nur eine count-Anweisung ausgibt. – mtth
Aktivieren Sie die Protokollierung mit dem Parameter echo = True, wenn Sie eine 'engine' erstellen. Sehen Sie sich dazu die tatsächlich generierte Anweisung' SQL' an. – van