MySQL
- 가장 인기 있는 관계형 데이터베이스.
- 1995년 스웨덴 회사였던 MySQL AB에 의해 개발.
- 오픈 소스(무료)로 시작됨.
- Sun microsystems 인수 > Oracle이 sun을 인수하는 과정에서 MySQL도 Oracle의 제품이 됨.(유료화 소문이 나서 인기 좀 떨어짐.)
- MySQL의 처음 개발자였던 Monty가 MySQL과 호환이 되는 Maria DB라는 오픈소스 개발.
- Commynity Server : 오픈소스로 무료.
- Emterprise Server : 유료버전으로 다양한 플러그인 제공.
MariaDB
- 오픈 소스로 무료.
- MySQL과 인터페이스 동일하나, 성능이 더 좋음.
MySQL의 특징.
- 한동안 웹개발 표준 기술 스택 중의 하나였음.
- LAMP : Linux, Apache, MySQL, PHP
- 지금도 Postgres와 함께 가장 널리 쓰이는 프로덕션용 관계형 데이터베이스.
용량증대방식
1. Scale-Up : 서버에 CPU와 Memory추가. 메모리와 저장공간이 부족하다면, 확장해버린다.
- 서버의 하드웨어를 증대시키면 서버 성능도 당연히 개선되지만, 한 서버에 붙일 수 있는 메모리와 저장공간에는 한계가 있다.
- 따라서 Scale Up을 하기 전 '정말로 필요한 데이터만 데이터베이스에 있는가?' '안 쓰거나 굳이 있을 필요가 없는 데이터가 스택을 낭비하지는 않는가?'에 있지는 않은가?'에 대해 고민해보아야 한다.
- Scale-Out : Master-Slave 구성.
-
일반적인 클러스터 구성.(서버를 계속 늘리는 방식)
-
MySQL은 이를 지원하지 못한다 : 기본적으로 한 개의 서버에서만 구동하는 방식이기 때문.
때문에 Master 서버에 저장되는 데이터가 읽기 전용으로 Slave에 자동 복사되는, Master – Slave 방식을 사용한다.
데이터를 읽을 일이 있다면 Slave를 열람하고, Slave끼리 묶어서 활용도 가능.
적어도 읽기에 관해서는 Slave를 활용하여 더 나은 속도와 기능을 제공할 수 있다.
-
MySQL의 서버 자체가 커지는 것은 아니라는 단점이 있다.
클라우드
클라우드란?
- 컴퓨팅 자원(하드웨어, 소프트웨어 등)을 네트웤을 통해 서비스 형태로 제공하는 것.
- No Provisioning
Pay As You Go
자원(예. 서버)을 필요한 만큼 (거의) 실시간으로 할당하여 사용하고, 사용한 만큼 지불하는 시스템.
- 탄력적으로 필요한 만큼의 자원을 유지하는 것이 중요.
시간을 단축할 수 있다.
- '소유'의 모델 : 초기에 시간이 많이 걸림. 필요가 사라지면 잉여 자원이 됨. 초기 투자비용이 들고, 감가상각이 된다.
- '대여'의 모델 : 사용한 만큼 돈 지불. 시간을 절약할 수 있음. 초기 투자비용은 없거나 적지만, 장기적으로는 어떨지 모름.
클라우드 컴퓨팅 서비스가 없었다면?
- 서버/네트웤/스토리지 구매와 설정 등을 직접 수행해야 함.
- 데이터센터 공간을 직접 확보.
- 데이터센터 확장이 필요한 경우 공간을 먼저 더 확보해야 함.
- 열이 올라가면 성능이 저하되므로, 냉방도 고려해야 함.
- 공간을 구비했다면, 서버를 구매하여 설치하고 네트웤을 설치해야 함.
- 일반적으로 이 과정이 적어도 2~3 개월은 걸림.
- 서버의 수용능력을 Peaktime을 기준으로 설계해야 함.
- 놀고 있는 자원들이 높게 발생하는 현상 발생.
직접 운영비용 vs 클라우드 비용
클라우드 컴퓨팅의 장점.
- 초기 투자비용이 크게 감소
- CAPEX (Capital Expenditure) vs OPEX (Operating Expense)
CAPEX는 재무담당이 좋아한다. 초기 투자비용과 감가상각을 계산하는 것이 더 익숙하기 때문. OPEX는 초기 투자비용이 적지만, 장기적, 지속적으로 비용이 들기 때문에 예측하기 어렵다.
- 리소스 준비를 위한 대기시간 대폭 감소.
- 노는 리소스 제거로 비용 감소.
- 글로벌 확장 용이.
- 소프트웨어 개발시간 단축.
AWS
- 가장 큰 클라우드 컴퓨팅 서비스 업체.
- 2002년 아마존의 상품데이터를 API로 제공하며 시작. (잉여 서버를 대여하는 것으로 시작.)
현재 100여개의 서비스를 전 세계 15개의 지역에서 제공.
대부분의 서비스들이 오픈소스 프로젝트를 기반으로 함.
최근 들어 ML/AI관련 서비스들도 내놓기 시작.
- 사용 고객
다수의 상장업체들과 많은 국내 업체들도 사용 시작(서울 리전)
- 다양한 종류의 소프트웨어/플랫폼 서비스를 제공.
AWS의 서비스만으로 쉽게 온라인 서비스 생성.
MySQL의 사용.
SQL기본.
- 다수의 SQL문을 실행한다면 세미콜론으로 분리 필요.
SQL 문1; SQL 문2; SQL 문3;
- SQL 주석.
-- : 인라인 한줄까리 주석. 자바에서 //에 해당.
/ -- / : 여러 줄에 걸쳐 사용 가능한 주석.
- SQL키워드는 대문자를 사용한다든지 하는 나름대로의 포맷팅 필요.
팀 프로젝트라면 팀에서 사용하는 공통 포맷이 필요.
- 테이블/필드이름의 명명규칙을 정하는 것이 중요.
단수 vs 복수. _(언더바) vs CamelCasing(대문자 사용)
MySQL의 DDL - 테이블 구조 정의 언어
Create Table
- CREATE TABLE table_name;
- Primary key 속성 지정 가능
- 성능 향상을 위해 인덱스 지정 가능.
테이블 필드의 중요 속성
- Primary key
테이블에서 레코드의 유일성을 정의하는 필드가 primary key가 되어야 함.
- 사용자 테이블에서 이메일, 주민등록번호 등.
- Primary key는 뒤쪽에 넣어주는 것이 범용적이고 좋음.
- Composite primary key : primary key가 두 개 혹은 그 이상의 필드로 정의되는 경우, primary key로 지정된 필드가 있는 경우 데이터베이스단에서 중복된 값을 갖는 레코드가 생기는 것을 방지한다 : primary key uniqueness constraint
- Foreign key
테이블의 특정 필드가 다른 테이블의 필드에서 오는 값을 갖는 경우.
- NOT NULL
필드의 값이 항상 존재해야 하는 경우.
- DEFAULT value
필드에 값이 주어지지 않은 경우 기본값을 정의함.
timestamp 타입 : CURRENT_TIMESTAMP를 사용하면 현재 시간으로 설정됨.
- AUTO_INCREMENT : 알아서 값을 배정해줌.
DROP TABLE
- DROP TABLE table_name;
테이블 삭제. 없는 테이블을 지우려고 하는 경우에는 에러를 출력함.
- DROP TABLE IF EXISTS table_name;
'테이블이 존재하는 경우' 삭제. 해당 테이블이 존재하지 않는 경우에도 오류 출력하지 않음.
ALTER TABLE
- 새로운 컬럼 추가
ALTER TABLE 테이블이름 ADD COLUMN 필드이름 필드타입;
- 기존 컬럼 이름 변경
ALTER TABLE 테이블이름 RENAME 현재필드이름 to 새필드이름;
- 기존 컬럼 제거
ALTER TABLE 테이블이름 DROP COLUMN 필드이름;
- 테이블 이름 변경
ALTER TABLE 테이블이름 RENAME to 새테이블이름;
MySQL의 DML - 테이블 데이터 조작 언어
-
SELECT : 테이블 질의 언어
SELECT FROM : 테이블에서 레코드와 필드를 읽어오는데 사용.
WHERE를 사용, 레코드 선택 조건을 지정.
GROUP BY를 통해 정보를 그룹 레벨에서 뽑는데 사용.
ORDER BY를 사용해, 레코드 순서를 결정.
-
레코드 추가/삭제/수정 언어
INSERT INTO : 테이블에 레코드 추가.
UPDATE FROM : 테이블 레코드 필드 값 수정.
DELETE FROM : 테이블에서 레코드 삭제. (조건 지정 가능. 일부만 날리는 등.)
vs TRUNCATE : 조건 없이 테이블의 모든 레코드 삭제.