← 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 →