PostgreSQL, genişletilebilirlik ve standart uyumluluğuna önem veren bir nesne-ilişkisel veri tabanı yönetim sistemidir (ORDBMS). MySQL ise, açık kaynaklı bir ilişkisel veri tabanı yönetim sistemidir (RDBMS). Her ikisi de Amazon, Google ve Microsoft dahil olmak üzere tüm büyük bulut hizmeti sağlayıcıları tarafından desteklenir.
MySQL çok daha hızlı olarak algılanır ancak daha az özellik sunar. PostgreSQL’in ise daha derin bir özellik kümesi vardır. Bazı programcılar PostgreSQL’in Oracle’a benzediğini düşünür, bu yüzden Oracle ürünlerini bilenler tarafından sıklıkla tercih edilir.
MySQL, güçlü bir takipçi kitlesi olsa da, her iki ürünün mevcut sürümleri (MySQL 8 ve PostgreSQL 12) yüksek miktarda hız, güç ve dinamiklik sağlayan yeni özelliklere sahiptir.
Veri Tabanı Yönetim Sistemi (DBMS) Nedir?
Veri tabanları, bilgi veya veri kümelerinin modelleridir. Bir veri tabanı yönetim sistemi, bir veri tabanı ile etkileşime giren bir programdır. DBMS, bir veri tabanına erişimi kontrol eder, verileri yazar, sorguları çalıştırır ve veri tabanı yönetimi ile ilgili diğer görevleri gerçekleştirir. Tanımlardan da anlayacağınız gibi veri tabanı ve veri tabanı yönetim sistemleri aynı şeyler değildir.
Veri tabanı yönetim sistemi ile veri tabanı arasındaki farklar aşağıdaki şekildedir:
- Bir veri tabanı yönetim sistemi, bir veri tabanı ile etkileşime giren bir yazılımdır.
- Bir veri tabanı bir veri koleksiyonudur ve mutlaka bir bilgisayarda saklanması gerekmez.
Veri tabanı sistemleri, verilerin nasıl depolandığını ve erişildiğini yapılandıran temel modellere sahiptir. İlişkisel veri tabanı yönetim sistemleri, ilişkisel bir veri modeli kullanır. Bu, verilerin resmi olarak ilişkiler olarak bilinen tablolar halinde düzenlendiği anlamına gelir. Bir ilişki, bir tablodaki bir satırlar kümesidir ve her bir satır, bir dizi sütunu paylaşır.
Her sütun, sütunda izin verilen giriş türlerini belirleyen bir veri türü atanır. Farklı RDBMS’ler, her zaman birbiriyle değiştirilemeyen farklı veri türlerine sahiptir.
Yapılandırılmış sorgulama dili (SQL), ilişkisel veri tabanlarının verilerini yönetmesi ve sorgulaması için popüler bir yoldur. Bununla birlikte, birçok RDBMS’nin belirli sınırlamaları ve uzantıları olabilen kendi SQL lehçeleri vardır. Uzantılar genellikle, kullanıcıların standart SQL ile zor olabilecek karmaşık sorguları gerçekleştirmesine izin vermek için oluşturulur. Programlama dillerinden aşina olabileceğiniz yaygın veri türleri arasında tarihler, diziler, tamsayılar ve mantıksal değerler bulunur.
Veri Tabanı Kısıtlaması Nedir?
Bir veri tabanı yöneticisi, bir sütun veya tüm veri grubuna (satır) hangi değerlerin girilebileceğini sınırlayabilir. Ortak SQL kısıtlamaları aşağıdakileri içerir:
UNIQUE: Bir sütundaki iki giriş aynı olamaz.
NOT NULL: Sütun boş değerlere sahip olamaz.
PRIMARY KEY: Bir sütundaki her giriş boş değildir ve benzersizdir.
FOREIGN KEY: Başka bir tablodaki birincil anahtarı ifade eder.
CHECK: Bir sütuna girilebilecek değer aralığını sınırlar.
DEFAULT: Belirli bir sütun için varsayılan bir değer sağlar.
INDEX: Verilerin daha hızlı alınmasını sağlar.
PostgreSQL
PostgreSQL, en gelişmiş açık kaynaklı ilişkisel veri tabanıdır. Amacı, son derece genişletilebilir ve standartlara uyumlu olmaktır. Standartlarla uyumlu olmak, veri tabanınızı başka türde bir SQL sunucusuna geçirmenizi kolaylaştırır. Genellikle nesne veri tabanlarıyla ilişkilendirilen tablo devralma ve işlev aşırı yükleme gibi özelliklere sahiptir. PostgreSQL kullanan şirketler arasında Apple, BioPharm, Etsy, IMDB, Macworld, Debian, Fujitsu, Red Hat, Sun Microsystem, Cisco ve Skype yer alır.
PostgreSQL, performansı artırmak için güçlü özellikler geliştirmiştir. Bu özellikler aşağıdakileri içerir:
- Çeşitli dizin oluşturma işlevleri.
- Asenkron replikasyon.
- Maliyet tabanlı optimizasyon.
- Eşzamansız ve eşzamanlı çoğaltma.
PostgreSQL kodlamada çok katı olsa da önde gelen bulut satıcıları, platformlarında PostgreSQL desteğine sahiptir. Ayrıca herhangi bir Postgres veri tabanı için bir REST API’si vardır.
PostgreSQL; C, C++, Java, JavaScript, .Net, R, Perl, Python, Ruby, Tcl ve diğerleri gibi programlama dillerini destekler.
PostgreSQL ayrıca bağlantılar ve sorgular gibi kullanıcı işlemleri için Erişim Kontrol Listelerine (ACL) dayalı güvenlik protokollerini yürütür.
MySQL
MySQL veri tabanları, dünyanın en yaygın kullanılan veri tabanlarıdır. Kurulumu kolaydır ve mükemmel performans seviyelerine ulaşmanız için minimum ince ayar gerektirir. Kaynak kodu, GNU GPL (Genel Kamu Lisansı) kapsamında mevcuttur. MySQL kullanan şirketler arasında GitHub, US Navy, NASA, Tesla, Netflix, WeChat, Facebook, Zendesk, Twitter, Zappos, YouTube ve Spotify bulunmaktadır.
MySQL, internetteki birçok web sitesinin belkemiğini oluşturan açık kaynaklı programların LAMP (Linux, Apache, MySQL, PHP) yığınının bir parçası olarak yaygın olarak kullanılır:
- Vikipedi
- Flickr
- Google (Arama hariç)
- Youtube
Çekirdek MySQL programı, yazılımı çalıştırmak veya veri tabanları oluşturmak ve sürdürmek için herhangi bir Grafik Kullanıcı Arayüzü aracına sahip değildir. MySQL’in kullanımını kolaylaştırmak için çeşitli front end programlar mevcuttur. Bu amaca yönelik resmi program, Oracle’ın sahibi olduğu ve geliştirdiği, ancak herkesin ücretsiz olarak kullanabileceği MySQL Workbench‘tir.
MySQL, aşağıdakiler dahil birçok Windows, Linux ve Mac platformunda çalışır:
- Ücretsiz BSD
- IRIX
- MAC OS X
- Novell Netware
- Solaris
- SCO Unixware
- Microsoft Windows
- Tru64
- QNX
- Sanos
- Symbian
MySQL; MyISAM programı aracılığıyla çapraz platform desteği, güncellenebilir görünümler, SSL desteği, bilgi şeması, sorgu önbelleğe alma, bölümlenmiş tablolar ve tam metin indeksleme özelliklerini içerir.
C ve C++ ile yazılan MySQL; C, C++, Delphi, Perl, Java, Lua, .NET, Node.js, Python, PHP, Lisp, Go, R, D ve Erlang gibi programlama dillerini destekler. MySQL ayrıca karma dizinleri destekler ve InnoDB motoru, FULLTEXT dizinleri için ters çevrilmiş listeler kullanır. Son derece esnektir, bu da onu web uygulamaları için popüler bir seçim haline getirir.
Hız ve Veri Güvenliği
Bu iki SQL veri tabanı yönetim sisteminin her ikisi de geniş güvenlik özelliklerine sahiptir.
MySQL size, kullanıcıların veri tabanlarınızda çalıştırabileceği sorguları kontrol etmek için kullanıcı yönetimi gibi özellikler sunar; bu da ayrıcalıkları sadece ayrıcalıklara sahip olması gereken kullanıcılarla sınırlandırmanıza olanak tanır. Bu özellik, MySQL ROLES ve PRIVILEGES aracılığıyla uygulanır. MySQL Enterprise’daki diğer kimlik doğrulama şemalarını kullanarak kullanıcıların kimliğini doğrulamanın yanı sıra, kullanıcılar için parola kimlik doğrulaması da ayarlayabilirsiniz. Bu şemalar arasında Linux PAM (Pluggable Authentication Modules), yerel Windows hizmetleri ve LDAP (Lightweight Directory Access Protocol) bulunur.
PostgreSQL’e gelince…
PostgreSQL, kullanıcı ve grup yönetimi için sağlam bir sisteme sahiptir ve GRANT komutlarını, SQL PRIVILEGES’i ROLES’e atamak için kullanabilirsiniz. İstemci kimlik doğrulaması, erişime izin verilen bir dizi IP adresi ve kullanıcı adı içeren bir pg_hba.conf yapılandırma dosyası aracılığıyla kontrol edilir. PAM ve Kerberos gibi harici kimlik doğrulama sistemleriyle birlikte SSL tabanlı bağlantılar da kullanılabilir.
Performans optimizasyonu, PostgreSQL’in SQL standartlarına uygunluğu sayesinde MySQL’e göre biraz daha basittir. Bu, verimli sorgular oluşturmanın yanı sıra Bitmap, B-Trees ve tam metin gibi veri tabanı sisteminde bulunan dizin aralığını kullanmayı kolaylaştırır. MySQL ile dizinler, veri ekleme, silme ve diğer işlemler için verimli logaritmik zaman işlemlerine izin veren B-Trees’te depolanır. PostgreSQL, veri tabanı görünümlerinizi hızlandırmaya yardımcı olan gerçekleştirilmiş görünümler için desteğe sahiptir, ancak bu MySQL’de yerel olarak desteklenmez. Daha iyi MySQL performansı elde etmek için SQL sorgu önbelleğe alma ve tam metin arama (FTS) gibi teknikleri kullanabilirsiniz.
Çoğaltma, Kümeleme ve Ölçeklenebilirlik
PostgreSQL ve MySQL, dağıtılmış veri tabanı yönetim sistemleri (DDBMS) kalıbına uyar. MySQL, çoğaltma söz konusu olduğunda, SQL sorgularının kullanıldığı bir master-slave yaklaşımı benimser.
PostgreSQL, çoğaltma için MySQL’in yaklaşımından daha hızlı ve daha güvenilir olan akışlı WAL (Write Ahead Log) dosyalarını kullanır. PostgreSQL replikasyonu varsayılan olarak asenkrondur, ancak senkron replikasyon da mevcuttur. PostgreSQL, sürüm 10’dan bu yana, tablo düzeyinde çoğaltmayı yürütmek için WAL kayıtlarını kullanan bir yaklaşım olan mantıksal çoğaltmayı desteklemektedir.
Hem PostgreSQL hem de MySQL, büyük tabloları sorgularınızın daha hızlı işlenebileceği daha küçük parçalara bölmek için bölümlemeyi destekler. PostgreSQL ile bildirime dayalı bölümleme ve kalıtım yoluyla bölümleme olmak üzere iki tür bölümleme mevcuttur. İkincisi, işlev olarak uygulanan kuralları veya tetikleyicileri kullanırken, birincisi, bölümleme yöntemini ve bölümleme anahtarı olarak kullanılacak sütunları veya ifadeleri belirten bölümleme bildirimlerine dayanır. Kalıtım yoluyla bölümleme, daha esnek yaklaşımlara izin verir. Bu şema MySQL’de mevcut değildir. MySQL sadece bildirime dayalı bölümleme kullanır, ancak bu bile yalnızca InnoDB ve NDB depolama motorlarında mevcuttur. PostgreSQL, birden çok indeksleme seçeneğiyle, tablo segmentlerinin boyutu büyüdükçe veri tabanı performansınızı ayarlamak için daha fazla seçenek sunar.
Güçlü Yönler ve Zayıflıklar
Bu iki ilişkisel veri tabanı yönetim sistemi pek çok uygulama için birbirinin yerine kullanılabilirken, benzersiz özellikleri ve güçleri farklı şekilde ortaya çıkar. PostgreSQL’in MySQL’den ilk büyük farkı, SQL standartlarını daha iyi desteklemesidir; PostgreSQL 12, tam SQL:2016 Core uyumluluğu için gereken 179 özelliğin en az 160’ını destekler.
Bununla birlikte, PostgreSQL, MySQL’e göre daha küçük bir topluluğa sahiptir. PostgreSQL kullanmayı denerseniz, MySQL için çalışan bazı araç ve entegrasyonlar kullanılamayabilir.
Yaygın kullanımının ve birçok yazılım aracıyla uyumluluğunun ötesinde, MySQL’in en büyük gücü, özellikle küçük projelerde kullanım kolaylığı, iyi performansı ve göreceli basitliği olabilir. Bu basitlik, hem açık kaynaklı projelerde hem de kapalı kaynaklı projelerde yazılım dünyasında yaygın olarak benimsenmesini açıklar.
MySQL, tam SQL desteğine ihtiyaç duyabileceğiniz durumlar ve MySQL performansının daha sorunlu olabileceği eşzamanlı okuma-yazma işlemlerini yoğun bir şekilde kullandığınız durumlar için çok ideal değildir.
MySQL Mi Yoksa PostgreSQL Mi Kullanmalıyım?
MySQL’in tek başına bir ürün olarak veya LAMP yığını gibi bir yığının parçası olarak kurulumu oldukça kolaydır. Artık çoğu web barındırma paketi, phpMyAdmin gibi veri tabanı yönetim yazılımı aracılığıyla da erişebileceğiniz MySQL veri tabanlarını içerir. Fakat PostgreSQL’i kendiniz kurmanız gerekebilir. Bu yüzden yeni başlayan geliştirici ve analistler için erişilebilirlik açısından MySQL daha üstündür. Ama bu yine de PostgreSQL’in belirli bir uygulama için, özellikle gelişmiş güvenlik ve yük dengelemeden yararlanabilecek yoğun kaynak kullanan uygulama için en iyi seçenek olmadığı anlamına gelmez. Ancak, MySQL daha yaygın olarak kullanıldığı için daha erişilebilirdir.
Neden MySQL’i kullanmalısınız?
- Master-slave replikasyonu ve Scale-Out desteği
- Offload raporlama ve coğrafi veri dağıtımı
- Sık kullanılan tablolar için bellek depolama motoru desteği
- Sık kullanılan ifadeler için sorgu önbelleği
- MySQL’i öğrenmek ve sorun gidermek için çok sayıda kaynak
Neden PostgreSQL’i kullanmalısınız?
İki veri tabanını karşılaştırırken, PostgreSQL’in temel avantajlarını da bilmeniz çok önemlidir. Bazı geliştiriciler, daha iyi, daha hızlı ve daha zengin işlevlerle donatıldığı düşünüldüğünden, MySQL yerine PostgreSQL’i kullanmayı seçebilir.
PostgreSQL’i seçmenin ana nedenleri aşağıdaki şekildedir:
- Tablo bölümleme, Point in Time Recovery ve İşlemsel DDL özellikleri
- Tam PKI altyapısı ile 3. taraf anahtar depolarını kullanma yeteneği
- PostgreSQL açık kaynak kodu, BSD lisansı altında dağıtıldığından, geliştiriciler, geliştirmelere geri katkıda bulunmak zorunda kalmadan kodu değiştirebilir
- Kullanıcılara ve rollere nesne düzeyinde ayrıcalıklar sağlanabilir
- AES, 3DES ve diğer veri şifreleme teknikleri için destek
- Mekansal indeksleme özellikleri
|PostgreSQL||MySQL|
|Mimari||Nesne ilişkisel; çok işlemli||İlişkisel; tek işlem|
|Desteklenen veri türleri||Sayısal, tarih/saat, karakter, mantıksal değer, numaralandırılmış, geometrik, ağ adresi, JSON, XML, HSTORE, diziler, aralıklar, bileşik||Sayısal, tarih/saat, karakter, uzamsal, JSON|
|Desteklenen indeksler||B-tree, hash, GiST, SP-GiST, GIN ve BRIN||Öncelikle B-tree; belirli veri türleri için R-tree, hash ve ters indeksler|
|Performans||Hem okuma hem de yazma işlemlerinin yüksek hacimli olduğu uygulamalar için uygundur||Yüksek hacimli okuma içeren uygulamalar için uygundur|
|Güvenlik||Erişim kontrolü, çoklu şifreli bağlantı seçenekleri||Erişim kontrolü, şifreli bağlantılar|
|Destek||Topluluk desteği. Kendi PostgreSQL sürümleri olan şirketler, bu konuda destek sunabilir.||Topluluk desteği ve satıcı tarafından sağlanan destek sözleşmeleri|
Özetle diyebiliriz ki, PostgreSQL karmaşık sorgularda MySQL’i geride bırakırken, MySQL basit sorgularda (InnoDB kullanırken) Postgres’i geride bırakır ve çok daha kullanıcı dostudur. Fakat Postgres analitik görevleri için idealdir. PostgreSQL’e kıyasla MySQL için geliştiriciler ve DBA’lar bulmak daha kolaydır.