Files
kolaytercih/scripts/db-index.ts

45 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Sorgu yolundaki ifade indexi + WAL bakımı. Bir kez çalıştırılır
// (pnpm tsx scripts/db-index.ts); ingest/refresh sonrası da güvenle
// tekrar çalıştırılabilir (IF NOT EXISTS).
//
// src/lib/db.ts tüm aralık sorgularını COALESCE(sira2025, sira2024)
// üzerinden yapar; SQLite ifade indexleri METİNSEL eşleştiği için buradaki
// ifade oradaki EFEKTIF_SIRA sabitiyle birebir aynı olmalıdır. Bu index
// olmadan her sorgu tur-partisyonunu tarayıp temp B-tree ile sıralıyordu.
import path from "node:path";
import Database from "better-sqlite3";
const db = new Database(path.join(process.cwd(), "data", "yokatlas.db"));
db.exec(`
CREATE INDEX IF NOT EXISTS idx_programs_tur_onlisans_efektif
ON programs (tur, onlisans, COALESCE(sira2025, sira2024));
`);
// Programatik SEO sayfaları (src/lib/katalog.ts) bölüm/üniversite detaylarını
// ham ada birebir IN (...) eşleşmesiyle çeker; bu iki index olmadan her
// sayfa tam tablo taraması yapar.
db.exec(`
CREATE INDEX IF NOT EXISTS idx_programs_isim ON programs (isim);
CREATE INDEX IF NOT EXISTS idx_programs_universite ON programs (universite);
`);
// Uygulama DB'yi readonly açtığı için checkpoint yapamaz; şişen WAL'i
// (okuma başına ekstra maliyet) burada dosyaya geri yaz ve sıfırla.
db.pragma("wal_checkpoint(TRUNCATE)");
const plan = db
.prepare(
`EXPLAIN QUERY PLAN
SELECT id FROM programs
WHERE tur = ? AND onlisans = ?
AND COALESCE(sira2025, sira2024) IS NOT NULL
AND COALESCE(sira2025, sira2024) BETWEEN ? AND ?
ORDER BY COALESCE(sira2025, sira2024) ASC LIMIT 10`,
)
.all("SAYISAL", 0, 1000, 50000);
console.log("Sorgu planı:", JSON.stringify(plan, null, 2));
db.close();