동일한 스키마 / 쿼리에 대한 MySQL과 PostgreSQL의 성능 차이 [닫기]


20

저는 초보자 DBA이고 Microsoft SQL Server에 경험이 있지만 FLOSS로 넘어 가고 싶습니다.

회사를 시작하고 Postgres 백엔드를 사용하여 앱 (PHP)을 개발했으며 MySQL과 비교하여 몇 가지 테스트를 수행했습니다. MySQL은 PostgreSQL보다 두 배 빠릅니다.

나는 확실한 성능 테스트를 수행했습니다.

  • 동등한 열 데이터 유형이있는 테이블의 동일한 열
  • 같은 수의 행.
  • 둘 다 동일한 인덱스 (기본 키 포함).
  • CPU로드가 유휴 상태이며 Postgres 시스템이 훨씬 좋습니다.
  • 그리고 같은 쿼리입니다.

내가 무엇을 잘못하고 있지?

추신 : 데이터베이스 엔진의 성능 조정에 대한 많은 "방법"을 읽었습니다.
PS (2) : MySQL 데이터베이스에서 InnoDB (테이블 당 하나의 파일)를 사용하고 있습니다.


안녕 매트!

세 가지 일반적인 선택 및 가장 어려운 쿼리를 수행했습니다.

디스크에 관한 질문은 확실히 동일하지 않습니다. Postgres에서 SSD는 거의 3 배 빠른 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

(영어는 괜찮습니다.)로드 테스트를 했습니까? 아니면 개별 쿼리를 했습니까? 사용한 데이터베이스 설정 (특히 캐시 크기 등)을 표시 할 수 있습니까? (두 경우 모두 같은 디스크일까요?)
Mat

1
당신은 쿼리를 사용하여 포스트 그레스 실행 계획을 게시 할 수 있습니다 explain analyze. 쉽게 읽을 수 있도록하기 위해, 당신은에 계획을 업로드 할 수 있습니다 explain.depesz.com
a_horse_with_no_name

1
Postgres가 SSD에서 실행되는 경우 거의 확실하게 조정해야합니다.postgresql.conf
a_horse_with_no_name

1
@JavierValencia : 문제를 해결할 수 있다면 다른 사람들이 그로부터 배울 수 있도록 수행 한 작업에 대한 답변을 추가하십시오. 해결로 당신은이 질문을 표시하기 위해 자신의 대답을 받아 들일 수
a_horse_with_no_name

답변:


41

MySQL과 PostgreSQL은 성능 측면에서 상당히 차이가 있습니다. InnoDB 및 PostgreSQL 테이블은 다양한 종류의 쿼리에 최적화되어 있습니다. 이러한 차이점을 이해하는 것은 어느 것에서 좋은 성과를 얻는 방법을 이해하는 데 중요합니다.

예를 들어 가장 분명한 차이점을 살펴 보겠습니다.

PostgreSQL과 MySQL / InnoDB 테이블 구조 및 이것이 의미하는 바

일반적으로 복잡한 작업로드에서는 PostgreSQL이 더 빠르지 만 간단한 기본 키 조회에서는 InnoDB가있는 MySQL이 더 빠릅니다.

PostgreSQL 테이블은 힙 테이블입니다. 힙 테이블이 아닌 테이블을 빌드하는 옵션은 없습니다. 이 cluster명령은 단순히 지정된 인덱스에 의해 정렬 된 힙을 다시 작성합니다. 그런 다음 인덱스는 다양한 값을 가진 튜플의 힙 위치를 제공합니다. 인덱스는 물리적 순서로 순회 할 수 없으며 논리적 순서 만이므로 테이블을 순차적으로 읽는 동안 많은 임의의 디스크 I / O를 갖지만 일반적으로 테이블을 물리적 순서로 읽을 수 있기 때문에 많은 순차 디스크 I / O를 의미합니다. 순차 디스크 I / O는 미리 읽기 캐시 및 기타 OS 레벨 최적화를 사용합니다.

이것이 의미하는 바는 레코드의 상당 부분 또는 몇 페이지 이상이 필요한 경우 일반적으로 디스크에서 페이지를 읽는 것이 더 빠릅니다. 반면, 테이블의 기본 키 조회에는 색인을 누르고 파일의 위치를 ​​찾은 다음 힙 테이블을 누르고 레코드를 가져와야합니다. 이는 여러 개의 임의 디스크 I / O 조각을 의미합니다.

InnoDB는 다른 접근법을 사용합니다. InnoDB에서 테이블은 인덱스 페이로드에 실제 데이터가있는 b- 트리 인덱스입니다. 이는 기본 키 조회가 이미 리프 페이지에서 데이터를 가져 오기 때문에 임의의 디스크 I / O가 덜 필요하다는 것을 의미합니다. 동시에 인덱스 스캔은 하나 대신 두 개의 인덱스를 통과해야합니다. 즉, 기본 키 이외의 다른 인덱스를 사용하면 속도가 느려지고 순차 스캔이 여전히 느려집니다.

PostgreSQL에서 진단 받기

나는 당신이 다음과 같은 것을 사용하고 싶다고 생각합니다.

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

그러면 쿼리 계획, 초기 예상 시간, 실제 시간, 버퍼 사용량 등이 제공됩니다.


4
EXPLAIN (세부, 완충액 분석)에 대한 +1
karmakaze

@ChrisTravers 좋은 답변 주셔서 감사합니다! "... (InnoDB의) 순차 스캔 속도가 느립니다." 이 맥락에서 순차적 스캔으로 무엇을 의미하는지 설명해 주시겠습니까?
VB_

감사. 답변을 수정하겠습니다. InnoDB의 "순차적"스캔은 인덱스 논리 순서이므로보다 임의의 I / O가 가능하며 미리 읽기 캐싱의 도움이 없습니다.
Chris Travers

좋은 답변 주셔서 감사합니다. postgres의 내부에 대해 궁금한 사람은 다음 게시물을 추천합니다. interdb.jp/pg/pgsql01.html Postgres가 데이터를 힙 테이블로 저장하는 방법을 설명하십시오.
hqt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.