분류 전체보기 12

CH17 Innodb 클러스터

mysql5.7버전에서 나온 빌트인 형태의 HA 솔루션 구성 요소 그룹 복제 소스 서버의 데이터를 레플리카 서버로 동기화하는 기본적인 복제 역할뿐만 아니라 복제에 참여하는 MySQL들에 대한 자동화된 멤버십 관리 역할 담당 MySQL 라우터 애플리케이션 서버와 MySQL 서버 사이에서 동작하는 미들웨어 프로그램. 애플리케이션이 실행한 쿼리를 적절한 MySQL서버로 전달하는 Proxy 역할 담당 MySQL shell 기존 MySQL 클라이언트보다 좀 더 확장된 기능. SQL뿐 아니라 자바스크립트 및 파이썬 작성 가능. 클러스터 구성등의 어드민 기능 가능 구성 형태 그룹 복제에 설정된 모드에 따라서 복제 그룹 내에서 프라이머리는 하나만 존재할 수도 있고 여러대가 존재할 수도 있다. 그룹 복제 row포멧 바이..

MySQL 2023.08.26

Real MySQL 파티션

CH13 파티션 파티션을 사용하는 이유 테이블이 커져서 인덱스의 크기가 물리적인 메모리보다 크거나, 데이터 특성상 주기적인 삭제가 필요한 경우 단일 insert와 범위 select의 빠른 처리 결과적으로 파티션은 데이터와 인덱스를 조각화해서 물리적 메모리를 효율적으로 사용하게끔 함 이력 데이터의 효울적인 관리 불필요한 데이터 삭제작업은 단순히 파티션을 추가하거나 삭제하는 방식으로 빠르고 간단하게 해결 Q. 파티션이 없다면 불필요한 데이터 삭제는 어떤식으로 할 수 있을까 ? soft delete / hard delete 파티션 테이블의 레코드 insert 파티션 키를 통해 insert되어야할 파티션을 선정 후 일반 테이블에 insert하는 것과 동일하게 처리된다. 파티션 키 컬럼이 변경될때는 기존 파티션에..

MySQL 2023.08.04

Real MySQl CH11 쿼리 작성 및 최적화

INSERT … ON DUPLICATE KEY UPDATE 일반적인 INSERT가 수행되나, PK나 UK에 중복이 발생하면 UPDATE문이 수행된다. LODA DATA 데이터를 빠르게 적재하는 방법 단점 단일 스레드로 실행 데이터가 매우 크다면 시간이 매우 길어진다. 레코드 insert 및 인덱스 insert가 단일 쓰레드로 직렬 수행 단일 트랜잭션으로 실행 언두로그 사이즈가 커지며, 레코드를 읽는 쿼리들이 필요한 레코드를 찾는데 더 많은 오버헤드 발생 해결방안 LODA DATA로 적재할 파일을 여러개로 준비 테이블간 복사 작업이라면 INSERT .. SELECT 작업으로 진행, PK값을 기준으로 나눠서 진행 Q. 데이터를 빠르게 저장하는 다른 방법은 뭐가 있을까? 기존에 존재하는 테이블이라면 인덱스 및..

MySQL 2023.07.21

Real MySQL CH 11 쿼리 작성 및 최적화(2)

LIMIT limit은 항상 쿼리의 맨 마지막에 수행된다. limit절의 n,m값이 커지게 되면 쿼리 수행이 상당히 오래 걸리게 된다. SELECT * from salaries ORDER BY salary LIMIT 2000000,10 위 쿼리를 수행하게 되면 20000010번까지 읽은 후 마지막 10개만 반환하게 된다. 이럴경우 쿼리가 느려질 수 있다. 보통 페이징 처리를 위해 LIMIT절을 사용하게 되는데, 이럴경우 단순히 페이지 번호로 조회하지 말고 WHERE절로 읽어야할 위치를 찾고 그 위치에서 10개만 읽는 식의 쿼리가 좋다. SELECT * from salaries WHERE salary >= (이전 페이지 마지막 값) AND NOT (중복을 제거하기 위한 조건) ORDER BY salary ..

카테고리 없음 2023.07.14

[Real MySQL2] Ch11 쿼리 작성 및 최적화

쿼리 작성과 연관된 시스템 변수 SQL모드 STRICT_ALL_TALBES & STRICG_TRANS_TABLES 타입이 적절히 변하거나 값의 길이가 칼럼의 ㅚ대 길이보다 큰 경우 MySQL서버가 INSERT/UPDATE를 수행하지 않도록 하는 설정 값 11.1.2 영문 대소문자 구분 MySQL서버가 운영체제와 관계없이 대소문자 구분의 영향을 받지 않게 하려면, MySQL서버의 lower_case_table_names 시스템 변수를 설정하면 된다 . 11.3.1.1 문자열 MySQL에서는 역따움표(`)로 감싸서 예약어와의 충돌을 피할수 있다(order 전체적으로 MySQL서버의 고유한 방법을 배제하고 SQL 표준 표기법만 사용할 수 있게 강제하려면 sql_mode 시스템ㅂ 변수값에 ‘ANSI’를 설정하면..

카테고리 없음 2023.07.01

MySQL 8.0.29 OnlineDDL

OnlineDDL 확인사항 MySQL 8.0.29의 Online DDL Engine type이 innodb인 경우만 가능하다. ALTER TABLE 명령을 실행하면 MySQL서버는 다음 순서로 스키마 변경에 적합한 알고리즘을 찾는다 ALGORITHM=INSTANT로 스키마 변경이 가능한지 확인 후, 가능하다면 선택 ALGORITHM=INPLACE로 스키마 변경이 가능한지 확인 후, 가능하다면 선택 ALGORITHM=COPY로 스키마 변경이 가능한지 확인 후, 가능하다면 선택 LOCK 수준이 명시되지 않으면 MySQL서버가 적절한 수준의 잠금 수준을 선택 INSTANT는 메타데이터만 변경하기 때문에 짧은 시간의 메타데이터 잠금만 필요로 하므로 LOCK을 명시할수 없다. INPLACE 및 COPY 알고리즘을..

카테고리 없음 2022.06.08

MySQL binlog format

binlog를 저장하는 format은 3가지가 있다. STATEMENT format ROW format MIXED format global 및 각 세션마다 binlog format을 설정할 수 있다. mysql> SET GLOBAL binlog_format = 'ROW'; mysql> SET SESSION binlog_format = 'STATEMENT'; mysql> SET SESSION binlog_format = 'ROW'; mysql> SET SESSION binlog_format = 'MIXED'; 1. ROW format 변경된 row를 binary format으로 binlog에 저장한다. Each row may consist of a Before Image (BI) and/or an Afte..

MySQL 2022.06.08

NULLABLE 컬럼에 대한 인덱스 사용 ( Oracle vs MySQL)

* 요약 오라클에서는 NULL 값을 인덱스에 저장하지 않는다. 따라서 오라클에서는 NULL 이 허용된 컬럼에 대해 인덱스를 생성해도 IS NULL 혹은 IS NOT NULL 조건으로 조회시 인덱스를 사용할 수 없고, group-by 혹은 distinct 사용시 인덱스를 사용할 수 없다. (NULL이 있는지 없는지 FULL SCAN을 해야만 알 수 있으므로) 하지만 MySQL/Maria 에서는 NULL 값도 인덱스에 저장한다. 따라서 컬럼을 IS NULL 혹은 IS NOT NULL로 비교해서 인덱스를 사용할 수 있고, group-by 및 distinct 사용시 인덱스를 사용할 수 있다. https://dev.mysql.com/doc/refman/8.0/en/is-null-optimization.html 1..

MySQL 2022.05.10

트랜잭션 격리 수준(ISOLATION LEVEL)

트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다. 격리 수준 종류 1.READ UNCOMMITTED 2. READ COMMITTED 3. REPEATABLE READ 4. SERIALIZABLE 각 트랜잭션의 격리 수준에 따라 세가지 부정합이 생길 수 있다. DIRTY READ 커밋되지 않은 데이터를 데이터를 다른 트랜잭션에서 읽는 상황 NON-REPEATABLE READ 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 두 쿼리의 결과가 다르게 나타나는 현상 PHANTOM READ 한 트랜잭션 안에서 일정..

MariaDB 2022.05.06

MySQL/MariaDB Storage 엔진 비교

1. InnoDB 엔진 1.1 특징 3개 엔진중 유일하게 트랜잭션을 지원하여 ACID를 충족한다. 또한 외래키를 지원한다. 데이터가 클러스터링 인덱스(프라이머리 키)기반으로 저장되며 세컨더리 인덱스는 리프노드에 프라이머리키 값을 저장한다. MVCC 기능을 통해 잠금을 사용하지 않는 일관된 읽기 기능을 제공한다. row-level lock을 사용하여 multi-user 환경에서 높은 성능을 제공한다. InnoDB 버퍼풀을 사용하여 디스크의 데이터파일/인덱스를 메모리에 캐시하며, 쓰기버퍼 역할을 수행한다. Undo 로그를 활용하여 트랜잭션 보장 및 격리 수준을 보장한다. 체인지 버퍼를 사용하여 인덱스에 대한 UPDATE 작업을 버퍼링 하여 성능을 향상 시킨다 (유니크 인덱스 제외) 리두 로그를 통해 자동화된..

MariaDB 2022.05.06