JekCMS veritabanı, içerik, kullanıcılar, medya, taksonomi ve ayarları modellemek için 21 tablo kullanır. Gönderi meta verilerini anahtar-değer tablosunda saklamak gibi bazı kararlar ham sorgu performansının önünde esnekliği tercih eder.
Merkezi tablo, tüm içerik türleri için — blog gönderileri, sayfalar ve özel türler — içeriği type ayırt edici sütunuyla tek bir tabloda depolayan posts. Bu yaklaşım birleştirme işlemlerini basit tutuyor ve UNION operasyonları olmadan çapraz tür sorgularına olanak tanıyor. Ödün olarak, kategoriye özgü sorgular her zaman sütunun doğru indekslenmesini gerektiren bir WHERE type = 'post' koşulu içeriyor.
Gönderi Meta Verisi: Esneklik mi Performans mı?
Gönderi meta verisi, posts.id'ye bağlı bir anahtar-değer tablosu olan post_meta'da yaşıyor. Bu tasarım esnekliği en üst düzeye çıkarıyor — yeni bir meta alanı eklemek şema değişikliği gerektirmiyor — ancak bilinen bir jekcms.alfadizayn.com/tr/blog/paylasimli-hostingde-jekcms-gercekci-performans-rehberi" class="auto-link" target="_blank" rel="noopener">performans maliyeti var: bir gönderi ve meta verisi almak her zaman ya ikinci bir sorgu ya da bir JOIN gerektiriyor. JekCMS, gönderi meta verilerini istek başına ilk erişimde bellek içi bir diziye önceden yüklüyor ve sonraki okumaları bu diziden önbelleğe alıyor.
Options Tablosu: Hızlı Site Yapılandırması
options tablosu, WordPress'in wp_options'ına benzer şekilde site genelindeki yapılandırmayı anahtar-değer çiftleri olarak saklıyor. Sık erişilen seçenekler (site adı, aktif tema, önbellek ayarları) her istekte bootstrap sırasında tek bir SELECT ile belleğe yükleniyor. Bu, bir site seçeneğini değiştirmenin herhangi bir önbellek geçersizleştirme adımı olmadan bir sonraki istekte yansıdığı anlamına geliyor.
Büyük Kurulumlar İçin Sorunlu Tablolar
Büyük kurulumlar için performans sorunlarına en çok yol açan tablolar post_meta (varsayılan şemada (post_id, meta_key) üzerinde bileşik indeks yok) ve sessions (temizleme cron görevi yapılandırılmamışsa satırlar birikir). Her ikisi de yönetim kılavuzunun performans bölümünde belgelenmiş optimizasyon adımlarına sahip. Büyük bir kurulumda yavaşlama yaşıyorsanız ilk bakacağınız yer bu iki tablo olmalı.
Tam Tablo Listesi
Icerik (6): posts, post_meta, categories, post_categories, tags, post_tags
Kullanici (3): users, user_meta, sessions
Medya (2): media, media_meta
Taksonomi (3): taxonomies, terms, term_relationships
Sistem (7): options, redirects, cache, migrations,
api_tokens, audit_log, content_queue
Buyume Kaliplari
- Icerik tablolari dogrusal buyur — ayda 30 gonderi
posts'a ~30,post_meta'ya 150-300 satir ekler - Medya tablolari daha hizli buyur: her gorsel 4 kucuk resim varyanti olusturur
sessionsvecachetemizleme cron gorevi olmadan sinirsiz buyur
posts Tablosu Semasi
CREATE TABLE posts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(20) NOT NULL DEFAULT 'post',
title VARCHAR(500) NOT NULL,
slug VARCHAR(500) NOT NULL,
content LONGTEXT,
status ENUM('draft','published','scheduled','trashed'),
author_id INT UNSIGNED NOT NULL,
published_at DATETIME NULL,
INDEX idx_type_status (type, status),
UNIQUE INDEX idx_unique_slug (slug, type)
);
En Etkili Eksik Indeks
ALTER TABLE post_meta ADD INDEX idx_post_meta_lookup (post_id, meta_key);
50.000 meta satirina sahip bir sitede sayfa uretim suresini 120 ms'den 35 ms'ye dusurdu.
Neden JSON Sutunlar Kullanilmiyor?
Paylasimli hosting siklikla MySQL 5.6 veya tam JSON destegi olmayan MariaDB versiyonlari calistiriyor. Anahtar-deger kalibi MySQL 5.5-8.0 ve tum MariaDB versiyonlarinda calisiyor. MySQL 8.0+ uzerindeki siteler META_STORAGE=json ortam ayari ile JSON tabanli meta depolamayi etkinlestirebilir.
Yedekleme ve Tasima
migrationsuygulanan sema degisikliklerini izler — satirlarini asla silmeyinaudit_log100.000+ satira ulasabilir; 90 gunluk girislerden eskilerini arsivleyin- InnoDB tablolarinda kilitlemeyi onlemek icin
--single-transactionile dump alin content_queueisleme tamamlandiktan sonra guvenle temizlenebilir
Sorgu Optimizasyon Kaliplari
Tipik bir JekCMS kurulumunda en pahali sorgu, kategori adlari ve yazar verileriyle birlikte ana sayfa gonderi listesidir. Optimizasyon olmadan bu, uc ayri sorgu veya tum gonderiler tablosunu tarayan coklu tablo JOIN'i gerektirir.
JekCMS bunu (status, type, published_at) uzerindeki kapsayici indeks ve categories ile users tablolarina LEFT JOIN kullanan tek bir indeksli sorguyla cozer. Sonuc production'da 5 dakika onbelleğe alinir ve yuksek trafik alan ana sayfalarda veritabani yukunu yaklasik %85 azaltir.
Gonderi Listelerinde N+1 Sorunu
Bir listedeki her gonderi icin meta veri cekmek klasik N+1 sorgu sorununu olusturur. Bir sayfa 20 gonderi gosteriyorsa ve her biri 3 meta degerine ihtiyac duyuyorsa, sayfa yuklemesi basina 60 ek sorgu demektir. JekCMS bunu tek bir sorguda bir dizi gonderi ID'si icin tum meta verileri toplu yukleyerek onler:
SELECT post_id, meta_key, meta_value
FROM post_meta
WHERE post_id IN (?, ?, ?, ...)
ORDER BY post_id, meta_key;
Sonuclar post_id'ye gore anahtarlanan iliski dizisine gruplanir. Sonraki get_post_meta($id, $key) cagirilari veritabanina vurmak yerine bu bellek ici onbellekten okur. Bu kalip ana sayfa sorgu sayisini kac gonderi gosterilirse gosterilsin 60+'dan tam olarak 2'ye dusurur.
Sema Versiyonlama ve Gocler
Her sema degisikligi migrations tablosunda zaman damgasi tabanli bir dosya adiyla izlenir. JekCMS baslatildiginda uygulanan gocleri database/migrations/ dizinindeki dosyalarla karsilastirir ve bekleyen gocleri bir islem icinde calistirir.
Bir goc basarisiz olursa islem geri alinir ve hata, basarisizliga neden olan tam SQL ifadesiyle birlikte logs/migration.log'a kaydedilir. Bu yaklasim dagitimi tekrarlanabilir kilar: ayni kod tabanini 50 siteye dagitabilirsiniz ve her biri henuz calistirmadigi gocleri bagimsiz olarak uygular.
- Goc dosya adlari
YYYY_MM_DD_HHMMSS_aciklama.sqlformatini izler - Her goc
START TRANSACTION/COMMITicinde calisir - Basarisiz gocler
faileddurumuyla kaydedilir ve elle cozulmelidir - Basarili toplu calistirmalardan sonra
version.json'dakidb_versionarttirilir