본문 바로가기

SQL/MySql

(6)
Mysql Lock MySQL에서는 여러가지 종류의 락이 있다. 락은 쿼리 성능에도 많은 영향을 미치고 이러한 개념을 모른다면 쿼리 튜닝할때도 상당한 제약 사항이 있을것 같다. 그리하여 MYSQL에서 사용하는 락은 어떤것들이 있는지 정리해 본다. MYSQL엔진의 잠금 1. 글로벌락 - FLUSH TABLE WITH READ LOCK 명령으로만 획득 가능한데 실행과 동시에 서버에 존재하는 모든 테이블에 잠금을 건다. - MYSQL에서 제공하는 락 가운데 가장 범위가 큰 락이다. - 한 세션에서 글로벌 락을 획득한다면 다륵 세션에서 SELECT를 제외한 DDL DML문장을 실행하는 경우 글로벌 락이 해제될때 까지 대기 상태 2. 테이블락 : - 개별 테이블 단위로 설정되는 잠금이며, 명시적 또는 묵시적으로 특정 테이블 락을 획..
1부 3장. SQL 소개 SQL은 크게 DML과 DDL 두 가지로 구분된다. DML(데이터 조작어, Data Manipulation Language) - 데이터 추출, 저장, 삭제 등 데이터를 조작 DDL(데이터 정의어, Data Definition Language) - 데이터가 저장되는 테이블이나 각종 객체들을 생성 그렇다면 DML은... SELECT, INSERT, UPDATE, DELETE, COMMIT, ROLBACK 이 있다. SELECT[구문형식] SELECT 컬럼, 컬럼2, ... FROM 테이블1, 테이블2, ... WHERE 조건들; 머 이부분은 다 아는부분이라고 치고 넘어가도록 한다. INSERT1[구문형식] INSERT INTO 테이블명 (컬럼1, 컬럼2,...) VALUES (컬럼1 값, 컬럼2값,...) ..
쿼리 실행 절차 및 옵티마이저 종류 쿼리 실행 절차1. 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MYSQL 서버가 이해할 수 있는 수준으로 분리2. SQL 파싱 정보를 확인 하면서 어떤 테이블로 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택3. 두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로 부터 데이터를 가져옴. 두번째 단계는 첫 번째 단계에서 만들어진 파스트리를 참조하면서 다음과 같은 내용 처리 - 블필요한 조건의 제거 및 복잡한 연산의 단순화 - 여러 테이블의 조인이 있는 경우 어떤 순서로 읽을지 결정 - 각 테이블에 사용된 조건과 인덱스 통계정보를 이용해 사용할 인덱스 결정 - 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정 옵티마이저 종류 - 비용기반 최적화(Co..
실행계획 ID 컬럼과 select_type 실행 계획 - EXPLAIN EXTENDED나 EXPLAIN PARTITIONS 명령은 더 상세하게 실행 계획을 확인 할 수 있음- 위쪽에 출력된 결과일수록 (id 컬럼의 갑이 작을수록) 쿼리의 바깥(outer) 부분이거나 먼저 접근한 테이블 아래쪽에 출력된 결과일수록 (d 컬럼의 값이 클수록) 쿼리의 안쪽(Inner) 부분 또는 나중에 접근한 테이블 id 컬럼 - 단위 SELECT 쿼리별로 부여되는 식별자 값 - SELECT 문장 안에서 여러 개의 테이블을 조인하면 조인되는 테이블의 개수만큼 실행 계획이 출력되지만 같은 아이디가 부여됨 - SELECT 문장은 하나인데 여러 겨의 테이블이 조인되는 경우 id값은 증가 하지 않음 select_type - 각 단위 SELECT쿼리가 어떤 타입의 쿼리인지 표시..
실행계획 key_len- 쿼리를 처리하기 위해 다중 컬럼으로 구성된 인덱스에서 몇개의 칼럼까지 사용했는지 알려줌, - 인덱스의 각 레코드에서 몇 바이트 까지 사용했는지 알려줌 - dep_no 칼럼의 타입이 char(4) 이기 때문에 프라이머리 키에서 앞쪽 12바이트만 유요하게 사용 - dep_no 칼럼은 utf-8문자 집합 사용 실제 utf8 문자는 1~3까지 가변적이긴 하지만 공간을 할당할때는 문자에 관계없이 고정적으로 3바이트로 계산 ref - 접근 방법이 ref 방식으면 참조 조건(equal 비교조건) 으로 어떤 값이 제공되어/ㅆ는지 보여줌 - 만약 상수값을 지정했다면 ref 칼ㄹ머의 값은 constfh 표시되고 다른 테이블의 칼럼값이면 그 테이블 명과 컬럼 명이 표시 됨 - 가끔 func라고 표시될 때가 ..
mysql 정렬 mysql 주요 처리 방식 풀 테이블 스캔 옵티마이저가 풀 테이블 스캔을 선택하는 경우1. 테이블 레코드가 너무 작아서 인덱스를 통해 읽는 것보다 풀스캔을 하는게 더 낫다고 생각하는 경우2. where 절이나 on절에 인덱스를 이용할 수 있는 적절한 조건이 없는 경우3. 인덱스 레인지 스캔을 사용할 수 있는 쿼리여도 일치 레코드 건수가 너무 많은 경우4. max_seeks_for_key 변수를 특정 값(n)으로 설정하면 옵티마이저는 인덱스 기수성(cardinality)나 선택도(selectivity) 무시 하고 최대 n건만 읽으면 된다고 판단 이 값을 작게 설정할수록 mysql서버가 인덱스를 더 사용하다록 유도 - 대부분의 dbms는 풀 스캔을 실행할 때 한번에 여러개의 블록이나 페이지를 읽어오는 기능이..