분류 전체보기 506

17) NoWait & Skip Locked , 18) Union vs Union All

select for update NOWAIT잠금 대상 레코드가 이미 다른 세션에 의해 잠겨있는 경우, 잠금을 대기하는 것이 아니라 바로 에러를 반환한다.Statement aborted because locks could not be acquired immediately and NOWAIT is set.innodb_lock_wait_timeout 옵션을 0으로 설정한 것과 유사한 효과 (옵션의 기본값은 50)트랜잭션 내에서 NOWAIT 쿼리를 실행하여 에러가 반환되더라도, 열어둔 트랜잭션은 그대로 유지된다.불필요하게 잠금을 오래기다리지 않고 바로 결과를 확인하고 끝낼수 있다. select for update SKIP LOCKED잠금 대상 레코드 중에 다른 세션에 의해 이미 잠금이 걸려있는 레코드는 스킵하고..

16) Count(*) vs Count(column)

다른 column들은 14108을 반환했는데 fd1 같은 경우에는 default 가 null이어서 그중에 null이 아닌녀석을 반환해서 숫자가 줄어든 것이다.returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement인자로 null을 주면 select count(NULL) = 0 이 된다. where 조건 가진 CountCovering IndexNon Covering Index where 조건 없는 Countha_records() 스토리지 API 사용ha_index_next() 스토리지 API 사용 fd1, fd2 둘다 row 갯수는 같다. Not NULL에 상관없이 두 컬럼 모두 다 ..

15) 풀스캔 쿼리 패턴 및 튜닝

Mysql 에 index가 있음에도 불구하고 테이블 풀스캔으로 처리되는 대표적인 경우들 1. 컬럼이 가공되는 경우해당 컬럼이 인덱스에 존재하더라도 쿼리에서 인덱스를 활용하지 못한다.형변환의 예시의 경우 mysql에서는 묵시적으로 문자열 타입 컬럼에 대해 숫자 타입으로 형변환을 수행한다.함수 떄문에 인덱스를 못하는 경우 풀어서 where절에 넣어주면 동일한 요건이지만 인덱스를 사용하게 된다. 2. 인덱싱 되지 않은 컬럼을 조건절에 OR연산과 함께 사용하는 경우joined_at column이 인덱싱에 포함되지 않은 컬럼이었을때 OR연산을 수행시에 account_type이 인덱싱이 되어있더라도 쿼리 실행계획은 인덱스를 타지 못하게 된다.이후 인덱스에 joined_at column도 추가하면 정상적으로 두 co..

14) UUID 사용 주의사항

UUID VersionVersion 1,2Timestamp 기반의 UUID 생성별도의 unique 한 값 입력없이 생성 가능version 3,5name과 namespace의 MD5 또는 SHA-1 해시 기반의 UUID 생성생성시 unique한 입력을 필요로 한다.version 4완전 랜덤한 UUID 생성 Timestamp의 비트 순서가 바뀌어서 UUID에 배치된다.7.5 바이트를 쪼개서 순서를 재배열해서 만들어진다. 생성시점이 동일해도 , 정렬 순서가 일치하지는 않는다.UUID version-1의 타임스탬프는 100 나노초 단위로 1씩 증가 (각 row의 term을 말하는것이다.)위 사진은 시간대별 UUID 값이다. 7분 10여초 단위로 첫번째 파트가 리셋된는 것을 알 수 있다. UUID vs B-Tre..

13) 콜레이션

콜레이션 이란문자를 비교하거나 정렬할 때 사용되는 규칙이다.문자집합(Character Set)에 종속적문자와 코드값(코드 포인트)의 조합이 정의돼있는 것이 문자집합이다e.g) A=U+0041, B=U+0042MySQL에서 모든 문자열 타입 컬럼은 독립적인 문자집합과 콜레이션을 가질 수 있다.사용자가 특별히 지정하지 않은 경우 , 서버에 설정된 문자집합의 디폴트 콜레이션으로 자동 설정된다. MySQL 에서의 콜레이션 네이밍 컨벤션문자집합 _ 언어종속 _ UCA버전 _ 민감도문자집합 = utf8mb4, utf8mb3, latin1, euckr 등등 (해당 콜레이션이 속한 문자집합을 의미함)언어종속 = 특정언어에 대해 해당 언어에서 정의한 정렬 순서에 의해 정렬 및 비교를 수행한다. (다른 언어들에는 적용되지..

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..