Buyukweb
MySQL/MariaDB Veritabanı Yönetimi: Bağlantı, CRUD, JOIN, Transaction ve EXPLAIN (2026)

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.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü16 dakika okuma

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.

Buyukweb 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ı Buyukweb 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; mysqldump komut 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', '[email protected]', 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 = '[email protected]' 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.id için siparisler.musteri_id sü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

Buyukweb 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 TABLE InnoDB'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

Buyukweb 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.

Buyukweb 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 Bursa Tier 3 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. Buyukweb 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. Buyukweb 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:

Sorularınız için 0850 302 60 70 numaralı destek hattımıza yazabilirsiniz.

Veritabanı Yönetimi İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#MySQL#veritabanı yönetimi#SQL sorguları#MySQL optimizasyon#indeks#mysqldump#phpMyAdmin#MariaDB

Bu yazıyı paylaş