İletişim

MySQL Nedir?

Kısa tanım

MySQL, 1990'ların ortasında İsveçli MySQL AB tarafından geliştirilen ve bugün Oracle'ın sahibi olduğu ilişkisel veritabanı yönetim sistemidir. Topluluk sürümü GPLv2 lisansıyla açık kaynak olarak, kurumsal sürümleri ise ticari lisansla sunulur. Varsayılan depolama motoru InnoDB; işlemleri, satır düzeyinde kilitlemeyi ve yabancı anahtarları destekler. WordPress dahil birçok web uygulamasının ve paylaşımlı hosting ortamının standart veritabanıdır.

Diğer adları: MySQL Server, MySQL Community Edition

Web uygulamasının yazma işlemlerini MySQL ana sunucusuna, okuma sorgularını binlog ile eşitlenen kopya sunucuya gönderdiği yapı

Kısa tarihçe ve lisans

MySQL ilk olarak 1995'te İsveçli MySQL AB şirketi tarafından yayımlandı. Şirket 2008'de Sun Microsystems'e, Sun da 2010'da Oracle'a satıldı; MySQL o tarihten bu yana Oracle tarafından geliştiriliyor. Lisans modeli ikilidir: Oracle, veritabanı sunucusunu ve istemci kütüphanelerini GPLv2 altında açık kaynak olarak yayımlar; MySQL'i kendi kapalı kaynak ürününe gömüp dağıtmak isteyen ve GPL yükümlülüklerini üstlenmek istemeyen şirketlere ise ticari lisans satar. Enterprise sürümleri ek araçlar ve destek içerir.

Oracle satın alımının ardından MySQL'in özgün geliştiricilerinden bazıları 2009'da MariaDB adlı bir çatal (fork) başlattı. İki proje uzun süre büyük ölçüde uyumlu kaldı, ancak yıllar içinde özellikler ve sürüm numaraları ayrıştı; birini diğerinin birebir yerine geçen bir sürüm olarak varsaymadan önce kullanılan özellikler kontrol edilmelidir.

InnoDB ve kümelenmiş indeks

MySQL, tabloların fiziksel olarak nasıl saklanacağını değiştirilebilir depolama motorlarına bırakır. Bugün varsayılan ve fiilen tek ciddi seçenek InnoDB'dir: işlemleri, satır düzeyinde kilitlemeyi, çökme sonrası kurtarmayı ve yabancı anahtar denetimini sağlar. Eski projelerde hâlâ karşılaşılan MyISAM ise işlem ve yabancı anahtar desteğinden yoksundur.

InnoDB'nin en önemli tasarım özelliği, tablo verisini birincil anahtar sırasına göre dizilmiş bir B-tree içinde tutmasıdır (clustered index). İkincil indeksler satırın adresini değil birincil anahtar değerini saklar. Bunun iki pratik sonucu vardır:

  • Uzun bir birincil anahtar (ör. 36 karakterlik metin UUID) tablodaki bütün indeksleri büyütür.
  • Rastgele dağılan anahtarlar her eklemede ağacın farklı bir yerine yazıldığı için sayfa bölünmelerine ve parçalanmaya yol açar. Artan tamsayılar ya da zamana göre sıralanan kimlikler eklemeyi ağacın sonuna yığar.

Başka bir veritabanından gelenleri şaşırtan farklar

  • Yalıtım seviyesi: InnoDB'de varsayılan REPEATABLE READ'dir; PostgreSQL'de ise Read Committed. Aynı uygulama kodu iki sistemde eşzamanlı yük altında farklı davranabilir. Ayrıntılar veritabanı işlemi maddesinde.
  • Yabancı anahtar indeksi: InnoDB, yabancı anahtar sütununda uygun bir indeks yoksa onu kendisi oluşturur. ON DELETE SET DEFAULT ise sözdizimi olarak tanınsa da InnoDB tarafından reddedilir.
  • utf8 ile utf8mb4: MySQL'de tarihsel olarak utf8, karakter başına en fazla 3 bayt kullanan utf8mb3'ün takma adıdır ve emoji gibi 4 baytlık karakterleri saklayamaz. Tam Unicode için utf8mb4 gerekir; MySQL 8.0'dan itibaren varsayılan budur, ama eski veritabanlarından taşınan tablolar kontrol edilmelidir.
  • Esnek mod alışkanlıkları: Eski kurulumlarda katı olmayan sql_mode ayarları, sütuna sığmayan veriyi hata vermeden kırpabiliyordu. Tablolar yeni bir sürüme taşınırken bu tür örtük davranışlara güvenen kod ortaya çıkar.

Sürüm modeli

Oracle, MySQL için iki ayrı hat izler. LTS sürümleri (ör. 8.4) yalnızca gerekli düzeltmeleri alır ve uzun süre desteklenir; Innovation sürümleri yeni özellikleri, davranış değişikliklerini ve kaldırmaları getirir ama yalnızca bir sonraki Innovation sürümüne kadar desteklenir. Üretimdeki bir web uygulaması için genellikle LTS hattı tercih edilir; sürüm geçişlerinin kuralları MySQL belgelerinde ayrıntılı olarak açıklanır.

Nerede karşınıza çıkar?

MySQL, LAMP yığınının (Linux, Apache, MySQL, PHP) “M”sidir ve WordPress, birçok e-ticaret altyapısı ve paylaşımlı hosting paketlerinde varsayılan veritabanıdır. Binary log tabanlı replikasyonla okuma yükünü kopyalara dağıtmak yaygın bir kullanımdır. PostgreSQL ile arasındaki seçim çoğu zaman teknik üstünlükten çok ekibin deneyimine, barındırma ortamına ve kullanılan uygulamanın desteklediği veritabanlarına göre yapılır.

İlgili terimler

← Sözlüğe dön