MySQL 개념 정리해보기(1)

hyeok2·2024년 2월 25일
0

MySQL_STU

목록 보기
2/2
post-thumbnail

계기

문득 지금까지 내가 한건 다 찍먹이라는 생각이 들며, 지난 나를 반성하게 되었다. db를 그냥 연결해서 쓰면 되지, 아니면 뭐 이렇게 저렇게 하다보면 되니까 주먹구구식으로 하면되지라고 생각하고 전혀 딥하게 파고들지 않았다고 생각이 들었다. 그래서 공식문서 보면서 적당히 파보려고 한다.

https://dev.mysql.com/doc/refman/8.3/en/manual-info.html

1. MySQL 이 뭘까?

  • db 관리 시스템이다.(management system)
  • 관계형 DB이다.
    - 관계형 db는 하나의 큰 저장소에 저장하는 대신, 별도의 테이블에 데이터를 저장한다.
    • db, 테이블, 뷰, row, column과 같은 논리적 모델은 유연한 프로그래밍 환경을 제공한다.
    • 일대일, 일대다, unique, 필수 또는 선택사항 등 필드간의 관계를 제어하는 규칙을 설정한다.
    • SQL은 Structured Query Language를 의미한다. ANSI/ISO SQL 표준에 의해 정의된다.
    • MySQL은 오픈소스이며, 사용가능한 모든 메모리, CPU성능 및 I/O용량 설정을 조정할 수있다.

2. 주요 기능

  • C 와 C++로 작성되었다.
  • Purify(상용 메모리 누출 탐지기) 와 GPL 도구인 Valgrind로 테스트 되었다. (이게 뭔지는 조금 더 딥하게 알아봐야겠다.
  • 독립적인 모듈을 갖춘 다층 서버 설계를 사용한다.
  • 여러 CPU를 쉽게 사용할 수 있도록 커널 스레드를 사용하여 멀티스레드 되도록 설계 되었다.
커널 스레드: 운영체제가 직접 관리하는 스레드를 의미합니다. 커널 스레드는 프로세스 내에서 다양한 작업을 동시에 처리할 수 있도록 해주는데, MySQL에서는 이를 통해 여러 사용자의 동시 접속이나 복잡한 쿼리 처리 등을 가능하게 합니다.
멀티스레드: 멀티스레드는 한 프로세스 내에서 여러 개의 스레드가 동시에 작업을 수행하는 것을 의미합니다. MySQL은 멀티스레드를 통해 여러 CPU를 효과적으로 활용하며, 이를 통해 높은 처리 성능과 효율성을 보장합니다.
즉, MySQL은 커널 스레드를 활용한 멀티스레드 설계를 통해 대용량 데이터를 빠르고 효율적으로 처리하도록 설계되었습니다.
  • 인덱스 압축과 함께 매우 빠른 B-트리 디스크 테이블( MyISAM)을 사용한다.
MyISAM은 MySQL 초기부터 사용되었던 스토리지 엔진으로, 빠른 읽기 속도와 공간 효율성 등의 장점이 있다. 이러한 특징들은 MyISAM이 사용하는 B-트리 디스크 테이블과 인덱스 압축 기능에서 비롯된다.
B-트리 디스크 테이블: MyISAM은 B-트리(Balanced Tree) 인덱스를 사용합니다. B-트리는 모든 노드가 균형을 이루고 있어, 탐색, 삽입, 삭제 등의 연산이 빠르게 이루어집니다. 이 구조를 활용하면 대용량 데이터에서도 빠른 검색 성능을 보장합니다.
인덱스 압축: MyISAM은 인덱스 파일을 압축하여 저장 공간을 효율적으로 활용합니다. 이는 디스크 공간을 절약할 뿐만 아니라, 인덱스 조회 시 I/O 비용을 줄여 성능을 향상시킨다.
하지만 MyISAM은 트랜잭션을 지원하지 않고, 테이블 레벨의 락을 사용하기 때문에 대량의 데이터 쓰기 작업이나 동시성이 중요한 환경에서는 성능 저하를 일으킬 수 있다.

2.1 데이터 유형

  • 다양한 데이터 유형을 지원한다. (모든 표준 SQL 숫자 유형 등)
    - 부호 있는/부호 없는 정수 1, 2, 3, 4, 8바이트 길이, FLOAT, DOUBLE, CHAR, VARCHAR, BINARY, VARBINARY, TEXT, BLOB, DATE, TIME, DATETIME, , , 및 OpenGIS 공간 유형

2.2 명령문 및 함수

mysql> SELECT CONCAT(first_name, ' ', last_name)
-> FROM citizen
-> WHERE income/dependents > 10000 AND age > 30;
first_name과 last_name을 연결해서 값을 가져온다. 하지만 중간은 공백으로 띄워주고, 시민 테이블에서 가져오는데 조건은 where로 준다. income/dependents > 10000 AND age > 30 두조건을 만족하는.

  • 위와 같은 예시를 포함하여 표준 SQL 및 ODBC 구문을 모두 지원한다.
  • 동일한 명령문에서 다른 데이터베이스의 테이블을 참조할 수도 있다.

2.3 확장성과 한계

  • 테이블당 최대 64개의 인덱스를 지원한다.
  • 각 인덱스는 1~16개의 열 또는 열의 일부로 구성될 수 있다.
  • 연결성에서는 대부분을 지원. 커넥터/ODBC 지원.

3.1 제약조건 처리

  • MySQL은 롤백을 허용하는 트랜잭션 테이블과 비트랜잭션 테이블 모두에서 작업이 가능하다.
    -> 따라서 제약조건 처리가 타 DBMS와는 약간 다르다.
  • 오류가 발생했을때 MySQL은 중간에 명령문을 중지하거나 문제를 최대한 복구하여 계속해야한다.
    -> 서버는 복구를 따른다.

3.1.1 PRIMARY KEY 및 UNIQUE 인덱스 제약 조건

  • 일반적으로 기본키, 고유키, 외래키 제약조건을 위반하는 데이터 변경문(INSERT등)으로 오류가 발생한다.
profile
땅을 파다보면 흙과 물을 보겠지만, 코드를 파다보면 답이 보일것이다.

0개의 댓글