SQL

Mysql’de Farklı bir tasarım mantığı

Mysql performansını ve sayfaların açılış sürelerini daha çok nasıl hızlandırırım” diye kafa yorduğum zamanlarda, kendim için geliştirdiğim bir tasarım mantığını sizlerle paylaşmak istedim.

Bu mantık aslında çok basit gibi görünse de ciddi bir performans artışı sağlıyor ve gereksiz yere mysql select sorgularından da bizi kurtarıyor.

Mantığın bir prensibi var. O da; mysql tablosunda bulunan bir satırda yapılan değişikliği, başka sayfaya geçtiğimde tekrardan mysql Select sorgusu atmadan gerekli veriye ulaşmaktı.

Kullanıcı bilgileri, yorumlar ve istatistik bilgileri gibi öğeler sürekli değişiklik gösterirler ve belli algoritmalar vasıtası ile sonuçlar hazırlanır ya da güncellemeler yapılır.

Mysql’de yapılan Join işlemleri uzun ve yorucudur. Yani maliyeti yüksektir. Peki bu öğeler için atılan veri tabanı sorgu sayılarını nasıl düşürebileceğiz ya da nasıl daha hızlı hale getireceğiz?

Öncelikle, PHP5.0 ile birlikte bizlere sunulan nesneye yönelik programlama (Object-Oriented Programming) özelliği sayesinde kullanılacak öğenin (kullanıcı bilgisi, yorumlar ya da istatistik gibi…) sınıf tanımlaması yapılması gerekiyor.

Not: Sınıf tanımlamalarında değişkenleri “public”, “private” ya da “protected” olarak tanımlamak size ve proje analizinize kalmış bir durum. Ben, örnek olarak kullandığım User sınıfında değişkenleri “private” olarak tanımladım ve ihtiyacım doğrultusunda set/get metodları oluşturdum. Arzu ederseniz kendiniz için bütün değişkenleri “public” yapıp set/get metodu tanımlamak zorunda kalmayabilirsiniz de.

class User {
        private $ID;
        private $ADI;
        private $SOYADI;
        private $TAKMA_ADI;
        private $SIFRE;
        private $EMAIL;
        private $YETKI;
 
        /**
         * Default Constractor
         *
         * @param MySql Object Result $dataRow
         */
        function User($dataRow) {
                $this->ID = $dataRow->ID;
                $this->ADI = $dataRow->ADI;
                $this->SOYADI = $dataRow->SOYADI;
                $this->TAKMA_ADI = $dataRow->TAKMA_ADI;
                $this->SIFRE = $dataRow->SIFRE;
                $this->EMAIL = $dataRow->EMAIL;
                $this->YETKI = $dataRow->YETKI;
        }
        /* getters */
        public function getID() {
                return $this->ID;
        }
 
        public function getADI($string ) {
                return $this->ADI;
        }
 
        public function getSOYADI() {
                return $this->SOYADI;
        }
 
        public function getTAKMA_ADI() {
                return $this->TAKMA_ADI;
        }
 
        public function getSIFRE() {
                return $this->SIFRE;
        }
 
        public function getEMAIL() {
                return $this->EMAIL;
        }
        public function getYETKI() {
                return $this->YETKI;
        }
        /* setters */
        public function setADI($value) {
                $this->ADI=$value;
        }
 
        public function setSOYADI($value) {
                $this->SOYADI=$value;
        }
        public function setTAKMA_ADI($value) {
                $this->TAKMA_ADI=$value;
        }
 
        public function setSIFRE($value) {
                $this->SIFRE=$value;
        }
 
        public function setEMAIL($value) {
                $this->EMAIL=$value;
        }
 
        public function setYETKI($value) {
                $this->YETKI=$value;
        }
}

ullanacağımız User sınıfını tanımlamış olduk.

Prensipte 5 adımımız var.
1. Ön bellek kontrolü
2. Ön bellekte objemizi yaratacağız.
3. Yarattığımız objedeki verileri güncelleme.
4. Cache’i güncelle
5. Tablo’daki satırı güncelle.

1.Adım
İlk yapmamız gereken ön bellekte daha önceden kullanıcı bilgisi var mı yok mu kontrolü yapmak.

$cacheUser = apc_fetch(“kullanici”);

Eğer apc_fecth kullanici adında daha önceden kaydedilmiş bir veri bulamaz ise, bize ‘false’ olarak yanıt verecektir. Bulursa da o veriyi bize bildirecektir.

2.Adım
Şimdi ön bellekde ‘kullanici’ isimli bir veri var mı yok mu kontrolü yapalım. Yoksa da yaratalım.

if($cacheUser===false) {
        $cacheUser = getUser();
        /* APC’ye User sınıfından yarattığımız objemizi kaydediyoruz ve
         “kullanici” adli cache 3600 saniye yani 1 saatlik ömür veriyoruz.
       */
        apc_store(“kullanici”,$cacheUser, 3600);
}

Şu anda var olan $cacheUser değişkenini görüntüleyim

3.Adım
Şimdi farkı anlamak için $cacheUser adlı objesinin değişkenlerini değiştirip ön bellekteki verimizi tekrar güncelleyelim.

$yeni_email=“yenimail@yeni.com”;
$yeni_takma_adi = “yeni_takma_adi”.rand(0,100);
$yeni_yetki = rand(0,10);
$cacheUser->setEMAIL($yeni_email);
$cacheUser->setTAKMA_ADI($yeni_takma_adi);
$cacheUser->setYETKI($yeni_yetki);

$cacheUser değişkeninin son hali.

/* İçeriği değiştirilmiş $cacheUser objesi */
var_dump($cacheUser);
apc_delete(“kullanici”);
apc_store(“kullanici”,$cacheUser, 3600);

5.Adım
Basit bir mysql sorgusu ile istenilen bilgileri güncelleyebilirsiniz.

Eğer 5. adımı yapmadan kodları tekrar çalıştıracak olursanız, sürekli ön bellekte bulunan verinin güncellendiğini göreceksiniz. Yarım saat sonra tekrar kodları çalıştırdığınızda daha önceden ön bellekte yaratılmış olan veri gelecektir ve tekrardan verileri çekmek için mysql’de select sorgusu atmamız gerekmeden işlemleri yapabileceğiz.

Anlatımda geçen getUser fonksiyonunun açıklaması:

Basit bir mysql bağlantısı yapıp user tablosundan kullanıcının bilgilerini çekmemize yardımcı olan getUser() fonksiyonu;

function getUser() {
        $dbLink = mysql_connect(“localhost”, “user”, “12345”);
        mysql_select_db ( “test_database”, $dbLink );
        $query = mysql_query(“SELECT * FROM USER WHERE TAKMA_ADI=’cagdas’ LIMIT 1”);
        $dataRow = mysql_fetch_object($query);
        mysql_close($dbLink);
        $user = new User($dataRow);
        return $user;
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Başa dön tuşu