Database/MySQL 15

MySQL Null Condition

MySQL Null Condition # Wrong Condition select * from table where column = null select * from table where column != null # Correct Conditionselect * from table where column is nullselect * from table where column is not null # null이거나, 특정값이 아닌 경우## Wrong, VALUE가 아닌경우의 검색 조건, 하지만 null일때의 데이터값을 가지고 올수가 없다.select * from table where column != 'VALUE' ## Correctselect * from table where (column != 'VA..

Database/MySQL 2019.01.23

MySQL Partition Table

MySQL Partition Table테이블에 들어오는 데이터를 별도를 테이블로 저장하는 기능, 하나의 테이블로 읽기와 쓰기가 가능하다.파티션 방법해시리스트키레인지 파티션을 사용하는 이유테이블의 너무 커서 인덱스의 크기가 물리적인 메모리가 훨씬 큰 경우데이터 특성상 주기적인 삭제 작업이 필요한 경우 (이력 데이터)단일 INSERT와 단일 또는 범위 SELECT의 빠른 처리인덱스가 커질수록 SELECT, INSERT, UPDATE, DELETE 작업이 느려지게 된다. 데이터가 10기가이고 인덱스가 3G 일때 대부분 데이터가 조회되는 것이 아니라 보통 데이터의 20~30%수준만 조회가 된다. 이럴때 자주 사용하는 데이터를 분리를 한다면 성능적으로 효과를 볼수가 있다. Create Table ExampleCR..

Database/MySQL 2018.11.05

MySQL Unique Key

MySQL Unique Key데이터를 저장을 하거나 처리를 할때 중복으로 저장이 되는 경우가 있을 수가 있다이때 Unique Key를 설정을 통해 처리를 할수가 있다 Create Table QueryCREATE TABLE table( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(10) NOT NULL, PRIMARY KEY (id), UNIQUE INDEX `table_uk_01` (name)); ALTER QueryALTER TABLE table ADD UNIQUE INDEX` table_uk_01` (name) Tip 아닌 Tip데이터가 동시에 insert가 되는 경우에는 Duplicate 메시지가 발생이 된다.여러개의 동시에 들어가는 경우(Thread, 멀티 서버..

Database/MySQL 2018.10.29

Group By 최대값을 가진 Row를 추출하는 쿼리

Group By 최대값을 가진 Row를 추출하는 쿼리Group by를 이용하여 특정필드의 최대값을 가지고 올수 있지만 group by 특성상 해당하는 row의 다른 필드의 값을 가지고 올수가 없다.최대값이 있는 row 값을 가지고 오는 방법을 아래와 같이 2가지 방법이 있다.DB, Index, Table 구조 등에 따라 속도가 달라지기때문에 그때 그때에 맞게 2가지 방법중에 사용하면 된다. SELECT a.id, a.rev, a.contentsFROM YourTable aINNER JOIN ( SELECT id, MAX(rev) rev FROM YourTable GROUP BY id) b ON a.id = b.id AND a.rev = b.rev Group BY와 SubQuery를 활용하여 먼저 id와 ..

Database/MySQL 2018.09.03

Mysql Query Plan

Mysql Query Plan`EXPLAIN` 키워드를 사용을 하면 해당하는 Query의 실행 계획을 볼수 있다. 여러가지 정보를 볼 수있는 그중에 필요한 컬럼의 의미에 대해서 정리를 한다. idSelect의 identifierNull 인경우에는 union의 결과값은 id M, N의 결과의 union 결과값select_typeSIMPLEPRIMARYUNIONUNION RESULTSUBQUERYtable사용되는 테이블 이름 - union 된 select 값 N 번 select 값typejoin typepossible_keys사용이 가능한 인덱스 key의 예비후보 null 인경우에는 index와 상관이 없다.key사용되는 인덱스이름rows결과값을 얻기위해 검색을 해야되는 row의 갯수Reference- ht..

Database/MySQL 2018.07.24

Mysql Index HInts

Mysql Index HintsMysql를 사용을 하다보면 원하는 인덱스가 아니고 다른 인덱스를 사용하여 쿼리 성능이 느린 경우가 있다. 이때 Mysql에서 제공하는 Index Hints를 쓰면 강제적으로 할당한 Index를 이용하여 쿼리가 실행이 된다. 하지만 JPA(hibernate)에서 사용이 불가능하기 때문에 JdbcTemplate 등을 이용하여 Native Query로 활용해야 된다.사용방법tbl_name [[AS] alias] [index_hint_list] index_hint_list: index_hint [index_hint] ... index_hint: USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list]) | IGNORE {INDE..

Database/MySQL 2018.07.24

인덱스 설계에 필요한 선택도와 카디널리티

선택도(Selectivity)- 전체 대상 레코드 중에서 특정 조건에 의해 선택될 것으로 예상되는 레코드 비율을 말한다. 선택도 -> 카디널리티 -> 비용 -> 액세스 방식, 조인 순서,. 조인 방법 등 결정 1 1선택도 = --------------------- = -------------- Distinct Value 개수 num_distinct 카디널리티 (Cardinality)- 키다널리티(Cardinality)는 특정 액세스 단계를 거치고 나서 출력될 것으로 예상되는 결과 건수를 말하며, 아래와 같이 총 로우 수에 선택도를 곱해서 구한다. 카디널리티 = 총 로우 수 X 선택도 선택도, 카디널리티가 중요한 이유- 하나의 키값에 여러개의 row가 맵핑이 되는 경우에는 SELECT시 인덱스를 안타고 F..

Database/MySQL 2018.06.11

Group By 쿼리의 활용

Group By- 테이블에 저장되어 있는 데이터를 분리를 할때 사용되는 SQL Keyword- Having 절을 이용하여 Group By시에 조건을 줄수가 있다. 기본 SynatxSELECT column_name(s)FROM table_nameWHERE conditionGROUP BY column_name(s)ORDER BY column_name(s); Sample Query- Count를 이용하는 방법 : 하나의 key를 기준으로 가지고 있는 갯수가 2개 이상인 결과를 얻는 쿼리SELECT userId, count(userId) as cntFROM user_ordersGROUP BY userIdHAVING count(userId) > 1 - Count를 이용하는 방법 : user log를 이용하여 다른..

Database/MySQL 2018.06.09