Kategori arşivi: Mysql

antalya web tasarım

Mysql Sorgularında En Verimli Yöntemler

Merhaba arkadaşlar bu makalemiz r10.net’de deleter20 nickli arkadaşımızın paylaşmış olduğu bir yazıdan alıntıdır.
Merhaba arkadaşlar,
Gördüğüm kadarıyla hiç araştırma yapmadan bodoslama dalıyoruz kod yazmaya. Nasıl daha iyi kod yazarım nasıl daha iyi verim alırım demiyoruz. O yüzden mysql kullanırken en iyi yolları anlatma gereği duydum. Başlayalım.

1. Mysql yerine Mysqli kullanın.
Mysqli ile sunulan en dikkat çekici yenilikler şu şekildedir;
– Nesne Tabanlı Arabirim
– Ön Hazırlıklı Sorgular

2. Kodlarınızı en iyi şekilde optimize edin.
Çoğu Mysql server ında cache leme açıktır. Ama hangi sorgular direk cache e alınır hangisi alınmaz ona dikkat etmemiz gerekir.
Örnek;
PHP- Kodu:
// cache e alınmaz
$r = mysqli_query("SELECT ad FROM kullanici WHERE tarih >= CURDATE()");

// cache e alınır
$bugun = date("Y-m-d");
$r = mysqli_query("SELECT ad FROM kullanici WHERE tarih >= '$bugun'");

ilk sorgu cache e alınmaz sebebi ise Mysql fonksiyonlarından curdate i kullanmamız. ama aynı işlemi yapan 2. sorguda ise cache alınır bir daha ki sorgulamada Mysql daha hızlı cevap verir.
CURDATE(), NOW(), RAND() gibi fonksiyonlar Mysql in cacheleme özelliğini kullanamamanıza neden olur.

3. Anahtar(key) kullanın.
–ogrenci–
ad — soyad — bolum
gibi bir tablonuz varsa primary key ekleyin.
–ogrenci–
id — ad — soyad — bolum

buradaki id primary key olarak eklenmiştir. daha sonra işlem yapmak istediğimizde bu primary key e göre çok rahatlıkla işlem yapabiliriz.
UPDATE, SELECT …. WHERE id = id_degeri
şeklinde işlemlerimiz çok daha basit ve hızlı şekilde çözülecektir.

4. Tek cevap gelecek sorgularda LIMIT 1 kullanın.
Veritabanında aynı kullanıcı adıyla ya da aynı mail adresiyle kayıt yapılmasını çoğumuz engelleriz zaten. peki bu kontrolü yaparken nasıl sorgu yapmamız lazım. Zaten o isimde ya da o mail adresiyle tek sorgu gelecek biliyoruz. O yüzden daha iyi performans için LIMIT 1 ekleyin.
PHP- Kodu:
// bunun yerine:
$r = mysqli_query("SELECT id FROM kullanici WHERE ad = '$ad'");

// bunu kullanın
$r = mysqli_query("SELECT id FROM kullanici WHERE ad = '$ad' LIMIT 1");

5. Arama yapılacak alanlarda FullText ya da Index(KEY) kullanın.
Aşağıdaki resimde key kullanmadan önce yapılan sorguyla key eklendikten sonraki süreler karşılaştırılmış.

PHP- Kodu:
ALTER TABLE 'users' ADD INDEX ('last_name');
PHP- Kodu:
ALTER TABLE `users` ADD FULLTEXT `fulltextindex` (`last_name`).
Benim tavsiyem fulltext kullanmanız yönündedir.
FullText hakkında daha fazla bilgi almak için google da arama yapabilirsiniz. ya da bu linke bakabilirsiniz.

6. JOIN işlemlerinde doğru seçimi yapın
Bildiğimiz üzere JOIN işlemi yapmanın 3 farklı yolu var. Bunlar arasından hangisini seçeceğimize dikkat etmemiz lazım. Görüyorum ki herkes LEFT JOIN kullanıyor ama ya işlemlerinizde INNER JOIN daha basit ve daha hızlı olacaksa hiç araştırdınız mı?

LEFT JOIN

RIGHT JOIN

INNER JOIN

3ü arasındaki farkları ve örnekleri bu linklerden görebilirsiniz.
http://www.w3schools.com/sql/sql_join_left.asp
http://www.w3schools.com/sql/sql_join_right.asp
http://www.w3schools.com/sql/sql_join_inner.asp

7. JOIN işlemlerinde aynı tipleri eşleştirin
PHP- Kodu:
$r = mysqli_query("SELECT ad FROM kullanici
LEFT JOIN sirket ON (kullanici.il_id = sirket.il_id)
WHERE kullanici.id = $user_id");

burada kullanici tablosuyla sirket tablosunu birleştirdik fakat önemli olan konu kullanici tablosundaki il_id INT olup sirket tablosundaki il_id nin FLOAT ya da VARCHAR gibi farklı tiplerde olmamasına dikkat edin.

8. RAND() kullanmaktan kaçının
Sorgularınızda RAND() kullanmak daha çok işinize geliyor biliyorum ama bunun yerine kesinlikle ve kesinlikle php ile random yapmayı deneyin göreceksiniz ki daha hızlı sonuç alacaksınız.

PHP- Kodu:
// sakın!!
$r = mysqli_query("SELECT ad FROM kullanici ORDER BY RAND() LIMIT 1");

// onun yerine bunu kullanın
$r = mysqli_query("SELECT count(id) as sayi FROM kullanici");
$d = mysqli_fetch_row($r);
$rand = mt_rand(0,$d['sayi'] - 1);

$r = mysqli_query("SELECT ad FROM kullanici LIMIT $rand, 1");
Benim tavsiyem hiç random kullanmama yönünde ama illa kullanacaksanız böyle kullanın.

9. num_rows kullanmaktan kaçının
Sorgularınızda num_rows kullanmak daha çok işinize geliyor biliyorum ama bunun yerine kesinlikle ve kesinlikle COUNT(id) yapmayı deneyin göreceksiniz ki daha hızlı sonuç alacaksınız.

PHP- Kodu:
// sakın!!
$r = mysqli_query("SELECT ad FROM kullanici WHERE il = '$il'");
echo mysqli_num_rows($r);

// onun yerine bunu kullanın
$r = mysqli_query("SELECT COUNT(id) as sayi FROM kullanici WHERE il = '$il'");
$d = mysqli_fetch_row($r);
echo $d['sayi'];

10. SELECT * kullanmaktan kaçının
Sorgu sırasında almak istediğiniz veriler net olsun. kullanıcının adını mı alıcam sadece adını alın. ad, soyad, bolum, il lazımsa sadece bunları alın.

PHP- Kodu:
// yapmayın
$r = mysqli_query("SELECT * FROM kullanici WHERE id = 1");
$d = mysqli_fetch_assoc($r);
echo 'Hoşgeldiniz '.$d['ad'];

// bunu kullanın
$r = mysqli_query("SELECT ad FROM kullanici WHERE id = 1");
$d = mysqli_fetch_assoc($r);
echo 'Hoşgeldiniz '.$d['ad'];

11. Primary Key kullanın
Her tablonuzda bir tane primary key olsun çekinmeyin. Tabi primary key kullanırken dikkat etmemiz lazım VARCHAR ya da FLOAT gibi saçma primary keyler belirlemeyin. INT kullanmak her zaman primary keyler için daha iyidir.

id = INT, PRIMARY KEY, AUTO_INCREMENT
hatta UNSIGNED da kullanabilirsiniz negatif değer alamayacak nasılsa.

12. NULL dan kaçının
Çok zor da olmadıkça veritabanlarında NULL değerleri alacak tablo oluşturmaktan kaçının.

Eğer INT ise alan default olarak NULL yerine 0 tanımlayın.
VARCHAR ise default olarak ” tanımlayın.

13. Alanlarınız sabit uzunlukta ve yeterince olsun
Oluşturduğunuz alanlar sabit uzunlukta ve yeterli derecede olsun.

Örneğin sadece 0,1 değeri alacak bi yer için gidipte INT(11) ya da INT(25) gibi saçma alanlar oluşturmayın. BIT(1) ya da TINYINT(1) yeterli olacaktır.

Text alanlarından mümkünse uzak durun bunun yerine VARCHAR(1024) gibi ne kadar lazımsa o kadar tanımlama yapın.

ip alanlarını tutan alan için gidipte VARCHAR(255) falan kullanmayın, VARCHAR(15) yeterli olacaktır.

14. Büyük sayılarda INSERT ya da DELETE işlemi yapmayın
Sorguları parçalamayı deneyin.
PHP- Kodu:
// bunun yerine
mysqli_query("DELETE FROM logs WHERE log_date <= '2009-10-01'"); // bunu kullanın while (1) { $r = mysqli_query("SELECT COUNT(id) as sayi FROM logs WHERE log_date <= '2009-10-01'"); $d = mysqli_fetch_row($r); if ($d['sayi'] > 0)
mysqli_query("DELETE FROM logs WHERE log_date <= '2009-10-01' LIMIT 1000"); else break; // az bekle usleep(50000); }

15. Depolama Motorlarını(Storage Engine) doğru kullanın
MyISAM ve InnoDB her ikisininde kendine göre avantajları ya da dezavantajları var. bunları tablonuza göre uygun olup olmadığını kontrol ederek seçiniz.

Eğerki InnoDB kullanmaya karar verdiyseniz burası çok önemli innodb_buffer_pool_size alanını kendinize göre arttırın ya da hostunuza iletin o geri dönüş yapacaktır.
PHP- Kodu:
innodb_buffer_pool_size = 256M
Hepsini okuduğunuz için Teşekkür ederim.
Kolay gelsin.

mysql optimizasyonu

Mysql Optimizasyonu Yaptırmak Isteyen ?

MySQL sunucunuzu minimum 2 gün ( 48 saat ) boyunca çalıştırın

Çünkü 2 gün boyunca SQL bütün istatistikleri toparlayacaktır. Zorlandığında neden zorlandığını hangi ayarın az hangi ayarın fazla olduğunu vb. tüm bilgileri biriktirecektir. 2 gün ve daha sonrasında verdiğim script’i çalıştırmazsanız veriler tutarsız olabilir.
Okumaya devam et

CONTINUE HANDLER

MySQL’de Cursor Kullanımı – MYSQL Cursor Nedir?

MySQL’de Cursor Kullanımı – MYSQL Cursor Nedir?
MySQL de cursor tanımlamayı (DECLARE), tanımlanan cursor u erişime açmayı (OPEN), erişime açılan cursor üzerindeki verilerde dolaşmayı (FETCH) ve işlemimizi bitirdiğimiz cursor u kapatmayı (CLOSE) örnekler ile inceleyeceğiz. Herhangi bir tablodaki verileri where,like,group by,order by vb şekilde filtreleme yaparak yada hiç bir filtreleme yapmadan bütün verileri tanımlanan cursor değişkenine aktarabiliriz. Sonrasında ise tanımlanan cursor değişkenine aktardığımız yeni oluşan veri kümesi üzerinde dolaşarak istediğimiz kayıtlara erişmemiz ve bu kayıtlar üzerinde işlem yapmamız daha kolay hale gelmektedir. Cursor procedure,function yada trigger gibi methodların içinde kullanılmalıdır. Bunların dışında tanımlanmasına mysql izin vermemektedir. Bu yüzden örneklerimde bunların arasından procedure i tercih ettim. Procedure kullanımı hakkında bilgi edinmek için bu makaleyi inceleyebilirsiniz. Veritabanı yönetimi için MySQL Query Browser uygulamasını kullandım. Bu uygulamayı buradan indirebilirsiniz. Aşağıdaki gibi users adında örnek bir tablomuz olsun; Okumaya devam et

Indexleme nedir

Mysql Index Nedir ? Nasıl Kullanılır ?

Merhaba arkadaşlar, MySql’de Sorguların hızlı çalışmasını sağlamak Buradaki konunun ardından konu bütünlüğünü sağlamak amacıyla, şuan Sorgularımızı hızlandırmaya yönelik yapmamız gereken işlemler dizesinden mySQL Index hakkında bilgi paylaşacağım.
Okumaya devam et

SQL Not Null ve Null Olayı

Merhaba arakdaşlar veritabanı ile uğraşan her arkadaşımızın bilmesi gereken ve her gün defalarca karşılaştığı bir terimden bahsetmek istiyorum makalemiz Ogan Ozdogan arkadaşımızdan alıntı yapılmıştır. SQL Not NULL Constraint ve Null Değer hakkındaki makaleye aşağıdan göz atabilirsiniz. Ogan OZDOGAN arkadaşımıza 2009 yılında yayınlamış olduğu bu makaleden dolayı teşekkür ederim.
Okumaya devam et

Mysql Tuning

Mysql Tuning ile Mysql Raporları ve Optimizasyonu

Merhaba arkadaşlar, uzun süredir Firewall yazılımı üzerinde çalışıyordum. Geçen gün bulut sisteminde geniş kapsamlı bir 11 Group Hotel’in kullanmış olduğu yazılım ile karşı karşıya kaldım. Mysql problemi ile alakalı bir problem idi ve buradan sizlerle paylaşmak istedim. Sunucularımızda MySQL Optimizasyonu nasıl yapılır birlikte gözatalım.
Okumaya devam et

wordpress

Phpmelody’den WordPress’e Taşıma İşlemi

Merhaba arkadaşlar, geçen gün yapmış olduğum Phpmelody sisteminden wordpress’e veri aktarımı için kullandığım scripti sizlere ücretsiz olarak vereceğim. Eğer Phpmelody scriptiniz var ve wordpresse geçmek istiyorsanız bu script ile kolay bir şekilde veritabanını çevirebilirsiniz.
Okumaya devam et

Mysql ve Mysql Tablolarında Karakter Set Değişimi

Merhaba arkadaşlar, bugün makalemizde MYSQL veritabanında veritabanı karakter seti değiştirmeyi ve sadece herhangi bir tablonun karakter setini değişmeyi ele alacağım. Mysql Karakter Setini değiştireceğimiz örnek bir tablomuz,
ferdikucuk_haberler olsun. Örnek tablomuzun karakter setinin latin5_turkish_ci olduğunu varsayalım.
Okumaya devam et