
MySQL/MariaDB Veritabanı Yönetimi: Bağlantı, CRUD, JOIN, Transaction ve EXPLAIN (2026)
MySQL ve MariaDB yönetiminde temel sysadmin akışı: bağlantı kurma, DDL, veri tipleri, charset, CRUD işlemleri, JOIN türleri, transaction, stored procedure, view, yedekleme ve EXPLAIN sorgu analizi.
MySQL/MariaDB Veritabanı Yönetimi: Bağlantı, CRUD, JOIN, Transaction ve EXPLAIN Rehberi (2026)
MySQL ve MariaDB yönetmek salt "SQL çalıştırmak" değil; bağlantı, şema tasarımı, CRUD güvenliği, JOIN optimizasyonu, transaction güvenliği ve sorgu analizi döngüsünü birlikte yürütmek demek. Bu rehberde temel sysadmin akışını — bağlantıdan DDL'e, CRUD'tan JOIN ve transaction'a, yedeklemeden EXPLAIN kullanımına — pratik örneklerle aktarıyoruz.
Büyükweb perspektifi: cPanel hosting paketlerimizde MariaDB 10.6 LTS + phpMyAdmin standart olarak sunuluyor. VDS paketlerimizde dedicated MariaDB/MySQL kurulumu yapabilir,
my.cnfüzerinde tam kontrol sağlarsınız. Bu yazı genel MySQL/MariaDB sysadmin akışı odaklı; performans tuning ve replikasyon için ilgili rehberlere bağlantı verilmiştir.
MySQL/MariaDB Bağlantısı: CLI, phpMyAdmin, DBeaver, Workbench
Komut Satırı (mysql client)
# Yerel sunucuya root bağlantısı
mysql -u root -p
# Uzak sunucuya belirli bir DB'ye bağlan
mysql -h 192.168.1.10 -u appuser -p site_db
# Tek komut çalıştır (otomasyon, cron)
mysql -u root -p -e "SHOW STATUS LIKE 'Uptime';"
# Port belirterek bağlan
mysql -h db.sunucu.com -P 3306 -u appuser -p site_db
Grafik Araçlar
| Araç | Kullanım Senaryosu | Not |
|---|---|---|
| phpMyAdmin | cPanel hosting, tarayıcı tabanlı | Büyükweb cPanel'de dahili gelir |
| DBeaver | Çoklu DB destekli masaüstü IDE | MySQL, PostgreSQL, SQLite aynı UI |
| MySQL Workbench | MySQL resmi GUI, ERD + migration | Remote MySQL whitelist gerekli (aşağıda) |
| TablePlus | macOS/Windows hızlı GUI | SSH tüneli ile VDS bağlantısı |
Tercih etmeyin: phpMyAdmin'i production otomasyonu için kullanmayı. Export/Import işlemleri büyük DB'lerde timeout'a girer;
mysqldumpkomut satırı her zaman tercih edilmeli.
Veritabanı ve Tablo Yönetimi: DDL Temelleri
Veritabanı Operasyonları
-- Veritabanı oluştur (charset ve collation ile birlikte — kritik)
CREATE DATABASE site_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Mevcut veritabanlarını listele
SHOW DATABASES;
-- Çalışılacak veritabanını seç
USE site_db;
-- Veritabanını sil (geri dönüşü yok, dikkatli kullan)
DROP DATABASE eski_db;
Tablo Operasyonları
-- Tablo oluştur
CREATE TABLE kullanicilar (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
ad VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
durum TINYINT(1) NOT NULL DEFAULT 1,
olusturma DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
guncelleme DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Mevcut tabloları listele
SHOW TABLES;
-- Tablo yapısını incele
DESCRIBE kullanicilar;
SHOW CREATE TABLE kullanicilar;
-- Tabloya sütun ekle
ALTER TABLE kullanicilar ADD COLUMN telefon VARCHAR(20) AFTER email;
-- Sütun tipini değiştir
ALTER TABLE kullanicilar MODIFY COLUMN ad VARCHAR(150) NOT NULL;
-- Sütun sil
ALTER TABLE kullanicilar DROP COLUMN eski_alan;
-- Tabloyu sil
DROP TABLE temp_tablo;
-- Tüm kayıtları sil ama tabloyu koru (TRUNCATE auto_increment'i sıfırlar)
TRUNCATE TABLE log_kayitlari;
Veri Tipleri 2026: Doğru Seçim Performansı Etkiler
Sayısal Tipler
| Tip | Aralık | Ne Zaman? |
|---|---|---|
| TINYINT(1) | 0-255 / -128-127 | Boolean (0/1), küçük sayaç |
| INT | ±2.1 milyar | Genel ID, sayaç |
| BIGINT | ±9.2 × 10¹⁸ | Büyük tablolar, sosyal ID |
| DECIMAL(10,2) | Kesin ondalık | Para, vergi — FLOAT kullanma |
| FLOAT/DOUBLE | Yaklaşık | Bilimsel hesap, koordinat (toleranslı) |
Tercih etmeyin: Para hesapları için FLOAT veya DOUBLE kullanmayı — yuvarlama hatası kaçınılmaz. DECIMAL(10,2) kullanın.
Metin Tipleri
| Tip | Max Boyut | Ne Zaman? |
|---|---|---|
| VARCHAR(N) | 65535 byte | Dinamik uzunluk metin (ad, başlık) |
| TEXT | 65 KB | Blog paragrafı, açıklama |
| MEDIUMTEXT | 16 MB | Makale içeriği, HTML |
| LONGTEXT | 4 GB | Log dosyası, büyük veri |
| CHAR(N) | 255 karakter | Sabit uzunluk (ISO kodu, hash) |
Tarih/Zaman Tipleri
| Tip | Aralık | Not |
|---|---|---|
| DATE | 1000-9999 | Sadece tarih |
| DATETIME | 1000-9999, saat dahil | Saat diliminden bağımsız |
| TIMESTAMP | 1970-2038 | UTC saklar, saat dilimiyle dönüştürür |
| TIME | -838:59:59 – 838:59:59 | Süre, çalışma saati |
Not: TIMESTAMP 2038 sorununu göz önünde bulundurun; uzun vadeli tarih verisi için DATETIME tercih edin.
Modern Tipler
-- JSON (MariaDB 10.2+, MySQL 5.7+ native)
ALTER TABLE urunler ADD COLUMN ozellikler JSON;
SELECT JSON_EXTRACT(ozellikler, '$.renk') FROM urunler WHERE id = 1;
-- SPATIAL (coğrafi veri)
CREATE TABLE lokasyonlar (
id INT AUTO_INCREMENT PRIMARY KEY,
isim VARCHAR(100),
konum POINT NOT NULL,
SPATIAL INDEX(konum)
) ENGINE=InnoDB;
-- ENUM — kullanım uyarısı
ALTER TABLE siparisler ADD COLUMN durum ENUM('beklemede','tamamlandi','iptal') DEFAULT 'beklemede';
-- Uyarı: ENUM'a yeni değer eklemek ALTER TABLE gerektirir ve büyük tablolarda yavaştır.
-- Modern alternatif: TINYINT + uygulama katmanı mapping.
Charset ve Collation: utf8mb4 Neden Şart?
MySQL'deki utf8 (3 byte) emoji ve bazı unicode karakterleri saklayamaz — bu bir bug değil tasarım sınırı. utf8mb4 (4 byte) tam unicode desteği sağlar; 2026'da yeni tablo için utf8 kullanmak hata.
| Collation | Karşılaştırma | Ne Zaman? |
|---|---|---|
| utf8mb4_general_ci | Hızlı, basit | Eski sistemler, Türkçe olmayan |
| utf8mb4_unicode_ci | Locale-aware, doğru | Türkçe karakter için tercih |
| utf8mb4_bin | Binary, case-sensitive | Hash karşılaştırma, kod değerleri |
| utf8mb4_0900_ai_ci | MySQL 8.0 varsayılanı | En güncel unicode kuralları |
Türkçe için: utf8mb4_unicode_ci kullanın — "ş", "ğ", "ı", "ö", "ü" doğru sıralanır ve büyük/küçük harf dönüşümü tutarlı çalışır. general_ci'da bazı Türkçe karşılaştırmalar hatalı sonuç verir.
-- Mevcut DB charset'ini güncelle
ALTER DATABASE site_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Tablo charset'ini güncelle (içeriği de dönüştürür)
ALTER TABLE kullanicilar
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CRUD İşlemleri: SELECT, INSERT, UPDATE, DELETE
SELECT
-- Temel sorgulama
SELECT id, ad, email FROM kullanicilar WHERE durum = 1;
-- WHERE koşulları
SELECT * FROM siparisler
WHERE toplam > 100
AND olusturma >= '2026-01-01'
AND durum IN ('tamamlandi', 'beklemede');
-- GROUP BY + HAVING
SELECT musteri_id, COUNT(*) AS siparis_sayisi, SUM(toplam) AS toplam_tutar
FROM siparisler
WHERE olusturma >= '2026-01-01'
GROUP BY musteri_id
HAVING siparis_sayisi > 3
ORDER BY toplam_tutar DESC
LIMIT 20;
-- Sayfalama (OFFSET performans notu)
SELECT * FROM urunler ORDER BY id LIMIT 20 OFFSET 100;
-- Büyük tablolarda OFFSET yavaşlar; keyset pagination tercih et:
SELECT * FROM urunler WHERE id > 500 ORDER BY id LIMIT 20;
INSERT
-- Tekil kayıt
INSERT INTO kullanicilar (ad, email, durum)
VALUES ('Ahmet Yılmaz', 'ahmet@ornek.com', 1);
-- Toplu kayıt (bulk insert — tek seferde verimli)
INSERT INTO log_kayitlari (kullanici_id, eylem, tarih) VALUES
(1, 'giris', NOW()),
(2, 'siparis_ver', NOW()),
(3, 'profil_guncelle', NOW());
-- Çakışmada güncelle (upsert)
INSERT INTO sayac (anahtar, deger)
VALUES ('ziyaret', 1)
ON DUPLICATE KEY UPDATE deger = deger + 1;
UPDATE
-- WHERE filtresi ZORUNLU — unutursan tüm tabloya yazarsın
UPDATE kullanicilar
SET ad = 'Ahmet Y.', guncelleme = NOW()
WHERE id = 42;
-- Çoklu tablo güncelleme
UPDATE siparisler s
JOIN kullanicilar k ON s.musteri_id = k.id
SET s.durum = 'iptal'
WHERE k.email = 'test@ornek.com' AND s.durum = 'beklemede';
-- Test etmeden önce SELECT ile doğrula
SELECT COUNT(*) FROM kullanicilar WHERE durum = 0; -- kaç kayıt etkilenecek?
UPDATE kullanicilar SET durum = 0 WHERE olusturma < '2020-01-01';
DELETE
-- WHERE filtresi ZORUNLU
DELETE FROM oturumlar WHERE son_aktivite < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- Çok büyük silme işlemi — batch ile yap (lock önlemek için)
DELETE FROM log_kayitlari WHERE tarih < '2025-01-01' LIMIT 1000;
-- Cron ile tekrarla; tek seferde milyonlarca kayıt silmek tabloyu kilitler.
-- TRUNCATE: WHERE yok, tüm içeriği siler, auto_increment sıfırlanır
TRUNCATE TABLE gecici_veriler;
JOIN Türleri: INNER, LEFT, RIGHT, CROSS, Self-JOIN
-- INNER JOIN: sadece her iki tabloda eşleşen kayıtlar
SELECT s.id, k.ad, s.toplam
FROM siparisler s
INNER JOIN kullanicilar k ON s.musteri_id = k.id
WHERE s.durum = 'tamamlandi';
-- LEFT JOIN: sol tablodaki tüm kayıtlar + eşleşenler (sağda null olabilir)
SELECT k.ad, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
GROUP BY k.id, k.ad;
-- Hiç sipariş vermemiş müşteriler: siparis_sayisi = 0 olarak gelir
-- RIGHT JOIN: sağ tablodaki tüm kayıtlar (nadiren kullanılır; LEFT JOIN yeter)
SELECT s.id, k.ad
FROM siparisler s
RIGHT JOIN kullanicilar k ON s.musteri_id = k.id;
-- FULL OUTER JOIN: MySQL native desteklemez — UNION ile simüle et
SELECT k.ad, s.id AS siparis_id
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
UNION
SELECT k.ad, s.id
FROM kullanicilar k
RIGHT JOIN siparisler s ON k.id = s.musteri_id
WHERE k.id IS NULL;
-- CROSS JOIN: kartezyen çarpım (tüm kombinasyonlar) — büyük tablolarda dikkatli
SELECT r.renk, b.beden
FROM renkler r
CROSS JOIN bedenler b;
-- Self-JOIN: aynı tabloya kendin join (hiyerarşi, çalışan-yönetici)
SELECT c.ad AS calisan, y.ad AS yonetici
FROM calisanlar c
LEFT JOIN calisanlar y ON c.yonetici_id = y.id;
Performans notu: JOIN edilen sütunlara indeks ekleyin.
ON s.musteri_id = k.idiçinsiparisler.musteri_idsütununa INDEX gereklidir. Detay için veritabanı indeksleme rehberimize bakın.
Temel İndeksleme: PRIMARY KEY, UNIQUE, INDEX, FULLTEXT
İndeksleme ayrı bir yazının konusu; burada temel sözdizimi:
-- PRIMARY KEY (InnoDB'de clustered — fiziksel sıralama)
ALTER TABLE kullanicilar ADD PRIMARY KEY (id);
-- UNIQUE index (tekrar eden değer reddedilir)
CREATE UNIQUE INDEX idx_email ON kullanicilar(email);
-- B-Tree index (varsayılan — WHERE, JOIN, ORDER BY için)
CREATE INDEX idx_durum_tarih ON siparisler(durum, olusturma);
-- FULLTEXT (metin arama — LIKE '%...%' alternatifi)
ALTER TABLE makaleler ADD FULLTEXT INDEX ft_baslik_icerik(baslik, icerik);
SELECT * FROM makaleler WHERE MATCH(baslik, icerik) AGAINST('mysql yönetim' IN BOOLEAN MODE);
-- Index sil
DROP INDEX idx_eski ON kullanicilar;
-- Mevcut indexleri listele
SHOW INDEX FROM kullanicilar;
Stored Procedure ve Trigger
Stored Procedure
DELIMITER //
CREATE PROCEDURE musteri_sil(IN musteri_id INT, OUT silinen_siparis INT)
BEGIN
-- Önce bağlı siparişleri sil
DELETE FROM siparisler WHERE musteri_id = musteri_id;
SET silinen_siparis = ROW_COUNT();
-- Sonra müşteriyi sil
DELETE FROM kullanicilar WHERE id = musteri_id;
END //
DELIMITER ;
-- Çağır
CALL musteri_sil(42, @silinen);
SELECT @silinen AS silinen_siparis;
Trigger
DELIMITER //
CREATE TRIGGER siparis_sonrasi_stok_guncelle
AFTER INSERT ON siparis_kalemleri
FOR EACH ROW
BEGIN
UPDATE urunler
SET stok = stok - NEW.miktar
WHERE id = NEW.urun_id;
END //
DELIMITER ;
Modern best-practice: Stored procedure ve trigger iş mantığını DB'ye gömer — test, versiyon kontrolü ve ölçeklendirme zorlaşır. Çoğu modern uygulama bu mantığı uygulama katmanına (ORM, servis katmanı) taşır. Stored procedure meşru kullanım: raporlama, batch işlem, legacy sistemlerle entegrasyon.
Transaction: ACID ve Isolation Levels
Temel Kullanım
START TRANSACTION;
UPDATE hesaplar SET bakiye = bakiye - 500 WHERE id = 1;
UPDATE hesaplar SET bakiye = bakiye + 500 WHERE id = 2;
-- Her iki güncelleme başarılıysa kaydet
COMMIT;
-- Hata varsa geri al
-- ROLLBACK;
SAVEPOINT ile Kısmi Geri Alma
START TRANSACTION;
INSERT INTO siparisler (musteri_id, toplam) VALUES (5, 150);
SAVEPOINT siparis_eklendi;
INSERT INTO siparis_kalemleri (siparis_id, urun_id, miktar) VALUES (LAST_INSERT_ID(), 10, 2);
-- Bu satır hata verirse sadece kalemleri geri al, siparişi koru
ROLLBACK TO SAVEPOINT siparis_eklendi;
COMMIT;
ACID Özellikleri
| Özellik | Ne Demek? |
|---|---|
| Atomicity | Transaction ya tamamen tamamlanır ya hiç — yarım kalmaz |
| Consistency | DB kısıtları (FK, UNIQUE) transaction sonrası geçerli kalır |
| Isolation | Eş zamanlı transaction'lar birbirini bozmaz |
| Durability | COMMIT sonrası veri disk arızasında bile korunur |
Isolation Levels (InnoDB)
| Seviye | Phantom Read | Non-repeatable Read | Ne Zaman? |
|---|---|---|---|
| READ UNCOMMITTED | Var | Var | Neredeyse hiç kullanılmaz |
| READ COMMITTED | Var | Yok | Yüksek eşzamanlılık, gevşek tutarlılık |
| REPEATABLE READ | Yok* | Yok | InnoDB varsayılanı — dengeli |
| SERIALIZABLE | Yok | Yok | Maksimum tutarlılık, en düşük eşzamanlılık |
*InnoDB MVCC ile REPEATABLE READ'de phantom read büyük ölçüde önlenir.
-- Oturum için isolation level değiştir
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- Mevcut seviyeyi kontrol et
SELECT @@transaction_isolation;
View ve Materialized View
View (Sanal Tablo)
-- View oluştur — kayıt edilen sorgu
CREATE VIEW aktif_musteriler AS
SELECT k.id, k.ad, k.email, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
WHERE k.durum = 1
GROUP BY k.id, k.ad, k.email;
-- View'dan sorgula
SELECT * FROM aktif_musteriler WHERE siparis_sayisi > 5;
-- View güncelle
CREATE OR REPLACE VIEW aktif_musteriler AS SELECT k.id, k.ad, k.email
FROM kullanicilar k WHERE k.durum = 1;
-- View sil
DROP VIEW aktif_musteriler;
Materialized View (MySQL'de Native Yok)
MySQL/MariaDB native materialized view desteği sunmaz. Manuel yöntem:
-- Sonuç tablosunu oluştur
CREATE TABLE mat_musteri_ozet AS
SELECT k.id, k.ad, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
GROUP BY k.id, k.ad;
-- Cron ile periyodik yenile (örn. her gece 03:00)
TRUNCATE TABLE mat_musteri_ozet;
INSERT INTO mat_musteri_ozet
SELECT k.id, k.ad, COUNT(s.id) AS siparis_sayisi
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
GROUP BY k.id, k.ad;
Yoğun sorgu çekilen raporlama tablolarında bu yaklaşım anlamlı performans kazancı sağlar.
Yedekleme: mysqldump, mariabackup, Binlog
Detaylı yedekleme stratejisi için veritabanı yedekleme rehberimize bakın. Temel komutlar:
# mysqldump — mantıksal yedek (küçük-orta DB)
mysqldump -u root -p --single-transaction --quick \
site_db | gzip > /backups/site_$(date +%Y%m%d).sql.gz
# Tüm veritabanları
mysqldump -u root -p --single-transaction --all-databases \
| gzip > /backups/all_$(date +%Y%m%d).sql.gz
# Geri yükleme
gunzip < /backups/site_20260510.sql.gz | mysql -u root -p site_db
# mariabackup — fiziksel yedek (büyük DB, sıfır downtime)
mariabackup --backup --target-dir=/backups/mb_full \
--user=root --password=SIFRE
# Binary log (incremental, PITR)
# /etc/mysql/mariadb.conf.d/50-server.cnf:
# log_bin = /var/log/mysql/binlog
# binlog_format = ROW
Büyükweb hosting: cPanel paketlerimizde JetBackup ile haftalık otomatik yedekleme harici sunuculara yapılır. Günlük veya saatlik PITR gerekiyorsa yukarıdaki cron + binlog kurulumunu kendi VDS'inize uygulayın.
User ve Privilege Yönetimi
-- Kullanıcı oluştur
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'guclu_sifre';
CREATE USER 'raporcu'@'%' IDENTIFIED BY 'guclu_sifre'; -- tüm IP
-- Yetki ver
GRANT SELECT, INSERT, UPDATE, DELETE ON site_db.* TO 'appuser'@'localhost';
GRANT SELECT ON site_db.* TO 'raporcu'@'%';
-- Tek tabloya yetki
GRANT SELECT ON site_db.kullanicilar TO 'readonly'@'localhost';
-- Yetkileri yenile (MariaDB 10.4+ otomatik; eski sürümlerde gerekli)
FLUSH PRIVILEGES;
-- Kullanıcı yetkilerini gör
SHOW GRANTS FOR 'appuser'@'localhost';
-- Yetki iptal et
REVOKE DELETE ON site_db.* FROM 'appuser'@'localhost';
-- Kullanıcı sil
DROP USER 'eski_kullanici'@'localhost';
-- Mevcut kullanıcıları listele
SELECT user, host FROM mysql.user;
Güvenlik kuralı: Her uygulama için ayrı kullanıcı, sadece ihtiyaç duyduğu yetki. Root kullanıcıyı uygulama bağlantısı için kullanmayın. '%' yerine mümkünse spesifik IP/host belirtin.
Performans Temeli: EXPLAIN, slow_query_log, OPTIMIZE TABLE
EXPLAIN ile Sorgu Planı Okuma
EXPLAIN SELECT k.ad, COUNT(s.id)
FROM kullanicilar k
LEFT JOIN siparisler s ON k.id = s.musteri_id
WHERE k.durum = 1
GROUP BY k.id;
Kritik EXPLAIN sütunları:
| Sütun | İyi | Kötü |
|---|---|---|
| type | ref, range, eq_ref, const | ALL (tam tablo tarama) |
| key | index adı var | NULL (index kullanılmıyor) |
| rows | Küçük sayı | Milyon+ (gereksiz tarama) |
| Extra | Using index | Using filesort, Using temporary |
type=ALL görürseniz: ilgili WHERE/JOIN sütununa index ekleyin.
-- EXPLAIN ANALYZE (MariaDB 10.9+, MySQL 8.0.18+) — gerçek çalışma süresi
EXPLAIN ANALYZE SELECT * FROM siparisler WHERE durum = 'beklemede';
slow_query_log
# /etc/mysql/mariadb.conf.d/50-server.cnf
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
# pt-query-digest ile slow log analiz (Percona Toolkit)
pt-query-digest /var/log/mysql/slow.log | head -50
OPTIMIZE TABLE
-- Tablo parçalanmasını gider (InnoDB: rebuild yapar)
OPTIMIZE TABLE siparisler;
-- Birden fazla tablo
OPTIMIZE TABLE kullanicilar, siparisler, urunler;
Dikkat:
OPTIMIZE TABLEInnoDB'de tablo rebuild yapar — büyük tablolarda süre alır ve kısa kilitlenmeye neden olabilir. Production saatlerinde dikkatli kullanın.
cPanel'de MySQL Yönetimi: Sınırlamalar ve Geçici Çözümler
Büyükweb cPanel hosting paketlerinde MySQL/MariaDB yönetimi:
- MySQL Databases UI: DB oluşturma, kullanıcı atama, yetki verme — temel işlemler için yeterli. Detaylı DDL ve EXPLAIN için yetersiz.
- phpMyAdmin: Tablo yapısı, basit sorgular, küçük dump import/export. phpMyAdmin rehberimize bakın.
- Kaynak limitleri: CloudLinux LVE ile CPU/RAM sınırı uygulanır. Ağır sorgular bu limiti tetikler; optimize edilmemiş JOIN veya tam tablo taraması sorun çıkarır.
- MySQL Workbench remote bağlantı: cPanel > Remote MySQL menüsünden bağlanacağınız IP'yi whitelist'e eklemeniz gerekir.
cPanel > Veritabanları > Remote MySQL > IP ekle
Sonra: mysql -h hosting.buyukweb.com -u kullanici -p
cPanel'de yapılamayan şeyler: my.cnf değişikliği, global değişken ayarı (innodb_buffer_pool_size), binary log yönetimi. Bunlar için VDS tercih edin.
Büyükweb Altyapısı: cPanel + MariaDB 10.6 + Redis
| Bileşen | cPanel Hosting | VDS |
|---|---|---|
| DB motoru | MariaDB 10.6 LTS | Tercihli MariaDB/MySQL |
| Yönetim | cPanel UI + phpMyAdmin | Komut satırı + my.cnf tam kontrol |
| Yedekleme | JetBackup haftalık | Müşteri sorumluluğu (cron + mariabackup) |
| Redis | Object Cache (eklenti) | Dedicated Redis kurulumu |
| Replikasyon | Desteklenmez | Desteklenir — detay: replikasyon rehberi |
| Kaynak | CloudLinux LVE paylaşımlı | Dedicated CPU/RAM |
VDS için İstanbul Tier III sertifikalı DataCasa veri merkezimizde dedicated MariaDB kurulumu, my.cnf optimizasyonu ve replikasyon yapılandırması yapabilirsiniz. Performans tuning için MySQL performans rehberimize bakın.
Sıkça Sorulan Sorular
MySQL mı MariaDB mı?
MariaDB, MySQL 5.5'ten fork alındı; çoğu sözdizimi ve araç uyumlu. MariaDB'nin avantajları: Galera Cluster native, gelişmiş query optimizer, Aria depolama motoru. MySQL 8.0'ın avantajları: JSON tablo fonksiyonları, window functions daha olgun, Oracle aktif geliştirme. Büyükweb cPanel hosting'de MariaDB 10.6 LTS kullanılır; her ikisiyle yazılan SQL büyük ölçüde taşınabilir.
JOIN'ler yavaş, ne yapayım?
EXPLAIN ile type=ALL var mı kontrol edin. JOIN sütunlarına (ON koşulu) index ekleyin. Gereksiz sütun seçmeyin (SELECT * yerine ihtiyaç duyulan sütunlar). Çok tablolu karmaşık JOIN'leri parçalara bölün veya geçici tablo kullanın.
Stored procedure mantıklı mı?
Raporlama ve batch işlemler için evet; uygulama iş mantığı için hayır. Modern uygulamalarda iş mantığı uygulama katmanında — test edilebilir, versiyon kontrollü, framework bağımsız. Stored procedure test ve CI/CD entegrasyonu zorlaştırır.
Transaction her zaman gerekli mi?
Birden fazla tabloyu birlikte değiştiriyorsanız (örn. sipariş + stok güncelleme) transaction şart. Tek tablo tek satır güncellemede InnoDB zaten implicit transaction kullanır. Uzun süreli transaction'lardan kaçının — kilit tutma süresini uzatır.
EXPLAIN nasıl okunur?
type sütununa bakın: ALL kötü (tam tarama), ref/range/eq_ref iyi (index kullanıyor). key NULL ise index kullanılmıyor demek. rows çok yüksekse sorgu gereğinden fazla veri tarıyor. Extra sütununda Using filesort veya Using temporary varsa sıralama veya gruplama pahalı — index veya sorgu yapısını gözden geçirin.
phpMyAdmin yetersiz kaldığında ne kullanmalıyım?
Karmaşık sorgu geliştirme ve analiz için DBeaver (ücretsiz, çoklu DB) veya MySQL Workbench kullanın. Remote bağlantı için cPanel > Remote MySQL'den IP whitelist gerekli. Otomasyon ve büyük dump işlemleri için her zaman komut satırı (mysql, mysqldump) tercih edin.
Sonuç
MySQL/MariaDB sysadmin akışı: doğru charset ile DB oluşturma, CRUD'ta WHERE filtresi zorunluluğu, JOIN'lerde index gerekliliği, transaction ile veri tutarlılığı ve EXPLAIN ile sorgu doğrulama — bu beş adım temel yönetim kalitesini belirler. Büyükweb cPanel hosting'de MariaDB 10.6 + JetBackup ile başlangıç altyapısı hazır; ölçek için VDS'e geçişte dedicated MySQL yapılandırması ve replikasyon yapılandırabilirsiniz.
Destek için: 0850 302 60 70 veya iletişim sayfamız.
İlgili Büyükweb Hizmetleri
Veritabanı ve hosting altyapısı için paketler:
- cPanel Web Hosting — MariaDB 10.6 + phpMyAdmin + JetBackup dahil
- VDS Sunucu — Dedicated MariaDB, root erişim, tam my.cnf kontrolü
- E5 v4 VDS — Yüksek IOPS NVMe, replikasyon ve yedekleme için ideal
- WordPress Hosting — LiteSpeed + Redis Object Cache
- Fiziksel Dedicated — Maksimum kaynak, üretim DB için
Sorularınız için 0850 302 60 70 numaralı satış öncesi destek numaramıza ulaşabilirsiniz.
Veritabanı Yönetimi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:


