본문 바로가기
728x90

공부/Mysql29

[RealMysql 8.0] 실행 계획 10 ~ 1편 끝 참고: https://jeong0427.tistory.com/43 실행 계획 확인 8.0 버전부터는 explain 명령에 사용할 수 있는 새로운 옵션이 추가됐다. 쿼리의 실행 시간 확인 explin analyze 실행 계획 분석 id 칼럼 하나의 select 문장은 다시 1개 이상의 sub select 문장을 포함할 수 있다. 여러개의 테이블이 조인되는 경우에는 id 값이 증가하지 않고 같은 id 값이 부여된다. id 칼럼이 테이블의 접근 순서를 의미하지는 않는다. explain format=tree 명령으로 확인해보면 순서를 더 정확히 알 수 있다. select_type 칼럼 select 쿼리가 어떤 타입의 쿼리인지 표시되는 칼럼이다. simple union 이나 서브쿼리를 사용하지 않는 단순한 sel.. 2023. 2. 27.
[RealMysql 8.0] 고급 최적화 9.3 ~ 9.4.12 고급 최적화 옵티마이저 옵션은 크게 조인 관련된 옵티마이저 옵션과, 옵티마이저 스위치로 구분할 수 있다. 옵티마이저 스위치 옵션 MRR과 배치 키 엑세스(mrr & batched_key_access) 블록 네스티드 루프 조인 인덱스 컨디션 푸시다운 인덱스 확장 인덱스 머지 인덱스 머지 - 교집합 인덱스 머지 - 합집합 인덱스 머지 - 정렬 후 합집합 세미 조인 테이블 풀-아웃 퍼스트 매치 루스 스캔 구체화 중복제거 컨디션 팬아웃 파생 테이블 머지 인비저블 인덱스 스킵 스캔 해시 조인 인덱스 정렬 선호 조인 최적화 알고리즘 Exhaustive 검색 알고리즘 쿼리 힌트 인덱스 힌트와 옵티마이저 힌트로 나눌 수 있다. 인덱스 힌트 straight_join, use index 등을 포함한 인덱스 힌트들은 모두 .. 2023. 2. 27.
[RealMysql 8.0] 옵티마지어와 힌트 9 ~ 9.2 옵티마이저는 기본 데이터를 비교해 최적의 실행 걔획을 수립하는 작업을 한다. 개요 mysql 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나눌 수 있다 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 mysql 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다. sql 파싱 이라고 하며 mysql 서버의 sql 파서 라는 모듈로 처리한다. sql 문장이 문법적으로 잘못됐다면 이 단계에서 걸러진다. sql 파스 트리가 만들어 진다.mysql 서버는 sql 문장 그 자체가 아니라 sql 파스 트리를 이용해 쿼리를 실행한다. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다. 첫 번째 단계에서 만들어진 sql 파스 트리를 참조하면서 다음과 같.. 2023. 2. 26.
[RealMysql 8.0] 외래키 8.10 ~ 8.10.2 외래키 InnoDB 의 왜래키 관리에는 중요한 두 가지 특징이 있다. 테이블의 변경(쓰기 잠금)이 발생하는 경우에만 잠금 경합(잠금 대기)이 발생한다. 외래키와 연관되지 않은 칼럼의 변경은 최대한 잠금 경합(잠금 대기)을 발생시키지 않는다. 자식 테이블의 변경이 대기하는 경우 작업번호 커넥션-1 커넥션-2 1 BEGIN; 2 update tb_parent set fb='changed-2" where id =2 3 BEGIN; 4 update tb_child set pid = 2 where id = 100; 5 ROLLBACK; 6 Query OK, 1 row affected (*.** sec) - 테이블의 변경(쓰기 잠금)이 발생하는 경우에만 잠금 경합(잠금 대기)이 발생한다. 2번 커넥션 1 수행시 t.. 2023. 2. 26.
[RealMysql 8.0] 인덱스 8.3.5 ~ 8.9.2 다중 칼럼 인덱스 두개 이상의 칼럼으로 구성된 인덱스를 다중 컬럼 인덱스(또는 복합 컬럼 인덱스)라고 한다. 데이터 레코드 건수가 적을경우 브랜치 노드가 없는 경우가 있을 수 있다. 루트 노드와 리프노드는 항상 존재 인덱스의 두번째 컬럼은 첫번째 컬럼에 의해 정렬돼 있다. 인덱스를 늘리면 앞전의 컬럼에 의해 정렬된다. 다중 칼럼 인덱스에서는 인덱스 내에서 각 칼럼의 위치가 상당히 중요하다. 2번째 칼럼이 정렬 순서가 빠르더라도 첫번째 칼럼에 의해 인덱스 리프 노드의 젤 아래에 위치할 수 있다. B-Tree 인덱스의 정렬 및 스캔 방향 인덱스를 생성할 때 설정한 정렬 규칙에 따라서 인덱스의 키 값은 항상 오름차순이나, 내림차순으로 정렬되어 저장된다. 어느 방향으로 읽을지는 옵티마이저가 실시간으로 만들어 내.. 2023. 2. 7.
[RealMysql 8.0] 인덱스 8.3.4 ~ 8.3.4.4 B-Tree 인덱스를 통한 데이터 읽기 각 스토리지 엔진이 어떻게 인덱스를 이용해서 실제 레코드를 읽어 내는지 알아보자. 아래는 mysql이 인덱스를 이용하는 방법을 알아본다. 1.인덱스 레인지 스캔 인덱스 접근 방법 가운데 가장 대표적인 접근 방식이다. 인덱스를 통해 레코드를 한 건만 읽는 경우와, 한 건 이상을 읽는 경우를 각각 다름 이름으로 구분하지만 해당 절에서는 모두 인덱스 레인지 스캔이라 한다.(추후 10장에서 다시 언급) 검색해야 할 인덱스의 범위가 결졍됐을 떄 사용하는 방식이다.검색하려는 값의 수나 결과 레코드 건수에 관계없이 레인지 스캔이라 한다. B-Tree 인덱스에서 루트와 브랜치 노드를 이용해 스캔 시작 위치를 검색하고, 그 지점부터 필요한 방향(오름, 내림)으로 인덱스를 읽어 나간.. 2023. 2. 7.
mysql 인덱스 테이블 정보, show index from 테이블 정보 실행계획이 틀어지는 경우가 발생하여, 살펴보니 인덱스 중복 이 발견되어 해당 인덱스 테이블에 대한 컬럼에 대한 정보가 궁금해서 정보를 남긴다. show index from table 컬럼 Table: 테이블의 이름 Non_unique: 0이면 고유한 인덱스, 1이면 중복 허용 인덱스 Key_name: 인덱스의 이름 Seq_in_index: 인덱스의 열 순서 Column_name: 인덱스가 적용된 컬럼의 이름 Collation: 인덱스의 정렬 순서(A: 오름차순, D: 내림차순) Cardinality: 인덱스의 유일성(유일한 값의 개수) Sub_part: 인덱스의 부분 색인(NULL이면 전체 컬럼이 색인됨) Packed: NULL Null: NULL일 수 있는지의 여부(YES/NO) Index_type: .. 2023. 2. 7.
[RealMysql 8.0] 인덱스 8 ~ 8.3.3.4 디스크 읽기 방식 컴퓨터의 CPU나 메모리 처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전 했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했다. 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이냐가 관건일 때가 상당히 많다. 하드 디스크 드라이브(HDD) 솔리드 스테이트 드라이브(SDD) 순차 I/O 에서는 ssd 가 hdd 보다 조금 빠르거나 비슷한 성능을 보이기도 하지만 랜덤 I/O 에서는 ssd 가 훨씬 빠르다 데이터베이스는 순차 I/O 작업은 그다지 비중이 크지않고 랜덤 I/O를 통해 작은 데이터를 읽고 쓰는 작업이 대부분이므로 dmbs용 스토리지에 최적이라 볼 수 있다. 랜덤 I/O와 순차 I/O 하드 디스크 드라이브의 플래터(원판)를 돌려서 읽.. 2023. 2. 5.
[RealMysql 8.0] 데이터 압축 6 ~ 7.5.3 데이터 압축 부터 인덱스전까지는 빠르게 읽어보고 그냥 넘어갈꺼임 추후 업데이트 예정. mysql 서버에서 디스크에 저장된 데이터 파일의 크기는 일반적으로 쿼리의 처리 성능과 직결되며, 백업 및 복구 시간과도 밀접한 관계로 연결된다. 파일이 크면 클수록 쿼리를 처리하기위해서 더 많은 데이터 페이지를 INnoDB 버퍼 풀로 읽어야 할 수도 있고, 새로운 페이지가 버퍼 풀로 적재되기 때문에 그만큼 더티 페이지가 더 자주 디스크로 기록돼야 한다. 더티 페이지: 버퍼 풀에 저장된 데이터가 디스크와 동기화 되지 않은 페이지를 말함. 여튼 이러한 문제점을 해결하기 위해 크게 2가지 방식의 데이터 압축 기능을 제공한다. 1.페이지 압축, 2.테이블 압축. 페이지 압축 추후 예정.볼게 많아서 인덱스 까지 빠르게 넘어 감. 2023. 2. 5.
728x90