Merhaba,

Bir iki şey daha eklemek gerekirse, mysql de hintlerle de bazı şeyleri
çözebilirsiniz. öncelikle sort ettiğiniz kolon üzerinde bir index varsa,
order by için indexi kullanıp kullanmadığını kontrol edebilirsiniz. Eğer
isterseniz belirli bir index i order by için optimizer a hint olarak
verebilirsiniz. (http://dev.mysql.com/doc/refman/5.1/en/index-hints.html).

Diğer yandan ram i aşıp tmp tabloya yazan order by, distinct, group by
sorgularını hızlandırmak için  de SQL_BIG_RESULT hint i oldukça işe
yarıyor.
(http://dev.mysql.com/doc/refman/5.1/en/select.html) onu da
deneyebilirsiniz.

Barış beyin dediği memory ayarları da yapılabilir. Diğer yandan sorgunuzu da
optimize edebilirsiniz. Örneğin yerine göre OR lar yerine UNION (ALL) gibi
ifadeler eğer kullanılabiliyorsa tercih edilebilir. yine de bi explain
göndermeniz de fayda var. çünkü dediğiniz gibi darboğaz tam nerde onu
anlamamıza yardımcı olacak olan explain ifadesi.

Kolay gelsin...

2010/10/14 Barış AKVERDİ <[email protected]>

> Merhaba
>
> MySQL, sıralama durumunda geçici bir memory table yaratır. Bu memory table
> size ı 5.1 için default max. 16 MB tır. Sizin sıralanacak sonuç kümeniz bu
> 16 mb sınırını aşarsa bellekte yaratılmış olan memory table diskteki bir
> myisam tabloya aktarılır ve sıralama işlemi devam eder.
>
> Performansı arttırmak için, sizin istediğiniz query nin mysql tarafından
> hazırlanmasında gereken iki süreç tune edilebilir gözüküyor.
>
>
> 1. sıralanmamış query sonuç kümesi db den daha hızlı gelsin istiyorsak;
>
> Öncelikle eşitliğin sol tarafında foksiyon kullanılması index kullanımını
> engelliyor. Bu nedenle;
>
> WHERE (LEFT(lastupdated,10) = LEFT(NOW(),10)
>
> Yerine
>
> WHERE lastupdated BETWEEN (
>       LEFT(lastupdated,10)
>                  AND
>       CONCAT(
>               LEFT(NOW(),10)
>               ,
>                ' 23:59:59')
>
> Gibi bir kullanım yerinde olur. Bu yazım şekli index kullanımını engellemez
> ve aynı sonuç kümesini döndürür. Tabi burada lastupdated field inde index
> olduğunu varsayıyorum.
> Daha fazla yorum yapmak için explain plan gerekiyor.
> Önceki postlarda arkadaşlar bu konudan bahsetmişler.
>
> 2. Elimizde zaten bir sonuç kümesi var. MySQL in sıralamada kullandığı
> Memory table a sığmıyor. Disk io su nedeniyle yavaşlama var ise. (Sizin şu
> an için daha büyük sorununuz bu sanırım)
>
> Aşağıdaki query ler size sıralama işleminde kullanılacak memory tablosunun
> max. Boyutunu verir.
>
> mysql> select @@max_heap_table_size;
> mysql> select @@tmp_table_size;
>
> Aşağıdaki query ler ile session için bu değeri daha büyük bir değere set
> edebilirsiniz.
>
> mysql> SET SESSION max_heap_table_size=19777216;
> mysql> SET SESSION tmp_table_size =19777216;
>
> Fakat bu parametrelerde değişiklik yaparak denemelere başlamadan önce sonuç
> kümesini düşürmeye yönelmek lazım bence. Malum memory sınırlı. Örneğin bu
> raporda sadece son 2 hafta görüntülenebilir olsa belki de bu sorun
> yaşanmayacak.
>
> Büyük tablolar için ayrıca mySQL 5.1 ile gelen partitioning
> değerlendirilebilir.
>
> Barış AKVERDİ
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Salih
> BiLGiN
> Sent: Wednesday, October 13, 2010 5:56 PM
> To: [email protected]
> Subject: [Linux-programlama] Mysql Yavaş Sorgu - Order By
>
> Merhabalar,
>
> Debian yüklü ve mysql 5.1 bulunan sunucumda bir sorgumda ORDER BY
> yapmadan herhangi bir performans sorunu yaşamıyorum. Ancak ORDER BY
> eklediğimde CPU %100  oluyor ve uzun sürüyor.  Sorgum aşağıdaki gibidir.
> Kayıt sayısı yaklaşık 300bin tablomda.  Ne yapmamı önerirsiniz?
>
>
> SELECT DISTINCT `id`, `phone` FROM `ABO3` IGNORE INDEX (disposition)
>        WHERE active = 1 AND (LEFT(lastupdated,10) = LEFT(NOW(),10) AND
>        disposition = 1 OR (LEFT(lastupdated,10) <> LEFT(NOW(),10))) AND
>        ((((disposition > -6 AND disposition < 6) AND disposition <> -3
> AND disposition <> 3 AND disposition <> 0) AND attempts < 8) AND active
> = 1) ORDER BY attempts ASC LIMIT 0,1;
>
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> https://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>
> No virus found in this incoming message.
> Checked by AVG - www.avg.com
> Version: 9.0.862 / Virus Database: 271.1.1/3161 - Release Date: 10/12/10
> 21:37:00
>
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> https://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>



-- 
Serdar Güler
_______________________________________________
Linux-programlama mailing list
[email protected]
https://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php

Cevap