ความแตกต่างของประสิทธิภาพระหว่าง MySQL และ PostgreSQL สำหรับสคีมา / คิวรีเดียวกัน [ปิด]


20

ฉันเป็นมือใหม่ DBA และฉันมีประสบการณ์ใน Microsoft SQL Server แต่ฉันต้องการข้ามไปยัง FLOSS

ฉันเริ่มต้น บริษัท และเราพัฒนาแอพ (PHP) ด้วยแบ็กเอนด์ Postgres และเราทำการทดสอบบางอย่างเปรียบเทียบกับ MySQL ด้วย เราสังเกตว่า MySQL นั้นเร็วกว่า PostgreSQL สองเท่า

ฉันทำการทดสอบประสิทธิภาพที่เป็นรูปธรรม:

  • คอลัมน์เดียวกันในตารางที่มีประเภทข้อมูลคอลัมน์เทียบเท่า
  • จำนวนแถวเท่ากัน
  • ดัชนีเดียวกันในทั้งสอง (รวมคีย์หลัก)
  • โหลด CPU ไม่ได้ใช้งานและเครื่อง Postgres ดีกว่ามาก
  • และแบบสอบถามเดียวกัน (ชัด)

ผมทำอะไรผิดหรือเปล่า?

PS: ฉันอ่าน "howtos" มากมายเกี่ยวกับการปรับแต่งประสิทธิภาพของเอ็นจิ้นฐานข้อมูล
PS (2): เรากำลังใช้ InnoDB (หนึ่งไฟล์ต่อหนึ่งตาราง) บนฐานข้อมูล MySQL


สวัสดีจ้า!

ฉันใช้คำสั่ง select (และยากที่สุด) สามรายการ

คำถามเกี่ยวกับดิสก์แน่นอนว่ามันไม่เหมือนกัน ใน Postgres เป็น SSD (เร็วที่สุดเกือบสามเท่า)

ข้อมูลแคช MySQL:

+------------------------------+----------------------+
| 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                    |
+------------------------------+----------------------+

ฉันไม่ทราบวิธีการดูใน PostgreSQL

ขอบคุณล่วงหน้า.


ขออภัยภาษาอังกฤษของฉัน
Javier Valencia

(ภาษาอังกฤษของคุณใช้ได้) คุณทำการทดสอบโหลดหรือเป็นข้อความค้นหาเฉพาะหรือไม่ คุณสามารถแสดงการตั้งค่าฐานข้อมูลที่คุณใช้ (โดยเฉพาะอย่างยิ่งขนาดแคช) (ดิสก์เดียวกันในทั้งสองกรณีผมเข้าใจ?)
จ้า

1
คุณสามารถโพสต์แบบสอบถามและแผนปฏิบัติการ Postgres explain analyzeใช้ เพื่อให้ง่ายต่อการอ่านคุณสามารถอัปโหลดแผนการที่จะexplain.depesz.com
a_horse_with_no_name

1
หาก Postgres ทำงานบน SSD คุณเกือบจะต้องpostgresql.conf
จูน

1
@JavierValencia: หากคุณสามารถแก้ไขปัญหาได้โปรดเพิ่มคำตอบที่อธิบายถึงสิ่งที่คุณทำเพื่อให้ผู้อื่นสามารถเรียนรู้จากสิ่งนั้นได้ คุณสามารถยอมรับคำตอบของคุณเองเพื่อทำเครื่องหมายคำถามนี้ว่าถูกแก้ไขแล้ว
a_horse_with_no_name

คำตอบ:


41

MySQL และ PostgreSQL นั้นค่อนข้างต่างกับประสิทธิภาพ ตาราง InnoDB และ PostgreSQL ได้รับการปรับให้เหมาะกับการสืบค้นที่หลากหลาย การเข้าใจความแตกต่างเหล่านี้เป็นสิ่งสำคัญในการทำความเข้าใจวิธีการได้รับประสิทธิภาพที่ดีจากทั้ง

ตัวอย่างเช่นลองดูความแตกต่างที่ชัดเจนที่สุด

PostgreSQL เทียบกับ MySQL / InnoDB โครงสร้างตารางและสิ่งนี้หมายถึงประสิทธิภาพ

โดยทั่วไปเกี่ยวกับภาระงานที่ซับซ้อน PostgreSQL จะเร็วขึ้น แต่ในการค้นหาคีย์หลักอย่างง่าย MySQL กับ InnoDB จะเร็วขึ้น

ตาราง PostgreSQL เป็นตารางฮีป ไม่มีตัวเลือกในการสร้างตารางซึ่งไม่ใช่ตารางฮีป clusterคำสั่งเพียงแค่ปรับเปลี่ยนกองรับคำสั่งจากดัชนีที่ระบุ ดัชนีจะให้ตำแหน่งของฮีพสำหรับค่าอันดับต่างๆ ดัชนีไม่สามารถข้ามไปตามลำดับทางกายภาพได้ดังนั้นมีเพียงลอจิคัลลำดับเพื่อให้มีดิสก์ I / O สุ่มจำนวนมากในขณะที่อ่านตารางตามลำดับมักจะหมายถึงดิสก์ I / O ตามลำดับจำนวนมากเนื่องจากคุณสามารถอ่านตารางตามลำดับทางกายภาพ ดิสก์ I / O ตามลำดับได้รับการใช้แคชแบบอ่านล่วงหน้าและการเพิ่มประสิทธิภาพระดับ OS อื่น ๆ

สิ่งนี้หมายความว่าถ้าคุณต้องการส่วนสำคัญของระเบียนหรือมากกว่าสองสามหน้ามันมักจะเร็วกว่าที่จะอ่านหน้าจากดิสก์ ในทางกลับกันการค้นหาคีย์หลักสำหรับตารางต้องกดปุ่มดัชนีค้นหาตำแหน่งในไฟล์จากนั้นกดปุ่มตารางฮีปแล้วดึงระเบียน นี่หมายถึงจำนวนของดิสก์สุ่ม I / O

InnoDB ใช้วิธีการอื่น ด้วย InnoDB ตารางจะเป็นดัชนีแบบ b-tree ที่มีข้อมูลจริงในส่วนของข้อมูลดัชนี ซึ่งหมายความว่าการค้นหาคีย์หลักได้รับการดึงข้อมูลจากหน้าใบไม้แล้วและจำเป็นต้องใช้ดิสก์ I / O แบบสุ่มน้อยลง ในเวลาเดียวกันการสแกนดัชนีต้องการสำรวจดัชนีสองดัชนีแทนที่จะเป็นดัชนีเดียวซึ่งหมายถึงการใช้ดัชนีใด ๆ นอกเหนือจากคีย์หลักจบลงช้าลงและการสแกนตามลำดับช้าลง

รับการวินิจฉัยใน PostgreSQL

ฉันคิดว่าคุณต้องการใช้สิ่งที่ชอบ:

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

ที่จะให้แผนแบบสอบถามการประมาณการเริ่มต้นเวลาจริงการใช้บัฟเฟอร์และอีกมากมาย


4
+1 สำหรับอธิบาย (วิเคราะห์, บัฟเฟอร์, verbose)
karmakaze

@ChrisTravers ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม! คุณพูดว่า: "... (การ InnoDB's) การสแกนตามลำดับช้าลง" คุณช่วยอธิบายสิ่งที่คุณหมายถึงโดยการสแกนตามลำดับในบริบทนี้ได้ไหม
VB_

ขอบคุณ ฉันจะแก้ไขคำตอบ การสแกน "ตามลำดับ" ใน InnoDB อยู่ในลำดับดัชนีเชิงตรรกะเพื่อให้คุณมี I / O แบบสุ่มมากขึ้นและไม่มีความช่วยเหลือจากการแคชล่วงหน้า
Chris Travers

ขอบคุณสำหรับคำตอบที่ดี สำหรับทุกคนที่อยากรู้เกี่ยวกับภายในของ postgres ฉันแนะนำโพสต์นี้: interdb.jp/pg/pgsql01.htmlอธิบายว่า Postgres เก็บข้อมูลอย่างไรในตารางของฮีป
hqt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.