Database/Real MySQL Season1 ,2 17

11) Prepared Statement , 12) SQL 문장의 가독성 향상

장점SQL Injection 방지쿼리 파싱 비용 감소 (2번 째 이후 실행할 떄를 말함)단점메모리 사용량 증가2번의 Network round-trip이 필요하다 (첫번째 실행, PreparedStatement를 하기위해 한번(최초에), 쿼리를 실행하기 위해 한번))execution plan은 캐시되지 않는다, parse tree만 캐시된다.캐시된 PreparedStatement 는 커넥션 내에서만 공유된다.100개의 connection에서 동일한 preparedStatement를 실행한다고 해도 mysql server에서는 1개가 아니라 100개의 preparedStatement를 가지고 있게 된다. PreparedStatement의 비밀MySQL의 PreparedStatementClient Side P..

9) Error Handling , 10) Left Join 주의사항 및 튜닝

MySQL 에러 구분Gobal ErrorServer-side & Client-side 에서 공용으로 발생Server ErrorServer-side에서 만 발생Client Errorclient-side에서만 발생에러범위(숫자)에 따라 이게 client 인지 server인지 구별이 가능하다Server erorr중에는 client side까지 전달이 되는 에러들도 존재한다. SQL State5글자 영문 숫자로 구성된다.ANSI-SQL에서 제정한 vendor 비 의존적 에러코드이다.SQL-State는 2 파트로 구분된다. 앞 두글자는 상태 값의 분류를 의미한다.00 = 정상01 = 경고02 = 레코드 없음HY = ANSI-SQL에서 아직 표준 분류를 하지 않은 상태 (벤더 의존적 상태 값)나머지는 모두 에러이다..

8) Generated 컬럼 및 함수 기반 인덱스

Generated Column표현식으로 정의된 컬럼정의된 표현식에 따라 컬럼의 값이 자동으로 생성표현식 = 고정된 값, 함수 또는 다른 컬럼들에 대한 연산 조합 등이 해당사용자가 직접 값을 입력하거나 변경할 수 없음두 가지 종류가 존재Virtual Generated Column (가상 컬럼)Stored Generated Column (스토어드 컬럼)기본적으로 virtual 타입으로 생성 & null 값을 허용한다.primary key 로는 stored 타입만 허용한다.하나의 테이블에서 가상 컬럼과 스토어드 컬럼 혼합해서 사용 가능하다. 컬럼의 값을 디스크에 저장하지 않는다.컬럼의 값은 레코드가 읽히기 전 또는 before 트리거 실행 직후에 계산된다.인덱스 생성이 가능하고 , 인덱스 데이터는 디스크에 저..

7) select for update

select for update/ share 모두 현재 record에 잠금을 걸어야 하기 때문에 격리수준에 관계 없이 최신 commit을 읽어오게된다.A의 balance가 100일 때 for update없이 2개의 session에서 select한후에 -100을 수행하면 계좌가 -100인 상태가 되어버린다.이를 방지하기 위해 select ~ for update를 통해 exclusive lock을 걸어서 더 이상 dml이 작동못하게 막은후에 현 트랜잭션에서만 dml 작업을 수행하게 한다.굳이 select for update를 쓰지말고 update where절에 조건을 넣어주고 처리된 row 행 숫자 값으로 부가적인 처리를 할 수 있다.select for update자체에 where 절을 추가해서 불필요한 l..

5) Stored Function, 6) Lateral Derived Table

Deterministic 동일 상태와 동일 입력으로 호출 -> 동일한 결과 반환그렇지 않은 경우 -> not deterministic func1 , func2 를 where 조건으로 하고 각각 몇번 호출이 되었는지 세보았다.각 함수는 사용자 정의 variable에 +1을해서 자기자신이 몇번 호출 되었는지 알 수 있게해주는 함수이다.explain 결과를 보면 deterministic 은 primary key index를 통해서 1개의 row만 본것을 알 수 있다. 실제 쿼리도 optimize되어서 where true로 변경되었다. 하지만 결과는 3회 호출인데 이는 실제 실행계획말고도optimziation check, evaluate constants , process filters 등 여러 다른 query..

3) COUNT(*) & COUNT(DISTINCT) 튜닝 4) 페이징 쿼리 작성

대부분은 Count(*) 쿼리가 select * 보다 빠를것으로 예상하지만 실제로는 동일한 경우가 더 많다. limit조건 때문에 차이가 나게 된다. count의 경우 limit조건이 무의미하기 때문이다.orm에서 자동 생성된 쿼리 실행때문에도 문제가 생긴다.select count(distinct(id)) as counter from tab where fd1 = ?;단순히 count *으로 fd1에 해당되는 row의 숫자만 세려고 했는데 훨씬 부하가 더 많은 count(distinct(id)) 로 처리하는 경우도 있다. 2개의 쿼리 둘다  index가 걸린 column을 기준으로 record를 다 찾은다음에 index가 걸리지않은 column에서 B값과 일치하는것을 하나하나 확인하는 방식으로 동작한다. ..

1) CHAR vs VARCHAR 2) VARCHAR vs TEXT

Char vs VarChar모델링논리 모델링 (업무 전문가)업무 분석엔티티 , 속성, 관계 도출정규화물리 모델링 (dbms 전문가)dbms 벤더별 최적 컬럼 타입 선정접근 패턴 분석반 정규화인덱스 전략 수립 Char vs VarChar공통점문자열 저장용 컬럼최대 저장 가능 문자 길이 명시 (바이트 수를 의미하는 것이 아님) , CHAR(10), VARCHAR(10)둘다 10글자까지 만 저장가능하다는 의미이다.차이점값의 실제 크기에 관계 없이 고정된 공간 할당 여부최대 저장 길이 = CHAR(255) vs VARCHAR(16383) == 65535 바이트저장된 값의 길이 관리 여부 (VARCHAR 와 , 가변길이 문자셋 사용하는 CHAR는 저장된 값 길이 관리)0~255bytes  => length-byt..