Sự khác biệt về hiệu năng giữa MySQL và PostgreSQL cho cùng một lược đồ / truy vấn [đã đóng]


20

Tôi là người mới chơi DBA và tôi có kinh nghiệm về Microsoft SQL Server nhưng tôi muốn chuyển sang FLOSS.

Tôi đang thành lập một công ty và chúng tôi phát triển một ứng dụng (PHP) với phần phụ trợ Postgres và chúng tôi cũng đã thực hiện một số thử nghiệm so với MySQL. Chúng tôi quan sát rằng MySQL nhanh gấp đôi PostgreSQL.

Tôi đã làm một bài kiểm tra hiệu suất hữu hình:

  • Các cột giống nhau trong bảng với các kiểu dữ liệu cột tương đương.
  • Cùng số lượng hàng.
  • Cùng một chỉ mục trong cả hai (bao gồm khóa chính).
  • Tải CPU không hoạt động và máy Postgres tốt hơn đáng kể.
  • Và cùng một truy vấn (rõ ràng).

Tôi đang làm gì sai?

PS: Tôi đã đọc nhiều "howtos" về điều chỉnh hiệu năng cho các công cụ cơ sở dữ liệu.
PS (2): Chúng tôi đang sử dụng InnoDB (một tệp trên mỗi bảng) trên cơ sở dữ liệu MySQL.


Chào Mat!

Tôi đã thực hiện ba truy vấn chọn phổ biến (và khó nhất).

Câu hỏi về đĩa, chắc chắn nó không giống nhau; Trong Postgres, đó là ổ SSD (nhanh nhất gần ba lần).

Dữ liệu bộ đệm của 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                    |
+------------------------------+----------------------+

Tôi không biết làm thế nào để xem điều này trong PostgreSQL.

Cảm ơn trước.


Xin lỗi vì tiếng Anh của tôi
Javier Valencia

(Tiếng Anh của bạn vẫn ổn.) Bạn đã thực hiện các bài kiểm tra tải hay chỉ truy vấn cá nhân? Bạn có thể hiển thị các cài đặt cơ sở dữ liệu bạn đã sử dụng (đặc biệt là những thứ như kích thước bộ đệm) không? (Cùng một đĩa trong cả hai trường hợp tôi đoán?)
Mat

1
Bạn có thể gửi truy vấn và kế hoạch thực hiện Postgres bằng cách sử dụng explain analyze. Để dễ đọc hơn, bạn có thể tải lên kế hoạch để giải
thích.depesz.com

1
Nếu Postgres đang chạy trên ổ SSD, bạn gần như chắc chắn phải điều chỉnhpostgresql.conf
a_horse_with_no_name

1
@JavierValencia: nếu bạn có thể khắc phục sự cố, vui lòng thêm câu trả lời mô tả những gì bạn đã làm để người khác có thể học hỏi từ đó. Bạn cũng có thể chấp nhận câu trả lời của riêng mình để đánh dấu câu hỏi này là câu trả lời
a_horse_with_no_name

Câu trả lời:


41

MySQL và PostgreSQL khá khác biệt về hiệu năng. Các bảng InnoDB và PostgreSQL được tối ưu hóa cho các loại truy vấn khác nhau. Hiểu những khác biệt này là quan trọng để hiểu làm thế nào để có được hiệu suất tốt từ một trong hai.

Ví dụ, chúng ta hãy nhìn vào sự khác biệt rõ ràng nhất.

Cấu trúc bảng PostgreSQL vs MySQL / InnoDB và ý nghĩa của hiệu năng này

Nói chung, với các tải công việc phức tạp, PostgreSQL sẽ nhanh hơn, nhưng trên các tra cứu khóa chính đơn giản, MySQL với InnoDB sẽ nhanh hơn.

Các bảng PostgreSQL là các bảng heap. Không có tùy chọn để xây dựng một bảng không phải là bảng heap. Các clusterlệnh đơn giản viết lại đống lệnh của một chỉ số cụ thể. Các chỉ mục sau đó cung cấp các vị trí heap cho các bộ dữ liệu với các giá trị khác nhau. Các chỉ mục không thể được duyệt theo thứ tự vật lý, chỉ có thứ tự logic để chúng có nhiều I / O đĩa ngẫu nhiên trong khi đọc một bảng tuần tự thường có nghĩa là rất nhiều I / O đĩa tuần tự, vì bạn có thể đọc một bảng theo thứ tự vật lý. I / O đĩa tuần tự được sử dụng bộ đệm đọc trước và một số tối ưu hóa cấp hệ điều hành khác.

Điều này có nghĩa là nếu bạn cần một phần đáng kể các bản ghi hoặc qua một vài trang, thường sẽ nhanh hơn khi chỉ đọc các trang từ đĩa. Mặt khác, việc tra cứu khóa chính cho bảng yêu cầu nhấn chỉ mục, tra cứu vị trí trong tệp sau đó nhấn bảng heap và kéo bản ghi. Điều này có nghĩa là một số phần của I / O đĩa ngẫu nhiên.

InnoDB sử dụng một cách tiếp cận khác. Với InnoDB, bảng là một chỉ mục b-cây với dữ liệu thực tế trong tải trọng chỉ mục. Điều này có nghĩa là việc tra cứu khóa chính đã được lấy dữ liệu từ trang lá và do đó, I / O đĩa ngẫu nhiên ít hơn được yêu cầu cho việc này. Đồng thời, quét chỉ mục yêu cầu di chuyển ngang qua hai chỉ mục thay vì một chỉ mục, nghĩa là sử dụng bất kỳ chỉ mục nào ngoài khóa chính kết thúc chậm hơn và quét tuần tự vẫn chậm hơn.

Nhận chẩn đoán trong PostgreSQL

Tôi nghĩ rằng bạn muốn sử dụng một cái gì đó như:

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

Điều đó sẽ cung cấp cho bạn kế hoạch truy vấn, ước tính ban đầu, thời gian thực tế, sử dụng bộ đệm và nhiều hơn nữa.


4
1 cho GIẢI THÍCH (phân tích, bộ đệm, verbose)
karmakaze

@ChrisTravers cảm ơn vì một câu trả lời tuyệt vời! Bạn nói: "... (Quét của InnoDB) chậm hơn". Bạn có thể vui lòng giải thích những gì bạn có nghĩa là quét liên tiếp trong bối cảnh này?
VB_

cảm ơn. Tôi sẽ sửa đổi câu trả lời. Quét "tuần tự" trong InnoDB theo thứ tự logic chỉ mục để bạn có thêm I / O ngẫu nhiên và không có sự trợ giúp nào từ bộ nhớ đệm đọc trước.
Chris Travers

Cảm ơn câu trả lời tốt đẹp. Đối với bất kỳ ai tò mò về nội bộ của postgres, tôi khuyên bạn nên đăng bài này: interdb.jp/pg/pgsql01.html Giải thích cách Postgres lưu trữ dữ liệu dưới dạng bảng heap.
hqt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.