728x90

2024/10 8

19) JSON 타입 활용

JSON 데이터 타입JSON 형식의 데이터를 손쉽게 저장 및 조회 , 관리 가능빌트인 함수들을 사용해서 JSON 데이터 조작 가능저장된 JSON 데이터의 일부만 업데이트 가능( 부분 업데이트도 가능)저장된 JSON 데이터의 특정 키에 대해서 인덱스 생성 가능  default 가 null이 아니면 instant 알고리즘으로 DDL이 불가능하다.테이블 전체를 락을 잡게되는 algorithm = Copy를 사용해야한다. 이때는 DDL작업중에는 DML이 차단된다.  JSON 데이터 저장주의할점은 객체 데이터 입력시 key에 해당하는 값은 반드시 쌍따옴표로 감싸줘야 정상적으로 값이 들어간다.insert할시에 json 형식인지 validation이 존재한다. 저장 구조최적화된 바이너리 포맷으로 저장된다.중복된 키 ..

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에서 아직 표준 분류를 하지 않은 상태 (벤더 의존적 상태 값)나머지는 모두 에러이다..

728x90