Sto usando SQLAlchemy con un database MySQL e mi piacerebbe contare le righe in una tabella (circa 300k). La funzione SQLAlchemy count impiega circa 50 volte più tempo per eseguire la scrittura della stessa query direttamente in MySQL. Sto facendo qualcosa di sbagliato?Perché SQLAlchemy count() è molto più lento della query non elaborata?
# this takes over 3 seconds to return
session.query(Segment).count()
Tuttavia:
SELECT COUNT(*) FROM segments;
+----------+
| COUNT(*) |
+----------+
| 281992 |
+----------+
1 row in set (0.07 sec)
La differenza di velocità aumenta con la dimensione della tabella (che è appena percettibile sotto 100k righe).
Aggiornamento
Utilizzando session.query(Segment.id).count()
invece di session.query(Segment).count()
sembra fare il trucco e lo fanno fino a velocità. Sono ancora perplesso sul motivo per cui la query iniziale è però più lenta.
Non so che cosa SQLAlchemy, ma suona come se sarebbe iterare sul risultato invece di inviare un conteggio (*) al back-end. –
I [documenti] (http://docs.sqlalchemy.org/ru/latest/orm/query.html#sqlalchemy.orm.query.Query.count) sembrano dire che la funzione di conteggio emette semplicemente un'istruzione di conteggio. – mtth
Abilita la registrazione usando il parametro 'echo = True' quando crei un' engine', quindi vedi l'istruzione 'SQL' effettivamente generata. – van