sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur gör du Python / PostgreSQL snabbare?

Slösa inte tid på att profilera. Tiden finns alltid i databasoperationerna. Gör så få som möjligt. Bara det minsta antalet skär.

Tre saker.

Ett. VÄLJ inte om och om igen för att anpassa dimensionerna Datum, Värdnamn och Person. Hämta all data EN gång till en Python-ordbok och använd den i minnet. Gör inte upprepade singelval. Använd Python.

Två. Uppdatera inte.

Specifikt, gör inte detta. Det är dålig kod av två anledningar.

cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)

Den ska ersättas med en enkel SELECT COUNT(*) FRÅN ... . Uppdatera aldrig för att öka antalet. Räkna bara raderna som finns där med en SELECT-sats. [Om du inte kan göra detta med ett enkelt SELECT COUNT eller SELECT COUNT(DISTINCT), saknar du en del data -- din datamodell bör alltid ge korrekta fullständiga räkningar. Uppdatera aldrig.]

Och. Bygg aldrig SQL med strängersättning. Helt dumt.

Om, av någon anledning, SELECT COUNT(*) är inte tillräckligt snabb (benchmark först, innan du gör något halt) kan du cache resultatet av räkningen i en annan tabell. EFTER alla belastningar. Gör en SELECT COUNT(*) FROM whatever GROUP BY whatever och infoga detta i en tabell över antal. Uppdatera inte. Någonsin.

Tre. Använd bindningsvariabler. Alltid.

cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )

SQL ändras aldrig. Värdena bundna i förändring, men SQL ändras aldrig. Det här är MYCKET snabbare. Bygg aldrig SQL-satser dynamiskt. Aldrig.



  1. MySQL - I SELECT-satsen

  2. Använda mysql_real_escape_string med PDO (ingen anslutning till localhost-server)

  3. MySQL kontrollera om en tabell finns utan att skapa ett undantag

  4. Hur man genererar 52 veckor från aktuellt datum med Postgresql