Samet AKIN

Samet AKIN

ALAYLI YAZILIMCI

Mysql’de performans için birkaç öneri

Mysql ile Mysqli arasında performans açısından oldukça fazla fark var ve ben size mysql yerine mysqli kullanmanızı öneririm. Ayrıca mysqli, mysql’e göre daha güvenli. Her yerde duyabileceğiniz tavsiyelerden sonra daha önce kullandığım ve faydasını da gördüğüm şeyleri anlatacağım.

Öneri 1 :

Veri sayısının çok olduğu ve git gide büyüyen veritabanlarında birden fazla veri çekildiğinde veri çekme işlemi uzun oluyor. mysql_query() ile yapılan sorgularda while() içinde istediğiniz limite ulaştığında break; ile döngüyü bozarsanız sorgunun dahada hızlandığını göreceksiniz.

Aradaki farkı görebilmek için  1M verinin bulunduğu bir tablodan üst üste 5-6 tane sorgu yapın sürenin ne kadar uzun olduğunu göreceksiniz.  Aynı sorguları birde benim söylediğim yöntemle deneyin arasındaki fark gözle görülür cinsten.

EzSql’de mysql için aynı kodu kullanıyor performans için. Aynı kodu mysqli içinde kullanabilirsiniz ancak arada bir fark yaratmıyor.

Örnek sorgu :


$start = microtime(true); // Başlangıç
$limit = 20;
$sql = mysql_query("select * from icerikler limit ".$limit);
$i =0;
while($get=mysql_fetch_assoc($sql)) {
$results[] = $get;
$i++;
if($i>=$limit) { break; }
}

foreach($results as $result) {
echo $result['id']."<br>";
}

echo "Süre : "; echo microtime(true)-start; // 1 sorguyu kaç saniyede yaptığını görebilirsiniz

Öneri 2 :

Aynı sayfa içinde birden fazla sql’e bağlanıyorsanız bunu teke düşürün. Eğerki farklı sayfaları tek sayfa içine çağırdığınızda iki kez veya daha fazla sql’e bağlanmak zorunda kalıyorsanız hemen bir sql class’ı oluşturup instance kullanın. Size mysqli ile hazırladığım örneği göstereyim.

class DB_Mysql {

protected static $instance = NULL;
public $dbHost = "localhost";
public $dbUser="user";
public $dbPass="password";
public $dbName="name";

private function __construct() {
$connection = new mysqli($this->dbHost,$this->dbUser,$this->dbPass,$this->dbName);

$this->connection = $connection;
self::$instance = $this->connection;
}

public static function getInstance() {
if(self::$instance ==NULL) {
return self::$instance = new DB_Mysql();
}
return self::$instance;
}

function query($query) {
/*
Buraya kodunuzu yazın
*/
return $return;
}
/*
Kendi methodlarınız
*/
}

/* instance kullandığımız için ve bu classı new ile başlatamayız. Sebebi şu, bu işlem sizin daha önce sizin bir sql bağlantısı yapıp yapmadığınızı kontrol eder. Eğerki  daha önce bağlandıysanız tekrar bağlanmaz, bir önceki bağlantıyı kullanmış olursunuz*/

$db = DB_Mysql::getInstance();

Öneri 3 :

Uzun yazıları çok sorgu yaptığınız tabloda tutmayın. Fazla sorgunun yapıldığı tabloların yapısını innodb yapın.  Uzun yazılarınızı farklı bir tabloda tutun.

Öneri 4 :

Döndü içinde tekrar sorgu yapmayın. Sebebi ise şudur, 10 kere dönen bir döngünüz olduğunu düşünelim. Döngü içinde 2 tane sorgu yaptığınızı düşün. 10*2 = 20 tane sogu yapar birde sizin sorgunuz 21 tane sorgu yapar. sorgu içinde sorgu yapmak yerine INNER JOIN veya subquery kullanmanız sizin için daha iyi olur ve aradaki farkı göz ilede görebilirsiniz.

 

Öneri 5 :

Sorgu yaparken fazla kullandığınız sütünlarınızı indexleyin.  Navicat’in Mysql için olan programını indirin. Bu program sayesinde rahatlıkla yapabilirsiniz. Programın adı (  Navicat for Mysql)

Sql ile yapmak isterseniz :

ALTER TABLE tabloAdi ADD INDEX indexAdi (sutunAdi);

 

Bir sonraki yazımda php.ini ve schema ile performansı arttırmanın yöntemlerini anlatacağım

 

DROP A COMMENT

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir