45 lines
1.7 KiB
TypeScript
45 lines
1.7 KiB
TypeScript
// 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();
|