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