DB와 연관되는 프로젝트를 성공적으로 진행하려면 Test Data의 양과 질이 절대적으로 좋아야 한다.
그래야만 개발 단계에서 많은 문제를 찾아낼 수 있고 수정할 수 있게 된다.
하지만 현실은 가가가,나나나,다다다,~~~ 형식의 그것도 대략 100건 안쪽의 Test Data 만 넣어놓은 상태에서 개발을 진행하는 경우가 흔하다.
그러다 보니 실제 서비스 하는 환경에서는 Data 가 쌓이면서 Query 시간이 길어지고 Data가 오염되면서 각종 문제가 발생하게 된다.
그것을 줄여 보고자 이 글을 쓴다.
아래의 방법은 가장 일반적인 방법이며 응용을 통하여 더 다양하고 많은 양의 Test Data를 만들어 낼수가 있다.
1. 복제의 대상이 되는 기준 집합을 선택 – MySQL 버전에 따라서 아래 3개중 1개의 집합을 사용할 수 있음
SELECT count(*) FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES; #기준집합 277 Row , MySQL 5.6 이하
SELECT count(*) FROM performance_schema.global_variables; #기준집합:486 Row , MySQL 5.7 이상
2. 단순 집합 복제 예 – 1 ~ 40000 까지의 1개 Column 을 갖는 집합 생성
SELECT @rownum := @rownum +1 AS NUM
FROM (select 1 from performance_schema.global_variables limit 200) as A,
(select 1 from performance_schema.global_variables limit 200) as B,
(select @rownum := 0) as tmp
LIMIT 100000; #4만 Row로 복제 (200 * 200)
<수행시간: 40000 row(s) returned 0.0011 sec / 0.0060 sec(Duration / Fetch Time)>
◈ MariaDB 의 경우 performance_schema 환경 변수가 off 되어 있으면 performance_schema.global_variables 테이블에 접근할 수 없습니다.
INFORMATION_SCHEMA.GLOBAL_VARIABLES 테이블을 사용해 주시길 바랍니다.
결과 집합:
3. 4만개의 겹치지 않는 12자리 코드 집합을 생성하는 쿼리
SELECT CONCAT(
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@rownum)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
,SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed)*36+1, 1)) AS RAND_CD
,@rownum := @rownum +1 AS NUM
FROM (SELECT 1 FROM performance_schema.global_variables LIMIT 200) as A
,(SELECT 1 FROM performance_schema.global_variables LIMIT 200) as B
WHERE (@rownum:=0)=0
LIMIT 100000;
<수행시간: 40000 row(s) returned 0.0035 sec / 0.131 sec (Duration / Fetch Time)>
결과 집합:
Insert Query에 위의 결과 집합만 적용해 주면 몇십만건의 Data도 바로 생성해 넣을 수 있다.
'Database & Data > MYSQL' 카테고리의 다른 글
MYSQL 실행계획 분석 방법 요약 (3) | 2016.02.25 |
---|---|
MySQL Dump 파일 복원시 주석까지 복원하는 방법 (0) | 2015.12.09 |
MySQL Galera Cluster 테스트 보고서 (0) | 2015.11.26 |
MySQL REPLACE명령어-AutoIncrement PK 컬럼의 수정에 용이 (0) | 2015.11.20 |
MySQL 계정 및 권한 생성 , 5.7 버전 계정 비밀번호 확인 (0) | 2015.11.16 |