MySQL 14

MySQL PK 순서

pk 순서가 중요하다고 알고있다. 왜 중요한걸까? PK 인덱스 때문이다. PK 순서대로 인덱스가 되기때문에 중요하다고 한다. 생성된 PK 순서대로 PK Index가 적용되기 때문에 큰 범위에서 작은 범위의 컬럼으로 나열하는 것이 좋다. 복합키는 일반적으로 카디널리티 순으로 구성하되, 조회/입력 방법에 따라서 적절히 순서를 바꿔서 구성하거나 새로 인덱스를 추가하면 된다. (근데 인덱스 덕지덕지도 안좋으니 주의) 인덱스의 두번째 컬럼은 첫 번째 컬럼에 의존해서 정렬되어 있습니다. 즉, 두번째 컬럼의 정렬은 첫번째 컬럼이 똑같은 열에서만 의미가 있습니다. 만약 3번째, 4번째 인덱스 컬럼도 있다면 두번째 컬럼과 마찬가지로 3번째 컬럼은 2번째 컬럼에 의존하고, 4번째 컬럼은 3번째 컬럼에 의존하는 관계가 됩니..

Database 2021.02.10

[MyBatis] foreach

http://huskdoll.tistory.com/507 방법은 Map을 선언시 로 선언하고 Object에 list를 넣어주고 query 부분에서 리스트를 foreach 돌려 사용하면 됩니다. DAO 부분에서 책 정보를 가져오도록 작성1234567891011121314151617public List getBooksInfo() { Map param = new HashMap(); param.put("id", "1"); //#{id}에 셋팅 param.put("name", "victor"); //#{name}에 셋팅 List codeList = new ArrayList(); codeList.add("01"); //in 조건에 넣을 정보 codeList.add("05"); param.put("code_list"..

Database 2018.05.25

[MySql] DISTINCT , GROUP BY

DISTINCT의 결과를 정렬된 결과가 아니지만, GROUP BY는 정렬된 결과를 보내준다. GROUP BY의 작업을 크게 "그룹핑" + "정렬"로 나누어서 본다면, DISTINCT는 "그룹핑" 작업만 수행하고 "정렬" 작업은 수행하지 않는 것이다. 그런데, 여기서 "정렬"은 "그룹핑" 과정의 산물이 아닌 부가적인 작업이다. 가끔 어떤 사용자는 DISTINCT가 마치 함수인 것처럼 (괄호를 사용하여) 아래와 같이 사용을 하는데 만약 fd1 컬럼은 unique 값, fd2는 전체 값을 원한다면 절대 그 결과를 얻을 수 없다. SELECT DISTINCT(fd1), fd2 FROM tab; SELECT 문장에 DISTINCT라는 키워드가 있으면, MySQL은 SELECT되는 모든 컬럼(튜플)들에 대해서 DI..

Database 2018.05.10

[MySql] INDEX

인덱스 컬럼 기준먼저 말씀드릴 것은 1개의 컬럼만 인덱스를 걸어야 한다면, 해당 컬럼은 카디널리티(Cardinality)가 가장 높은 것을 잡아야 한다는 점입니다.카디널리티(Cardinality)란 해당 컬럼의 중복된 수치를 나타냅니다. 예를 들어 성별, 학년 등은 카디널리티가 낮다고 얘기합니다. 반대로 주민등록번호, 계좌번호 등은 카디널리티가 높다고 얘기합니다.인덱스로 최대한 효율을 뽑아내려면, 해당 인덱스로 많은 부분을 걸러내야 하기 때문입니다. 만약 성별을 인덱스로 잡는다면, 남/녀 중 하나를 선택하기 때문에 인덱스를 통해 50%밖에 걸러내지 못합니다. 하지만 주민등록번호나 계좌번호 같은 경우엔 인덱스를 통해 데이터의 대부분을 걸러내기 때문에 빠르게 검색이 가능합니다. 여러 컬럼으로 인덱스를 잡는다..

Database 2018.05.08

[MySQL] Transaction과 Loack

소스를 보고있었는데 transaction이 걸려야할 것 같은 곳에 transaction이 없었다.이유를 물어보니 transaction을 걸면 lock이 걸린다고했다.row transaction이 걸려야하는데 DB특성상 table transation이 걸려서? 그렇다고 했다.그래서 찾아보았다. MySQL에서 사용하는 Lock의 이해 [출처] http://blog.saltfactory.net/introduce-mysql-lock/ MySQL에서 Lock은 크게 Table Lock, Global Lock, Name Lock, User Lock 이 있다. Table Lock 테이블락은 어떤 세션에서 테이블 자원에 엑세스하여 데이터를 읽거나 쓰기를 할때 다른 세션에서는 테이블 자원에 대한 엑세스를 제한 하는 락이..

Database 2018.03.22

[MySql] OUTER JOIN에서 On과 Where 조건

1. JOIN에서 On 과 Where 조건의 순서차이 join의 on절이 선조건이 됨. 2. MS-SQL 쿼리 ON절과 Where 절의 차이 1. ON절에 조건을 사용할 경우 키값 조인을 하기전에 조건을 제외한다. 2. Where절에 조건을 사용할 경우 테이블 조인의 결과값에 대한 조건검색 결과를 나타낸다. 규칙 LEFT OUTER JOIN 시 ON 절에서는 우측(널값으로 채워지는 쪽)의 추가 제약조건을 넣고 좌측의 추가 제약조건은 WHERE절에 넣어야 한다. 3. LEFT OUTER JOIN 시에 ON절과 WHERE절에 추가 제약 조건 넣는 규칙 규칙 LEFT OUTER JOIN 시 ON 절에서는 우측(널값으로 채워지는 쪽)의 추가 제약조건을 넣고 좌측의 추가 제약조건은 WHERE절에 넣어야 한다 1...

Database 2017.08.25

[MyBatis] #, $ 차이

2021.03.17 업데이트) # => Prepared Statement (동적) 쿼리문을 실행하기에 앞서 구문 분석, 의미 분석, 파싱 작업을 진행하여 SQL Injection 코드를 만나게 되면 오류 발생함 (SQL Injection 대비 가능) $ => Statement (정적) 쿼리 실행시마다 옵티마이저의 수행 계획 달라짐 여기서 유념해야 할 부분은 # 을 사용했을 때에는 ? 으로 치환이 되는 반면에 $ 를 사용한 케이스에서는 $ 영역에 100이라는 상수로 치환되어 쿼리를 수행하게 된다. 중요한 포인트는 101, 102, 103 과 같이 숫자가 바뀔 때마다 파싱 작업을 항상 진행해야 한다라는 것이다. 성능상에 단점이 존재한다라는 것을 알 수 있다. 변수로 인식하지 않게하기 위해서 #{param} ..

Database 2017.06.15
반응형