Skip to content

Commit 7e438be

Browse files
committed
FORCE INDEX to get mysql query planner to play nice
1 parent 8c09514 commit 7e438be

3 files changed

Lines changed: 13 additions & 25 deletions

File tree

apps/web/lib/api/network/calculate-partner-ranking.ts

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ export async function calculatePartnerRanking({
110110

111111
const offset = (page - 1) * pageSize;
112112

113-
// Helper function to build discoverable partners filter with any alias
113+
// Helper function to build discoverable partners filter with any alias to reuse in subqueries
114+
// This dramatically reduces the dataset from 1.5M to 5,000 before expensive joins
114115
const buildDiscoverablePartnersFilter = (alias: string) => {
115116
const conditions: Prisma.Sql[] = [
116117
Prisma.sql`${Prisma.raw(alias)}.discoverableAt IS NOT NULL`,
@@ -129,27 +130,18 @@ export async function calculatePartnerRanking({
129130
return Prisma.join(conditions, " AND ");
130131
};
131132

132-
// OPTIMIZATION: Build filter for discoverable partners to reuse in subqueries
133-
// This dramatically reduces the dataset from 1.5M to 5,000 before expensive joins
134-
const discoverablePartnersFilter =
135-
buildDiscoverablePartnersFilter("p_filter");
136-
137-
// Build filter for all-program metrics join (uses different alias)
138-
const discoverablePartnersAllProgramsFilter =
139-
buildDiscoverablePartnersFilter("p_filter_all");
140-
141133
// Metrics across ALL programs (for display purposes)
142134
const allProgramMetricsJoin = Prisma.sql`LEFT JOIN (
143135
SELECT
144136
pe_all.partnerId,
145137
MAX(pe_all.lastConversionAt) as lastConversionAt,
146138
AVG(COALESCE(pe_all.conversionRate, 0)) as avgConversionRate
147-
FROM ProgramEnrollment pe_all
139+
FROM ProgramEnrollment pe_all FORCE INDEX (ProgramEnrollment_partnerId_programId_key)
148140
-- OPTIMIZATION: Only process enrollments for discoverable partners (using subquery to avoid JOIN)
149141
WHERE pe_all.partnerId IN (
150142
SELECT p_filter_all.id
151143
FROM Partner p_filter_all
152-
WHERE ${discoverablePartnersAllProgramsFilter}
144+
WHERE ${buildDiscoverablePartnersFilter("p_filter_all")}
153145
)
154146
AND pe_all.programId != ${ACME_PROGRAM_ID}
155147
AND pe_all.totalConversions > 0
@@ -193,12 +185,12 @@ export async function calculatePartnerRanking({
193185
)) as similarityScore,
194186
-- Program match score: Count of similar programs (0-15 points)
195187
LEAST(15, COUNT(DISTINCT pe2.programId) * 2) as programMatchScore
196-
FROM ProgramEnrollment pe2
188+
FROM ProgramEnrollment pe2 FORCE INDEX (ProgramEnrollment_partnerId_programId_key)
197189
-- OPTIMIZATION: Only process enrollments for discoverable partners (using subquery to avoid JOIN)
198190
WHERE pe2.partnerId IN (
199191
SELECT p_filter.id
200192
FROM Partner p_filter
201-
WHERE ${discoverablePartnersFilter}
193+
WHERE ${buildDiscoverablePartnersFilter("p_filter")}
202194
)
203195
AND pe2.programId IN (${Prisma.join(similarPrograms.map((sp) => sp.programId))})
204196
AND pe2.status = 'approved'
@@ -212,14 +204,6 @@ export async function calculatePartnerRanking({
212204
WHERE FALSE
213205
) similarProgramMetrics ON similarProgramMetrics.partnerId = p.id`;
214206

215-
// Build discoverable partners subquery for main FROM clause
216-
const discoverablePartnersSubqueryFilter =
217-
buildDiscoverablePartnersFilter("p_sub");
218-
219-
// Build discoverable partners filter for categories subquery
220-
const discoverablePartnersCategoriesFilter =
221-
buildDiscoverablePartnersFilter("p_cat");
222-
223207
const partners = await prisma.$queryRaw<Array<any>>`
224208
SELECT
225209
p.*,
@@ -252,7 +236,7 @@ export async function calculatePartnerRanking({
252236
-- This dramatically reduces the dataset from 1.5M to 5,000 before expensive joins
253237
SELECT p_sub.*
254238
FROM Partner p_sub
255-
WHERE ${discoverablePartnersSubqueryFilter}
239+
WHERE ${buildDiscoverablePartnersFilter("p_sub")}
256240
) p
257241
258242
-- Current program enrollment (for display metrics and filtering)
@@ -273,12 +257,12 @@ export async function calculatePartnerRanking({
273257
SELECT
274258
pe5.partnerId,
275259
GROUP_CONCAT(DISTINCT pc.category ORDER BY pc.category SEPARATOR ',') as categories
276-
FROM ProgramEnrollment pe5
260+
FROM ProgramEnrollment pe5 FORCE INDEX (ProgramEnrollment_partnerId_programId_key)
277261
JOIN ProgramCategory pc ON pc.programId = pe5.programId
278262
WHERE pe5.partnerId IN (
279263
SELECT p_cat.id
280264
FROM Partner p_cat
281-
WHERE ${discoverablePartnersCategoriesFilter}
265+
WHERE ${buildDiscoverablePartnersFilter("p_cat")}
282266
)
283267
AND pe5.status = 'approved'
284268
GROUP BY pe5.partnerId

apps/web/lib/middleware/utils/app-redirect.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ const APP_REDIRECTS = {
88
"/welcome": "/onboarding/welcome",
99
"/campaigns": "/program/campaigns",
1010
"/messages": "/program/messages",
11+
"/network": "/program/network",
12+
"/marketplace": "/program/network",
1113
};
1214

1315
const PROGRAM_REDIRECTS = {

packages/utils/src/constants/reserved-slugs.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,6 @@ export const RESERVED_SLUGS = [
6060
"resources",
6161
"campaigns",
6262
"messages",
63+
"network",
64+
"marketplace",
6365
];

0 commit comments

Comments
 (0)