sql >> Databáze >  >> RDS >> PostgreSQL

Jak poskytnout klientovi API 1 000 000 výsledků databáze?

Tabulka má primární klíč. Využijte toho.

Místo LIMIT a OFFSET , proveďte stránkování pomocí filtru na primárním klíči. Naznačil jste to svým komentářem:

Stránkování pomocí náhodných čísel ( ke každému dotazu přidejte „VĚTŠÍ NEŽ OBJEDNAT PODLE“)

ale na tom, jak byste to měli udělat, není nic náhodného.

SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2

Umožněte klientovi zadat oba parametry, poslední ID, které viděl, a počet záznamů k načtení. Vaše rozhraní API bude muset mít buď zástupný symbol, další parametr nebo alternativní volání pro „načtení prvního n ID“, kde se vynechává WHERE klauzule z dotazu, ale to je triviální.

Tento přístup bude používat poměrně efektivní indexové skenování k uspořádání záznamů, obecně se vyhne řazení nebo nutnosti opakovat všechny přeskočené záznamy. Klient se může rozhodnout, kolik řádků chce najednou.

Tento přístup se liší od LIMIT a OFFSET přístup jedním klíčovým způsobem:souběžná modifikace. Pokud INSERT do tabulky pomocí klávesy dolů než klíč, který již některý klient viděl, tento přístup vůbec nezmění jeho výsledky, zatímco OFFSET přístup bude opakovat řadu. Podobně, pokud DELETE řádek s nižším než již viděným ID se výsledky tohoto přístupu nezmění, zatímco OFFSET přeskočí neviditelný řádek. Neexistuje však žádný rozdíl pro tabulky pouze pro připojení s vygenerovanými klíči.

Pokud předem víte, že klient bude chtít celou sadu výsledků, nejúčinnější je poslat mu celou sadu výsledků bez tohoto stránkování. To je místo, kde bych byla použijte kurzor. Přečtěte si řádky z DB a odešlete je klientovi tak rychle, jak je klient přijme. Toto API by muselo nastavit limity na to, jak pomalý klient mohl být, aby se zabránilo nadměrné zátěži backendu; u pomalého klienta bych pravděpodobně přešel na stránkování (jak je popsáno výše) nebo bych celý výsledek kurzoru zařadil do dočasného souboru a ukončil připojení k DB.

Důležitá upozornění :

  • Vyžaduje UNIQUE omezení / UNIQUE index nebo PRIMARY KEY být spolehlivý
  • Odlišné chování souběžné modifikace s limitem/offsetem, viz výše


  1. Použijte @@ IDENTITY k vrácení poslední vložené hodnoty identity na serveru SQL Server

  2. Spouštěč SQL Server vloží hodnoty z nového řádku do jiné tabulky

  3. Výpočet průměrných nákladů na zásoby v SQL

  4. Chyba při spuštění serveru MySQL „Server se ukončil bez aktualizace souboru PID“