Aynı şema / sorgular için MySQL ve PostgreSQL arasındaki performans farkı [kapalı]


20

Ben bir acemi DBA ve Microsoft SQL Server deneyimim var ama FLOSS atlamak istiyorum.

Bir şirkete başlıyorum ve bir Postgres arka ucuna sahip bir uygulama (PHP) geliştiriyoruz ve MySQL ile karşılaştırma yapan bazı testler yaptık. MySQL'in PostgreSQL'den iki kat daha hızlı olduğunu gözlemliyoruz.

Somut bir performans testi yaptım:

  • Eşdeğer sütun veri türlerine sahip tabloda aynı sütunlar.
  • Aynı sayıda satır.
  • Her ikisinde de aynı dizinler (birincil anahtar dahil).
  • CPU yükü boşta ve Postgres makinesi önemli ölçüde daha iyi.
  • Ve aynı sorgu (açıkçası).

Neyi yanlış yapıyorum?

PS: Ben veritabanı motorları için performans ayarlama hakkında birçok "howtos" okudum.
PS (2): MySQL veritabanında InnoDB (tablo başına bir dosya) kullanıyoruz.


Merhaba Mat!

Üç yaygın seçme (ve en zor) sorgu yaptım.

Diskle ilgili soru, kesinlikle aynı değil; Postgres'de bu bir SSD (neredeyse üç kat daha hızlı).

MySQL önbellek verileri:

+------------------------------+----------------------+
| Variable_name                | Value                |
+------------------------------+----------------------+
| binlog_cache_size            | 32768                |
| have_query_cache             | YES                  |
| key_cache_age_threshold      | 300                  |
| key_cache_block_size         | 1024                 |
| key_cache_division_limit     | 100                  |
| max_binlog_cache_size        | 18446744073709547520 |
| query_cache_limit            | 1048576              |
| query_cache_min_res_unit     | 4096                 |
| query_cache_size             | 16777216             |
| query_cache_type             | ON                   |
| query_cache_wlock_invalidate | OFF                  |
| table_definition_cache       | 256                  |
| table_open_cache             | 64                   |
| thread_cache_size            | 8                    |
+------------------------------+----------------------+

Bunu PostgreSQL'de nasıl görüntüleyeceğimi bilmiyorum.

Şimdiden teşekkürler.


İngilizcem için özür dilerim
Javier Valencia

(İngilizcen iyi.) Yük testleri mi yaptın, yoksa tek tek mi sorguladın? Kullandığınız veritabanı ayarlarını gösterir misiniz (özellikle önbellek boyutları gibi)? (Her iki durumda da aynı diskler var mı?)
Mat

1
Sorguyu kullanarak Postgres yürütme planını gönderebilir miyim explain analyze. Okumayı kolaylaştırmak için, açıklamak
a_horse_with_no_name

1
Postgres bir SSD üzerinde çalışıyorsa, neredeyse kesinlikle ayarlamanız gerekirpostgresql.conf
a_horse_with_no_name

1
@JavierValencia: Sorunu çözebildiyseniz, lütfen başkalarının bundan öğrenebilmesi için ne yaptığınızı açıklayan bir cevap ekleyin. Bu soruyu çözülmüş olarak işaretlemek için kendi yanıtınızı da kabul edebilirsiniz
a_horse_with_no_name

Yanıtlar:


41

MySQL ve PostgreSQL performans açısından oldukça farklıdır. InnoDB ve PostgreSQL tabloları farklı türde sorgular için optimize edilmiştir. Bu farklılıkları anlamak, ikisinden de nasıl iyi performans elde edileceğini anlamak için önemlidir.

Örnek olarak, en belirgin farka bakalım.

PostgreSQL ve MySQL / InnoDB Tablo Yapısı ve Performans İçin Anlamı

Genel olarak, karmaşık iş yüklerinde PostgreSQL daha hızlı olacaktır, ancak basit birincil anahtar aramaları üzerinde InnoDB ile MySQL daha hızlı olacaktır.

PostgreSQL tabloları yığın tablolarıdır. Yığın tablosu olmayan bir tablo oluşturma seçeneği yoktur. clusterKomut basitçe belirtilen bir dizin tarafından sipariş edilen yığın yeniden yazar. Dizinler daha sonra çeşitli değerlere sahip tuples için yığın konumları sağlar. Dizinler fiziksel sırayla değiştirilemez, yalnızca mantıksal sıradadır, bu nedenle bir tabloyu sıralı olarak okurken çok fazla rasgele disk G / Ç'ye sahiptirler, çünkü bir tabloyu fiziksel sırayla okuyabileceğiniz için sıralı disk G / Ç'nin çoğu anlamına gelir. Sıralı disk G / Ç, okuma önbelleğini ve diğer bazı işletim sistemi düzeyi optimizasyonunu kullanır.

Bunun anlamı, kayıtların önemli bir kısmına veya birkaç sayfadan fazlasına ihtiyacınız varsa, sayfaları diskten okumak genellikle daha hızlıdır. Öte yandan, bir tablo için birincil anahtar araması dizini vurmak, dosyadaki konumu aramak ve yığın tablosuna basmak ve kaydı çekmek gerektirir. Bu, bir dizi rasgele disk G / Ç anlamına gelir.

InnoDB farklı bir yaklaşım kullanır. InnoDB ile, tablo indeks yükünde gerçek veriler içeren bir b-ağacı dizinidir. Bu, birincil anahtar aramasının zaten verileri yaprak sayfasından çektiği ve bunun için daha az rastgele disk G / Ç'ye ihtiyaç duyduğu anlamına gelir. Aynı zamanda, bir indeks taraması bir yerine iki indeksin çaprazlanmasını gerektirir, yani birincil anahtar dışında herhangi bir indeksin kullanılması daha yavaş olur ve sıralı taramalar daha yavaştır.

PostgreSQL'de Tanı Alma

Sanırım şöyle bir şey kullanmak istiyorsunuz:

 EXPLAIN (analyse, buffers, verbose)
 [query];

Bu size sorgu planını, ilk tahminleri, gerçek süreleri, arabellek kullanımını ve çok daha fazlasını verecektir.


4
EXPLAIN için +1 (analiz, arabellek, ayrıntılı)
karmakaze

@ChrisTravers harika bir cevap için teşekkürler! Dediniz ki: "... (InnoDB) ardışık taramalar daha yavaş". Bu bağlamda sıralı taramalarla ne demek istediğinizi açıklar mısınız?
VB_

Teşekkürler. Cevabı değiştireceğim. InnoDB'deki "sıralı" taramalar dizin-mantıksal sıradadır, bu nedenle daha rasgele G / Ç'ye sahiptir ve okuma önbelleklemesinden yardım almazsınız.
Chris Travers

Güzel cevap için teşekkürler. Postgres'in içi merak eden herkes için bu yazıyı tavsiye ederim: interdb.jp/pg/pgsql01.html Postgres'in verileri yığın tablosu olarak nasıl sakladığını açıklayın.
hqt
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.