[object Object]

← back to AsSeenInMovies

asseeninmovies: /movies + /people — parallelize page query and count(*) via Promise.all (was sequential, double-wall-time); /people warm now ~20ms, /movies warm ~900ms (count + ORDER BY popularity on 290k rows remains the long pole)

dbd4763f97ca29073aa27b8873fa2a6f494edd05 · 2026-05-12 17:32:05 -0700 · SteveStudio2

Files touched

Diff

commit dbd4763f97ca29073aa27b8873fa2a6f494edd05
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Tue May 12 17:32:05 2026 -0700

    asseeninmovies: /movies + /people — parallelize page query and count(*) via Promise.all (was sequential, double-wall-time); /people warm now ~20ms, /movies warm ~900ms (count + ORDER BY popularity on 290k rows remains the long pole)
---
 server.js | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/server.js b/server.js
index 8362f38..fbef5e5 100644
--- a/server.js
+++ b/server.js
@@ -1044,13 +1044,16 @@ app.get('/movies', async (req, res) => {
     if (genre) { params.push(genre); where += ` AND $${params.length} = ANY(genres)`; }
     if (q)     { params.push(`%${q.toLowerCase()}%`); where += ` AND LOWER(title) LIKE $${params.length}`; }
     params.push(limit, offset);
-    const r = await pool.query(`
-      SELECT id, title, release_year, genres, poster_url, poster_source, vote_average
-        FROM asim_movies
-       WHERE ${where}
-       ORDER BY ${MOVIE_SORTS[sort]}
-       LIMIT $${params.length-1} OFFSET $${params.length}`, params);
-    const totalR = await pool.query(`SELECT count(*) AS n FROM asim_movies WHERE ${where}`, params.slice(0, params.length - 2));
+    const countParams = params.slice(0, params.length - 2);
+    const [r, totalR] = await Promise.all([
+      pool.query(`
+        SELECT id, title, release_year, genres, poster_url, poster_source, vote_average
+          FROM asim_movies
+         WHERE ${where}
+         ORDER BY ${MOVIE_SORTS[sort]}
+         LIMIT $${params.length-1} OFFSET $${params.length}`, params),
+      pool.query(`SELECT count(*) AS n FROM asim_movies WHERE ${where}`, countParams)
+    ]);
     const total = parseInt(totalR.rows[0].n, 10);
     const totalPages = Math.max(1, Math.ceil(total / limit));
     const cards = r.rows.map(m => `
@@ -1146,13 +1149,16 @@ app.get('/people', async (req, res) => {
     let where = `headshot_url IS NOT NULL`;
     if (q) { params.push(`%${q.toLowerCase()}%`); where += ` AND LOWER(full_name) LIKE $${params.length}`; }
     params.push(limit, offset);
-    const r = await pool.query(`
-      SELECT id, full_name, headshot_url, headshot_source, primary_profession, birth_year, death_year
-        FROM asim_people
-       WHERE ${where}
-       ORDER BY ${PEOPLE_SORTS[sort]}
-       LIMIT $${params.length-1} OFFSET $${params.length}`, params);
-    const totalR = await pool.query(`SELECT count(*) AS n FROM asim_people WHERE ${where}`, params.slice(0, params.length - 2));
+    const countParams = params.slice(0, params.length - 2);
+    const [r, totalR] = await Promise.all([
+      pool.query(`
+        SELECT id, full_name, headshot_url, headshot_source, primary_profession, birth_year, death_year
+          FROM asim_people
+         WHERE ${where}
+         ORDER BY ${PEOPLE_SORTS[sort]}
+         LIMIT $${params.length-1} OFFSET $${params.length}`, params),
+      pool.query(`SELECT count(*) AS n FROM asim_people WHERE ${where}`, countParams)
+    ]);
     const total = parseInt(totalR.rows[0].n, 10);
     const totalPages = Math.max(1, Math.ceil(total / limit));
     const cards = r.rows.map(p => `

← d6451f3 asseeninmovies: home page — 60s in-memory cache with infligh  ·  back to AsSeenInMovies  ·  asseeninmovies: /movies perf — 3 partial indexes (has_poster b7e1d47 →