Günlüğe kaydetme MySQL performansına zarar verir - ama neden?


9

Ben zaten sitede, ne de MySQL belgelerinde bu konuda bir cevap göremiyorum oldukça şaşırdım ( bölüm 5.2 aksi takdirde iyi örtülü günlüğü var gibi görünüyor!)

Binlog'ları etkinleştirirsem, küçük bir ekstra IO ile beklenen küçük bir performans isabeti (öznel olarak) görüyorum - ancak genel bir sorgu günlüğünü etkinleştirdiğimde, muazzam bir performans isabeti görüyorum (sorguları çalıştırmak için iki kez, ya da daha kötüsü), binlog'larla gördüğümden çok daha fazla. Tabii ki şimdi her SELECT'i ve her UPDATE / INSERT'i kaydediyorum, ancak diğer cinler her isteği (Apache, Exim) durmadan öğütmeden kaydediyor.

IO söz konusu olduğunda performans "devrilme noktasına" yakın olmanın etkilerini mi görüyorum, yoksa bunun olmasına neden olan sorguları günlüğe kaydetmede temelde zor bir şey var mı? Geliştirme işlemini kolaylaştırmak için tüm sorguları günlüğe kaydetmeyi çok isterim, ancak genel sorgu kaydı ile performansı tekrar elde etmemiz gerektiği gibi hissettiği donanım türünü haklı çıkaramıyorum.

Tabii ki, yavaş sorguları günlüğe kaydediyorum ve bunu devre dışı bırakırsam genel kullanımda ihmal edilebilir bir gelişme var.

(Tüm bunlar Ubuntu 10.04 LTS, MySQLd 5.1.49'da, ancak araştırmalar bunun oldukça evrensel bir sorun olduğunu gösteriyor)

Yanıtlar:


9

Genel sorgu günlükleri ikili günlüklerden çok daha fazla ES'dir. Çoğu SQL sunucusunun% 10 yazma işlemine% 90 oranında okunmasının yanı sıra, ikili günlükler daha az disk alanı kullanan düz metin yerine ikili biçimde depolanır. (Ne kadar daha az yer? Emin değilim. Üzgünüm.)

Apache ve Exim'in neden her performansı önemli bir performans etkisi olmadan kaydedebilmesinin iki yönü vardır. Birincisi, bir talebin gerçekleştiğini kaydeder, ancak günlüğe koydukları şey genellikle gerçek talepten daha küçüktür. HTTP isteği genellikle günlüğe giden satırın iki katıdır ve kısa, düz metinli bir e-posta bile ona eşlik eden günlük satırından 10 veya 20 kat daha büyüktür. 10 MB eki olan bir e-postada, günlüğe yalnızca birkaç satır yazılır.

Bunun ikinci kısmı, normal bir web uygulamasında genellikle tek bir HTTP sayfasıyla ilişkili düzinelerce SQL sorgusu olmasıdır. E-postalar HTTP isteklerinden bile daha küçük sayılarla gelir. MySQL sunucunuz muhtemelen Apache veya Exim'den çok daha fazlasını kaydetmeye çalışıyor.

Günün sonunda MySQL ikili ve genel günlüklerinizin boyutuna (sıkıştırılmamış) ve Apache ve Exim günlüklerinize bakın. Bahse girerim ki MySQL genel günlüğü en az 5 faktör büyüktür.


1
Bazı iyi noktalar - özellikle, uygulamamıza tek bir GET 100'lü SEÇİM'e neden olabilir, çünkü tek bir sorguda yapabildiğimiz kadar çok şey yapmaya çalışsak da, bazen bunun performansını / temizliğini takas ederiz. daha zarif bir yapı, daha okunabilir bir kod ve daha temiz bir DB. (Bir yana, bu her şey aslında POST'lerin içeriği ve GET'lerin URL'si hakkında konuşmaktan başladı, çünkü CGI.pm'nin bir durumda değil, bir durumda gördüğü paraları ve oradan da kayıt / performansa genel). Her neyse, birkaç saat oldu, bu yüzden cevap kabul edildi. Teşekkürler!
James Green

4

Verilen cevaba eklemek için, MySQL veri depolarınızla aynı cihaza giriş yapıyorsanız bir performans isabeti görürsünüz - aynı diskse, birden fazla konuma okuma ve yazma yapacaksınız her zaman, tüm süreci yavaşlatır.

Aynı fiziksel diskte farklı bir bölüm olsa bile bu doğrudur.

Günlük kaydı farklı bir cihaza gidecekse, bu durum bazı performans sorunlarını hafifletmelidir .


1
Durumumla ilgili değil - barındırılan bir VM ve DB'ler, aynı depolama dizisinden sağlanan / var için ayrı bir mantıksal birimde. Ben teorik olarak aynı iğ üzerinde olabilir sanırım, ama helluva tesadüf gibi hissediyorum :-) dedi, +1 kenara, çünkü bu kesinlikle örneğin varsayılan Debian / Ubuntu kurulum (DBs / var / mysql, / var / log'da oturum açar)!
James Green

@jimbo - özel durumunuz için doğrudan geçerli olmasa bile sahne için teşekkürler :)
warren
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.