• Blog
  • Projects
  • Resume
profile_image

[Database] MySQL 데이터 만들기 (Docker 활용)

Database

2021.01.30

유저 생성 & 권한 설정

먼저 Docker의 MySQL에 접속한 후, 데이터베이스 생성

CREATE USER 'rano'@'%' IDENTIFIED BY 'passwd';  -- 유저명 & 비번 설정
GRANT ALL ON testdb.* TO 'rano'@'%';            -- 권한 설정
FLUSH PRIVILEGES;


DB 생성 및 100만개 데이터 생성

DATABASE 생성

CREATE DATABASE testdb; -- testdb라는 DATABASE 생성
SHOW DATABASES;         -- 아래 사진처럼 DATABASE 리스트 나옴
image
use testdb; -- 꼭 use할 DATABASE 입력하고 테이블 생성해야함!


영단어 100개를 넣을 word_onehundred 테이블 생성

CREATE TABLE word_onehundred (
	id int auto_increment primary key,
    word VARCHAR(50)
);
INSERT INTO word_onehundred (word) VALUES ('wage'); -- 이런식으로 100개 넣어주기.
image
image

user_log 테이블 생성

CREATE TABLE user_log (
	id int auto_increment primary key,
	nickname varchar(64),
	money dec(10, 2),
    last_visit datetime
);
  • id 필드의 옵션 2가지.
    • primary key: 테이블내에 있는 데이터를 식별함 (기본 키 지정)
    • auto_increment: 위 id 필드는 이 옵션을 써주면 id가 추가될 때마다 1씩 값이 증가되어 자동으로 들어간다.


생성된 테이블에 100만개 임의의 데이터 Insert. (프로시저 생성)

DELIMITER $$
CREATE PROCEDURE generate_data()
BEGIN
  DECLARE i INT DEFAULT 0;

  DECLARE a INT DEFAULT 0;
  DECLARE b INT DEFAULT 0;
  DECLARE c INT DEFAULT 0;
  DECLARE numFour INT DEFAULT 1000;
  DECLARE datetmp datetime;

  WHILE i < 1000000 DO
	SET a = FLOOR(65 + (RAND() * 25));  SET b = FLOOR(65 + (RAND() * 25));  SET c = FLOOR(65 + (RAND() * 25));  SET numFour = FLOOR(1000 + (RAND() * 8999));
    SET datetmp = FROM_UNIXTIME(FLOOR(unix_timestamp('2020-12-31 00:00:00')+(RAND()*(unix_timestamp('2021-01-29 00:00:00')-unix_timestamp('2020-12-31 00:00:00')))));

    INSERT INTO user_log ( nickname, money, last_visit ) VALUES (
		concat( (SELECT word FROM word_onehundred order by rand() limit 1), '_', char(a), char(b), char(c), numFour ),
        (SELECT (FLOOR(RAND() * 100000))),
		datetmp
    );

    SET i = i + 1;

    -- 10000개의 데이터가 들어갈 때마다 COMMIT.
    IF (i % 10000 = 0) THEN
		COMMIT;
	END IF;

  END WHILE;
END$$
DELIMITER ;
  • 꼭 기본으로 설정되어 있는 AUTOCOMMIT을 꺼준다. 안끄고 실행하면 진짜.. 시간..
SET AUTOCOMMIT = FALSE;
  • 프로시저 실행.
call generate_data();
  • 들어간 데이터 확인

    image
    image
    image
  • 206초 걸린것도 뿌듯하지만 나중에 Bulk Insert 한번 해보기!




참고 자료