MySQL sorguları tarafından gerçekleştirilen G / Ç işlemlerini nasıl tahmin edebilirim?


13

Amazon'un RDS'sinde, 1 milyon I / O talebi için yaklaşık 0,10 $ ödersiniz. Çok düşük bir trafik veritabanı için çok yüksek sayıda (yüz binlerce) G / Ç isteği fark ettim. Bunu gördükten sonra biraz daha araştırma yaptım ve 6.000 kullanıcılı bir web sitesi için ayda 800 milyon I / O isteği ürettiğini açıklayan bu soruyu buldum, bu da ona yaklaşık 80 $ / ay mal olacak.

Bu nedenle, bir MySQL sorgusunun kaç G / Ç işlemi oluşturacağını ve bunları nasıl optimize edeceğini / en aza indireceğini önceden bilmek istiyorum. Bir sorgunun kaç G / Ç işlemi gerçekleştireceğini ve bunları olabildiğince düşük tutmak için uygulayabileceğim genel kuralları tahmin etmenin herhangi bir yolu var mı?

Yanıtlar:


2

Raymond Nijland tarafından soru üzerine yapılan yorumlardan oluşturulan Topluluk Wiki yanıtı

Kullanın EXPLAIN. Bu şekilde, bir sorgunun disk IO'suna ihtiyacı olup olmadığını görebilirsiniz. Sütun içinde kaçınmak gerekir ekstra "geçici kullanma" "geçici kullanma" ya; Filesort kullanma (filesort'un yanıltıcı bir isim olduğunu unutmayın: sonuç kümesi belleğe sığarsa, quicksort bellekte çalıştırılır) ".

Bunun nedeni büyük olasılıkla alt sorgular / sendikalar / / by by group by / ... sonucunuz büyükse ve MyISAM disk tabanlı geçici bir tablo oluşturulmuşsa ve sonucu sıralamanız gerekiyorsa, sonucu sıralıyorsunuz hızlı okuma algoritması ile IO okuma ve IO yazma dayalı set.

MySQL'de Dahili Geçici Tablo Kullanımı bölümünde, MySQL'in disk tabanlı bir MyISAM tablosu oluşturması gerektiğinde okuyabilirsiniz. Sonucun yığına uyup uymadığını kontrol etmek için avg_row_length * satırlarını kullanabilirsiniz ( açıklamanın satır değerinin InnoDB motoru ile tam olmadığını unutmayın ). Bkz . TABLO DURUMUNU GÖSTER Sözdizimi .

Genel olarak G / Ç isteklerinden kaçınmak için InnoDB veya MyISAM daha iyi midir?

InnoDB tablo verilerini ve dizin verilerini arabelleğe alırken, MyISAM yalnızca dizin anahtarlarını arabelleğe alır. Fazladan açıklama sütunu "Dizin kullanma" demediğinde tablo verilerine bir G / Ç gereklidir .

Her ikisi de dizin kullanıyorsa: InnoDB ile, arabellek sıcaksa bellekten veri yükleyebilir. Dizinlerin diskten gelmesi gerekiyorsa, seçmeler, ekler ve güncellemeler için gerekli G / Ç okumalarını hesaplamak için kullanabileceğiniz bir formül vardır. Gönderen Tahmin Sorgu Performansı :

Küçük tablolar için, genellikle bir disk aramasında bir satır bulabilirsiniz (dizin büyük olasılıkla önbelleğe alınmış olduğundan). Daha büyük tablolar için, B-ağacı dizinlerini kullanarak, bir satır bulmak için bu kadar çok aramaya ihtiyacınız olduğunu tahmin edebilirsiniz:

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

InnoDB dizinleri, PRIMARY / UNIQUE anahtarındaki verileri bir KEY dizinine depoladığından daha büyüktür. Bu daha hızlıdır ve daha az IO arar, ancak InnoDB verilerini veya dizinlerini sıkıştırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.