Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Postgresl select count(*) zeitaufwändig

Die zweite Anweisung dauert sehr lange, da sie die gesamte Tabelle durchsuchen muss, um die Zeilen zu zählen.

Eine Sache, die Sie tun können, ist einen Index zu verwenden:

CREATE INDEX ON tbl_oplog (deleted) INCLUDE (id);
VACUUM tbl_oplog;  -- so you get an index only scan

Angenommen, diese id der Primärschlüssel ist, wäre es viel besser, count(*) zu verwenden und lassen Sie das INCLUDE weg Klausel aus dem Index.

Aber das Beste ist wahrscheinlich, eine Schätzung zu verwenden:

SELECT t.reltuples * freq.f AS estimated_rows
FROM pg_stats AS s
   JOIN pg_namespace AS n
      ON s.schemaname = n.nspname
   JOIN pg_class AS t
      ON s.tablename = t.relname
         AND n.oid = t.relnamespace
   CROSS JOIN LATERAL
      unnest(s.most_common_vals::text::boolean[]) WITH ORDINALITY AS val(v,id)
   JOIN LATERAL
      unnest(s.most_common_freqs) WITH ORDINALITY AS freq(f,id)
         USING (id)
WHERE s.tablename = 'tbl_oplog'
  AND s.attname = 'deleted'
  AND val.v = ?;

Dies verwendet die Verteilungsstatistiken, um die gewünschte Anzahl zu schätzen.

Wenn es nur um Paginierung geht, brauchen Sie keine genauen Zahlen.

Lesen Sie meinen Blog für mehr zum Thema Zählen in PostgreSQL.