26 Mayıs 2012 Cumartesi

MySQL'de sayfalama yaparken dikkat edilecekler...



Herşeyin normal olduğu bir dünyada sayfalama yaparken datanın istenilen kısmını göstermek için MySQL'de "LIMIT" kullanılır.


LIMIT 0,2 veya LIMIT 2 dediğim zaman bana ilk iki datayı getirir. LIMIT 2,2 dediğimde ise ilk iki datadan sonra gelen 2 datayı getirir. Bu şekilde biz sayfalama yapıp tablolardan ihtiyacımız olan kadar datayı çekip gösteriyoruz.  Tabi bunu hesaplayabilmek için başlangıçta "toplam" datayıda bilmek gerek.
Bunun için MySQL'de kullanılan yöntem ;

"SELECT SQL_CALC_FOUND_ROWS * FROM test LIMIT 1"
"SELECT FOUND_ROWS()"



SQL_CALC_FOUND_ROWS anahtar kelimesi ile aslında toplam satır sayını hesapladık. Böylece aynı oturumda
"SELECT FOUND_ROWS()" kullanıldığında bize anında toplam data sayısını veriyor.

Ama burda şöyle bir durum var ana sorgumuzda kullandığımız "LIMIT 1" ile toplamda 1 satır dönsede aslında toplam satır sayısını hesaplıyor. Çünkü biz ona bunu yapmasını SQL_CALC_FOUND_ROWS anahtar kelimesi ile söyledik.

Normal olmayan durumlar ise joinler ile yaptığınız içinde WHERE/ORDER olan ve büyük datası olan tablonun böyle bir hesaplama durumunda oldukça uzun sürmesi. Bu durumda SQL_CALC_FOUND_ROWS'u kaldırıp hesaplamayı
"SELECT count(*) FROM test " ile daha hızlı bir şekilde yapabiliriz.

Burdan çıkartılacak ders, bir anahtar kelime/çözüm bir yerde iyi çalışıyorsa her yerde iyi çalışacak diye bir şeyin olmadığı gerçeğidir. Her durum için ayrı çözümler üretmek gerkebileceği için tasarladığımız sistemleri bu durumları düşünerek tasarlamız gerekmektedir...

Bu bilgilere ek olarak tablolarınızda "ORDER BY x" kullanırken dikkatli olmalısınız. Eğer INDEX'i olmayan bir field'a göre sıralama yapmak istiyorsanız işiniz bir hayli zor olacaktır. Konuyla ilgili detaylı bilgi almak için içinde çok datası olan tabloları EXPLAIN komutu ile sorgunuzu index'i olmayan ve index'i olan field lar ile sıralayıp bir alıştırma yapınız :)

Aynı şey "WHERE" içinde geçerli INDEX'i olmayan ve koşula giren bir "field" çoğu zaman yavaşlama yapabilir ama bazen etkisizde olabilir. Test etmenizde fayda var.

Konuyla ilgili şu linkler ilginizi çekebilir;

http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
http://stackoverflow.com/questions/186588/which-is-fastest-select-sql-calc-found-rows-from-table-or-select-count
http://stackoverflow.com/questions/818567/mysql-pagination-without-double-querying
http://www.xarg.org/2011/10/optimized-pagination-using-mysql/
http://forge.mysql.com/wiki/Top10SQLPerformanceTips

Hiç yorum yok: