En iyi veritabanı optimizasyon teknikleri nelerdir?

Merhaba sevgili okurlar,

Veritabanlarını optimize etmek, bir arabanın en iyi performansa göre ince ayarını yapmaya benzer. İşte süper etkili bulduğum bazı püf noktaları:

  1. Index Oluşturma: Indexleri, veritabanınızın bir şeyleri hızlı bir şekilde bulmak için kullandığı kısayollar olarak düşünün. İyi organize edilmiş bir dosyalama sistemine sahip olmak gibidirler; bu bir kayıtları bulmayı kolaylaştıracaktır. İlk sırayı ixdexleme alıyor.
  2. Sorgu Optimizasyonu: Sorgu yazmak bir sanattır. SELECT * kullanmak gibi tembel alışkanlıklardan kaçınmak işleri gerçekten hızlandırabilir.
  3. Normalleştirme: Her şey verilerinizi düzenli tutmak ve gereksiz karmaşıklıktan kaçınmak arasında doğru dengeyi bulmakla ilgilidir.
  4. Bölümleme: (Partitioning) Büyük tabloları daha küçük parçalara bölmek, veritabanınızın önemli olana odaklanmasına yardımcı olur. Bu, büyük bir pizzayı dilimlere bölmek gibidir; yönetimi ve servisi daha kolaydır.
  5. Disk Optimize Etme: Çok hızlı bir sabit sürücüden ışık hızında bir SSD’ye yükseltmenin bilgisayarınıza turbo yüklemesi gibi, disk G/Ç’yi optimize etmek de veritabanınızın uçmasını sağlayabilir.
  6. Önbelleğe Alma:(Caching) Sık erişilen verileri hafızada saklamak, en sevdiğiniz atıştırmalıkları kolunuzun ulaşabileceğiniz yerde tutmak gibidir. Her yemek istediğinde kilere (veya veri tabanına) koşmana gerek yok!
  7. Bağlantı Havuzu: (Connection Pooling) Bağlantı havuzu oluşturmayı veritabanı bağlantıları için araç paylaşımı olarak düşünün. Sürüşü paylaşarak zamandan ve kaynaklardan tasarruf sağlar.
  8. Düzenli Bakım: (Maintenance) Arabanızdaki yağı değiştirmek gibi, düzenli bakım da veritabanınızın sorunsuz çalışmasını sağlar. Bu en heyecan verici görev değil, ancak uzun vadede büyük fayda sağlıyor.

Performansı artırmada hangi veritabanı optimizasyon tekniklerini en etkili buluyorsunuz? Bu teknikleri projelerinizde uygulamaya ilişkin deneyimlerinizi ve öngörülerinizi yorumlar bölümünden paylaşabilirsiniz.

SQL sorgularını 23x hızlandırmak mümkün mü?

Merhaba, Senaryomuzda 700.000’den fazla kaydın bulunduğu gönderim tablomuz korkunç bir performans sergiliyor. Tablodan veri almak için gereken maksimum süre 6 saniyeden fazla.

Sorgu oldukça basitti. Elimizde olan tek şey 4 join, birkaç where cümleciği (yaklaşık 4), order( created_at time alanında DESC), sınırlama

Sorun kaynağı çözümlemesi..

Gönderim tablomuzda karşılaştığımız büyük yavaşlamaya neden olan birkaç nokta şunlar:

Çözüm 1: Index oluşturma

İnsanlar milyonlarca satırla boğuşuyor, bizimki bunun sadece basit bir örnek, yani yanlış yaptığımız bir şeyler olmalı. Doğru indeksleme size sorgularınızda hız açısından çok yardımcı olacaktır. İlk düşüneceğimiz nokta bu.

Herhangi bir optimizasyon olmadan her şeyin çalıştırılması index ekledikten sonra ortalama 2,3 saniye‘ye düştü. (elbette bu süre yalnızca sorgunun veritabanı üzerinde çalıştırılma süresini içermez, aynı zamanda verilerin ağ üzerinden yayılması süresini de içerir)

Sütunlara indekslemeyi ekledikten sonra, sürenin kısaldığını öğrencik, ancak bu yeterli değil. Hâlâ 2 saniye civarında ve çoğu zaman bundan daha fazla sürede yanıt dönüyor.

Çözüm 2: Boş Dize (Empty string) hatası

Kullanıcı herhangi bir girişe herhangi bir şey yazmadıysa, bu çoğunlukla sayfanın ilk yüklendiği ve API çağrısının herhangi bir filtreleme olmadan yalnızca en son verileri almak için yapıldığı sırada gerçekleşir.

Yani kısacası string alan tipi içerisindeki “” değerlerini empty/null gibi tanımladığımızda sorgu süresi 2,3 saniyeden 1,3 saniyeye indi.

Tamam, doğru yönde ilerliyoruz. Tam 1 saniyeyi kısalttık ama yine de 200/150 ms’nin altına inmek zorundayız, yani daha gidecek çok yolumuz var.

Çözüm 3: Gereksiz birleştirmeler (Join)

Gönderimleri sorgularken zorunlu olmayan tablolarla birleştirmeler yapıyoruz. Bu yüzden koda tüm bunlar eklendiğinde onu kaldırdık ama bu, inceleyenlerin pek fazla dikkat etmediğini gösteriyor

Çözüm 4: ORM

TypeORM’in geliştiricilere JSON benzeri nesneleri kullanarak SQL sorguları oluşturmamızı sağladığı aktif kayıt modeli adı verilen bir şey var, bir örnek ile anlatmak gerekirse,

Bu geliştirmeyi hızlı ve kolay hale getirir ve ham SQL sorguları yazma konusunda iyi olmayan bir geliştirici için çok sezgisel hissettirir, bu yöntem ile kelimenin tam anlamıyla SQL sorguları oluşturmak için JSON nesneleri oluşturuyorsunuz.

Bu yaklaşım iyi görünüyor ve çoğu zaman işe yarıyor ama bizim durumumuzda çok aptalca bir şey yapıyordu, sorguyu kendiniz görebilmeniz için ne yaptığını yazmayacağım.

Kısaca iki sorgu çalıştırıyordu, öncelikle bu durumda hiç ihtiyaç duyulmuyordu, daha sonra yazıp test ettiğim basit ve tek bir sorguyla kolaylıkla yapılabilirdi.

Yalnızca iki ayrı sorgu çalıştırmakla kalmıyordu, aynı zamanda dört tabloyu her iki sorgu için de iki kez birleştiriyor ve ardından da sıralıyordu. her ikisinde de iki kez. (Bu kelimenin tam anlamıyla hiçbir anlam ifade etmiyor)
Performansın en çok darbe aldığı yer burasıydı. Aşağıdaki sorgulara kendiniz bir göz atın.

2 ayrı sorguyla yapmaya çalışılan şeyin aynısını yapmak için basit bir tek SQL sorgusu yazıldı

Ve bu sorguyu çalıştırdığımızda sadece 100 ms’de çalıştı.

Böylece 1,3 saniyeden 100 ms’ye , Genel olarak 2,3 saniyeden 100 ms’ye indik.

Bu da 23 kattan fazla performans artışı anlamına geliyor .

Okuduğunuz için teşekkür ederim.

Performans ve Hız Testi: MongoDB vs MySQL

MySQL ve MongoDB arasındaki performans farkını uzun zamandır test etmek istiyordum, sonunda zaman bulup, araştırmalarıma başladım. Neredeyse 2 gün sürdü (çok fazla veriyi test ettiğim için uzun zaman aldı) En sonda vermem gereken bilgiyi en başta vereyim. Sonuç: MongoDB‘nin MySQL‘e göre yaklaşık% 50 daha hızlı. Bu gerçeği aranızda bilenler olabilir, ancak bu iki teknoloji arasındaki performansı bizzat incelemek heyecanlı, sonuç ise şaşırtıcı. Çünkü fark çok ciddi.

Şimdi size bu testlerde kullanılan dilleri açıklayayım. Ruby on Rails 3.2.8, MySQL 5.1.44, mysql2 gem (0.3.11), mongoid gem (3.0.14) ve MongoDB (2.2.0) kullanıldı. Benim planım N + 1 Sorgu Problemini çözmede daha iyi bir performansa sahip olanı görmek, böylece çok fazla miktarda veri içeren 2 tablo veri hazırladım. Tablo hotels (ana tablo) 4.450 satırlık kayda sahip ve Table hotel_reviews 75.650 satırlık veriye sahip. Okumaya devam et “Performans ve Hız Testi: MongoDB vs MySQL”

PostgreSQL ve MySQL Karşılaştırması

Merhaba, Projeleriniz için hangi veritabanını kullanacağınızı düşünürken, tüm açık kaynak RDBMS’lerin aynı olduğunu düşünerek hata yapmayın!

PostgreSQL ve MySQL arasında radikal farklılıklar var. İki sistem arasındaki farklılıkları değerlendirdikten sonra bilinçli bir karar verilmelidir.

PostgreSQL ve MySQL arasındaki en yaygın olarak değerlendirilen özelliklerin benzerlik ve farklılıklarının bir özetini bu makale içerisinde bulabileceksiniz. Okumaya devam et “PostgreSQL ve MySQL Karşılaştırması”

PHP Kullanarak MySQL Veritabanını Yedekleme

Veritabanı yedekleme, her web geliştirici için olmazsa olmaz işlemlerdendir. Düzenli veritabanı yedekleme, verileri kaybetme riskini önler ve herhangi bir sorun oluştuğunda veritabanını geri yüklemeye yardımcı olur. Bu nedenle, mümkün olduğunca sık olarak veritabanını yedeklemek iyi bir fikirdir.

Blog sayfamı takip edenler için yaklaşık 3 yıl önce burada bir yedekleme mekanizması paylaşmıştım. Uzun zamandır ben de cronlar (zamanlanmış görevler) aracılığıyla buradaki mekanizmadan yararlanarak yedeklerimi alıyorum. Bu makalemde veritabanı yedekleme işlemini yazılımsal olarak geliştirerk bir fonksiyona bağlayacağım. Siz de bunu basitçe kullanacaksınız.

Aslında mySQL veritabanını bir dosyada yedeklemenin birçok yolu vardır. Barındırma sunucusundan tek bir tıklamayla yada arayüz programları aracılığıyla veritabanını yedekleyebilirsiniz. Bunlar hep geliştiriciye iş yükü getiren işlemlerdir. Bu arayüzlerden bağımsız olarak ta yedeklerinizi alabilirsiniz. (PHP aracılığıyla)

Peki arayüz ile değil de PHP üzerinden veritabanı yedeği almak bize ne gibi artılar kazandırır?

Yukarıda belirttiğim gibi arayüzler ile yedek almanız her zaman size iş yükü çıkaracaktır. Örneğin yedek almayı unuttuğunuz bir dönem olabilir. Bu dönemde olası yaşayacağınız bir veri kaybının geri dönüşü olmayacaktır. Ancak veritabanını aşağıda göstereceğim yöntemle yazılımsal olarak fiziksel bir dizine aldığımızda, bunu tetikleyen PHP dosyamızı da bir cron’a (zamanlanmış görev) tanımladığımızda (her gün saat 12:00’da yedek al) bu işlemi otomatiğe bağlamış olacağız. Sistem bir nevi kendi işini kendi halletmiş olacak. Bize de yedekleri belirli aralıklarla kontrol etmek kalacak.

Hemen aşağıda MySQL veritabanını yedeklemek ve bir SQL dosyasına kaydetmek için bir PHP betiği oluşturacağız.

PHP’yi kullanarak MySQL Veritabanı Yedekleme

Yedekleme için gerekli tüm PHP kodlarımı backupDatabaseTables() fonksiyonunda birlikte toplayacağım. backupDatabaseTables() fonksiyonunu kullanarak belirli tabloları veya tüm tabloları bir veritabanından kolayca yedekleyebilirsiniz. MySQL veritabanını PHP kullanarak yedeklemek için aşağıdaki parametreler gereklidir.

  • $dbHost Zorunlu. Veritabanının ana sunucusunu belirtir.
  • $dbUsernameZorunlu. Veritabanı kullanıcı adını belirtir.
  • $dbPasswordZorunlu. Veritabanı şifresini belirtir.
  • $dbNameZorunlu. Yedeklemek istediğiniz veritabanı adını belirtir.
  • $tablesİsteğe bağlı. Virgül ile ayrılmış dizge veya dizideki tablo adlarını belirtir. Veritabanının tüm tablolarını yedeklemek için bu parametreyi atlayın.

Kullanımı:

MySQL veritabanı yedeğini oluşturmak ve bir SQL dosyasına kaydetmek için  backupDatabaseTables() fonksiyonunu kullanmanız yeterlidir.

Bir sonraki makalede görüşmek üzere. Soru, görüş ve önerilerini yorum bölümünden paylaşabilirsiniz. Sağlıklı, huzurlu günler dilerim.

MySQL Veritabanını PHP Kullanarak SQL Dosyasından Geri Yükleme

Merhaba, veritabanı geri getirme yada import işlemleri bildiğiniz üzere genellikle, phpMyAdmin’in içe aktarma bölümünden, yada veritabanı işlem programlarının restore bölümlerinden yapılır. MySQL veritabanlarının tablolarını ve datalarını geri yüklemek için çeşitli seçenekler mevcuttur. SQL dosyasını veritabanına aktarmak için barındırma sunucunuza, arayüz araçlarına yada phpMyAdmin’e giriş yapmanız gerekir. Ancak, bu işlem PHP kod betikleri ile de yapılabilir. Bu makalede PHP betikleri yardımıyla DB restore işlemini öğrenmiş olacaksınız.

PHP dosyasından veritabanını geri yüklemek, kullanıcının web uygulamasından veritabanını geri yüklemesine izin vermek istediğinizde çok işinize yarayacak bir işlemdir. Tabi bir o kadar da tehlikeli bir işlemdir. MySQL veritabanı tablolarını içe aktarmak için önce veritabanının yedeğinin alınması gerekir. Bu makalede, PHP’yi kullanarak SQL dosyasından veritabanını nasıl geri yükleyeceğimizi göstereceğim. Basit PHP betiğimiz, MySQL veritabanını SQL dosyasından geri yüklemeye yardımcı olacak.

PHP kullanarak MySQL Veritabanı Geri Yükleme

Daha işlevsel kullanılabilirlik için tüm PHP kodlarını restoreDatabaseTables() fonksiyonunda topladım. PHP aracılığıyla restoreDatabaseTables() fonksiyonunu kullanarak, veritabanındaki tabloları .sql dosyasından geri yükleyebilirsiniz. MySQL veritabanını geri yüklemek için aşağıdaki parametreler gereklidir.

  • $dbHost Zorunlu. Veritabanının ana sunucusunu belirtir.
  • $dbUsernameZorunlu. Veritabanı kullanıcı adını belirtir.
  • $dbPasswordZorunlu. Veritabanı şifresini belirtir.
  • $dbNameZorunlu. Yedeklemek istediğiniz veritabanı adını belirtir.
  • $filePathZorunlu. SQL dosyasının, tabloların geri yükleneceği yolu belirtir.

Kullanımı:

SQL dosyasından MySQL veritabanını geri yüklemek için yukarıda yazmış olduğumuz restoreDatabaseTables() fonksiyonunu kullanmamız yeterli.

Makalemi okuduğunuz için teşekkür ederim. Bir sonraki makalede görüşmek üzere. Soru, görüş ve önerileriniz için alt taraftan yorum bölümünü kullanabilirsiniz. Sağlıkla, huzurla kalın.

Exit mobile version