왜 PostgresSQL?
관계형 데이터베이스에서는 MySQL만 사용해왔는데 PostgreSQL을 반 강제로 사용하게 될 일이 생겼다.
쓰라고 하니 쓰라는 것보다는 해당 데이터베이스에 대한 이해를 조금이나마해보고자 MySQL과의 비교글을 찾아 읽고 정리해보았다.
- MySQL은 많은 DDL 작업을 논 블로킹으로 실행한다. 반면 PostgreSQL은 어떤 DDL 작업을 했는지에 따라 달라지기는 하지만 열을 추가하는 등은 블로킹한다.
- SELECT 문에 있어 대량 데이터의 정렬이 필요한 SELECT (ORDER BY를 한 후 테이블의 모든 데이터를 검색하는 등)은 MySQL이면 처리가 늦는다. MySQL은 대량 데이터를 정렬하는 것을 기본으로 유스 케이스로 상정하고 있지 않다. 대신 MySQL은 신규 10 건이나 100 개의 데이터 (TOP n 레코드)를 취득하는 유스 케이스에 특화되어 있다. 이 점은 PostgreSQL보다 빠르다.
- UPDATE 문에 있어서는 MySQL쪽이 빠르다. 왜냐하면 PostgreSQL은 UPDATE 할 때 INSERT와 비슷한 처리를 하기 때문이다. 이전의 행 삭제 플래그의 종류를 세운 뒤, 변경된 데이터를 가진 새 행을 추가하는 방식으로 UPDATE를 한다. 반면 MySQL은 대상이되는 행의 값을 직접 덮어 쓰기 때문에 빠르다.
- 테이블 JOIN 알고리즘으로 Nested Loop Join, Hash Join, Sort Merge Join 3 종류가 있다. (각 Join에 대한 자세한 설명은 이곳을 참고하자) MySQL은 Nested Loop Join만 사용하지만 PostgreSQL은 세 종류 모두 지원한다.
- Nested Loop Join(중첩 루프 조인) : 결합한 데이터의 양이 적을 때
- Hash Join(해쉬 조인) : 결합할 데이터의 양이 많고 정렬되어 있지 않은 경우
- Sort Merge Join(정렬 병합 조인) : 결합할 데이터의 양이 많고 정렬되어 있는 경우
결론적으로 MySQL은 '비교적' 간단한 프로젝트에 널리 사용된다. 로드가 많거나 복잡한 쿼리는 성능이 저하된다.
반면 PostgresSQL은 읽기, 쓰기 속도가 중요하고 데이터를 검증해야 하는 대규모 시스템에서 널리 사용된다. 빈번한 update 성격일 경우 성능, 불안정 하지만 insert 위주 성격일 경우에는 적합하다. 복잡한 쿼리를 실행해야하는 시스템에서 가장 잘 사용 된다. 동시성을 효율적으로 처리하여 매우 높은 수준의 동시성을 달성한다.
거칠게 요약하자면,
PostgreSQL는 엔터프라이즈 급에서 사용되는 경우가 많다는 인상이 있고 MySQL은 비교적 소규모에 적합하다는 결론을 얻을 수 있다. (그러나 절대적인 것은 아니고, 어느정도 규모가 있는 스타트업에서도 MySQL을 사용하기도 합니다.)
참고한 글)
https://needjarvis.tistory.com/162
codingcoding.tistory.com/1060
velog.io/@jisoo1170/Oracle-MySQL-PostgreSQL-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80
valuefactory.tistory.com/497
설치 및 tutorial
www.enterprisedb.com/downloads/postgresql
www.enterprisedb.com/postgresql-tutorial-resources-training?cid=48
설치는 구글링하면 나오니 생략하도록 하자.
명령어로 콘솔에서 접속할 수 있도록 환경변수 세팅도 해주자
세팅 후에는 version check를 통해 해당 명령어가 환경 변수로 잘 들어 갔는지 확인합시다.
postgres -V // server version 확인
psql -V // client version 확인
간단한 명령어들
우선 접속을 시도합시다. pgAdmin을 통해 쉽게 유저를 생성할 수 있습니다.
기본적으로는 postgres 유저가 생성되어 있는 것을 확인하실 수 있습니다. 비밀번호를 걸어줍시다.
잘 정리해두신 분 것을 가져왔습니다. (출처)
psql -h 호스트 -p 포트 -U 사용자명 디비명
# localhost의 5432 port로 Postgresql 접속을 시도. Target DB는 현재 사용자 이름과 동일한 'browndwarf'
[browndwarf@localhost ~]$ psql
# localhost의 5432 port로 Postgresql 접속을 시도. 접속 User는 'postgres'이며 Target DB는 접속 User와 동일한 'postgres'
[browndwarf@localhost ~]$ psql -U postgres
# 10.52.0.1의 5432 port로 Postgresql 접속을 시도. 접속 User는 'browndwarf'이며 Target DB는 현재 사용자 이름과 동일한 'browndwarf'
[browndwarf@localhost ~]$ psql -h 10.52.0.1
# 10.52.0.1의 5432 port로 Postgresql 접속을 시도. 접속 User는 'posgres'이며 Target DB는 접속 User와 동일한 'browndwarf'
[browndwarf@localhost ~]$ psql -h 10.52.0.1 -U posgres
# 10.52.0.1의 5432 port로 Postgresql 접속을 시도. 접속 User는 'browndwarf'이며 Target DB는 'galaxy'
[browndwarf@localhost ~]$ psql -h 10.52.0.1 -U browndwarf galaxy
[browndwarf@localhost ~]$ psql -h 10.52.0.1 -U browndwarf -d galaxy
# 10.52.0.1의 9000 port로 Postgresql 접속을 시도. 접속 User는 'browndwarf'이며 Target DB는 'galaxy'
[browndwarf@localhost ~]$ psql -h 10.52.0.1 -p 9000 -U browndwarf galaxy
[browndwarf@localhost ~]$ psql -h 10.52.0.1 -p 9000 -U browndwarf -d galaxy
SELECT datname FROM pg_database; // 전체 DB 확인
DROP DATABASE [DB명] // drop
CREATE DATABASE [DB명] // create
pgAdmin, pg, etc...
아마 postgresql을 사용하면 pgAdmin도 같이 설치될 것이다.
pgAdmin에 접속 후 설치할 때 입력한 비밀번호를 입력하면 대쉬보드로 접근할 수 있다.
너무 너무 편리~
node 환경에서는 pg 패키지를 사용하면 되고 (주간 다운로드 수가 어마어마하다)
https://www.npmjs.com/package/pg
django에서는 psycopg2를 이용하면 된다. 관련 내용은 아래에 정리해두었다.
https://darrengwon.tistory.com/728
'DB, ORM > 🧊 PostgreSQL' 카테고리의 다른 글
psql 명령어 (0) | 2020.11.07 |
---|