MYSQL WORKBENCH 여러 쿼리문 실행 단축키
ctrl + shift + enter
'데이터베이스' 카테고리의 다른 글
UNION , UNION ALL 차이 (0) | 2019.11.05 |
---|---|
MySQL 숫자, 특수문자 체크 (0) | 2019.10.28 |
MYSQL TokuDB (0) | 2019.09.20 |
중복 데이터를 가져오는 쿼리 문 (0) | 2019.08.06 |
MYbatis fetchSize 설정 (0) | 2019.07.09 |
MYSQL WORKBENCH 여러 쿼리문 실행 단축키
UNION , UNION ALL 차이 (0) | 2019.11.05 |
---|---|
MySQL 숫자, 특수문자 체크 (0) | 2019.10.28 |
MYSQL TokuDB (0) | 2019.09.20 |
중복 데이터를 가져오는 쿼리 문 (0) | 2019.08.06 |
MYbatis fetchSize 설정 (0) | 2019.07.09 |
아래와 같은 두 개의 테이블이 있다고 가정합니다.
TABLE_A TABLE_B
----------------- -----------------
FLD1 FLD1
----------------- -----------------
1 5
2 3
3 1
----------------- -----------------
이 때...
SELECT FLD1 FROM TABLE_A
UNION ALL
SELECT FLD1 FROM TABLE_B
하면 결과는
-----------------
FLD1
-----------------
1
2
3
5
3
1
-----------------
이 됩니다. 두 쿼리의 결과를 단순히 합친 것이죠.
그런데
SELECT FLD1 FROM TABLE_A
UNION
SELECT FLD1 FROM TABLE_B
하면 결과는
-----------------
FLD1
-----------------
1
2
3
5
-----------------
이 됩니다. 두 테이블의 결과를 합치되, 중복된 값을 제외하죠.
이렇게 중복을 제거하기 위해 불가피하게 '소트'를 하게 됩니다.
따라서 자료가 많거나 Index가 되어 있지 않은 필드를 대상으로 하게 되면
쿼리 시간이 길어질 수 있습니다.
union은 distinct와 같은 역할을 하기 때문에,
union all 보다 처리 속도가 느립니다.
되도록이면 union all 을 사용하세요.
[mysql] WORKBENCH 여러 쿼리문 실행 단축키 (0) | 2020.10.27 |
---|---|
MySQL 숫자, 특수문자 체크 (0) | 2019.10.28 |
MYSQL TokuDB (0) | 2019.09.20 |
중복 데이터를 가져오는 쿼리 문 (0) | 2019.08.06 |
MYbatis fetchSize 설정 (0) | 2019.07.09 |
//내용에 숫자만 있는 경우
SELECT * FROM temp_table WHERE column1 REGEXP '^[0-9]+$';
//내용에 특수문자가 포함된 경우
SELECT * FROM temp_table WHERE column1 REGEXP '[`~!#$%^&*|\\\'\";:\/?]';
[mysql] WORKBENCH 여러 쿼리문 실행 단축키 (0) | 2020.10.27 |
---|---|
UNION , UNION ALL 차이 (0) | 2019.11.05 |
MYSQL TokuDB (0) | 2019.09.20 |
중복 데이터를 가져오는 쿼리 문 (0) | 2019.08.06 |
MYbatis fetchSize 설정 (0) | 2019.07.09 |
이번에 소개할 MySQL 클론은 TokuDB인데, 엄밀히 말해서 TokuDB는 MySQL의 클론이라고는 할 수가 없다.
TokuDB는 MySQL이나 MariaDB에서 사용할 수 있는 새로운 Storage Engine인데, 이게 또 상당히 특이하고 흥미로운 Storage Engine이다.
4. TokuDB
TokuDB는 TokuTek사에서 개발한 Database Storage Engine으로 MySQL, MariaDB에서 사용할 수 있다.
TokuDB는 처음에는 Open source가 아닌 쉐어웨어로 시작했다. 40G까지는 무료로 사용할 수 있고, 그 이상은 년 400달러 정도의 금액을 지불하는 라이센스 정책을 쓰다가 얼마지나지 않아 30일까지만 무료로 사용할 수 있도록 라이센스 정책이 바뀌었다. 그러다가 최근 다시 Open source로 라이센스가 바뀌었는데, 1년사이에 라이센스 정책이 두번이나 바뀌어서 살짝 불안한 감이 있다.
그래서 현재 라이센스 정책은 MySQL처럼 Community Version은 open source로 Enterprise Version은 커머셜로 두가지 라이센스 정책을 가지고 있다.
Community와 Enterprise의 차이점도 MySQL가 흡사한데, 프로그램 자체에는 없는 듯 하고 다만 Enterprise는 테크니컬 서포트가 추가되는 형태인듯 하다.
1. 특징
- 데이터 Insert 속도
InnoDB는 Primary key를 데이터의 물리적인 저장 주소로 사용한다. 그래서 auto increment 값을 primary key로 설정하면 굉장히 빠른 데이터 insert 속도를 낼 수 있다. 하지만 auto increment 값이 아닌 다른 값(예를 들어 varchar나 순서가 뒤죽박죽인 int 데이터)을 pk로 잡을 경우 데이터 insert 속도는 곤두박질 칠수 밖에 없는 구조를 가지고 있다. 반면 TokuDB는 pk의 데이터 유형에 상관 없이 빠르고 일정한 insert 속도를 낼 수 있다.
- 데이터 indexing
TokuDB는 index 구조로 B-Tree가 아닌 TokuTec사에서 특허를 낸 Fractal-Tree 구조를 사용하고 있는데, 이 Fractal-Tree의 알고리즘이 MySQL이나 기타 DB에서 흔히 사용되는 B-Tree보다 성능이 뛰어나고 단편화가 일어나지 않는 구조라고 한다.
그래서 index 기반의 query들(select, update, delete)에서 특히 더 좋은 성능을 볼 수 있다.
뿐만 아니라 단편화(Fragmentation)가 일어나지 않는 특징 때문에 장시간이 지나도 성능 하락이 발생하지 않는다.
B-Tree는 처음 Tree가 구성되어 있을 때에는 양쪽 Balance가 잘 맞기 때문에 빠르게 이진탐색이 가능하지만, 중간 중간 index가 추가, 삭제, 변경이 됨에 따라 양쪽 Balance가 조금씩 무너지는 단편화가 발생하게 되는데, 단편화가 심해질 경우, DB의 성능도 급격하게 떨어지기 때문에 주기적으로 몇시간 또는 몇일에 걸친 index rebuild나 optimize가 필요하다.
하지만, Fractal-Tree는 단편화가 일어나지 않기 때문에 성능 저하도 발생하지 않고, 주기적인 optimize도 필요가 없다. (이 부분은 테스트를 해보지 않아서 전적으로 TokuTec사의 주장을 바탕으로 작성함)
- 데이터 압축
사실 이 특징이 TokuDB의 가장 큰 장점이라고 할 수 있다. TokuDB는 두가지 압축 레벨을 제공하고 있는데, 아무런 설정 없이 데이블을 생성하면 기본 압축 레벨이 적용 된다. 기본 압축일 경우 데이터의 용량은 InnoDB에 비해 3~6배까지 데이터의 용량을 줄어든다. 또한 최대 압축일 경우 약 10배의 압축결과를 보여주는데, 이건 눈으로 보지 않으면 믿기지 않은 결과 일것이다. (실제로 테스트 해본 결과 정말 믿기 힘들정도로 용량이 들어든다.)
데이터는 압축 할 수 있다고 치고, 그럼 압축된 데이터 때문에 query 성능이 떨어지지 않을까 생각했는데 그렇지도 않다. 앞에서도 언급했지만, InnoDB보다 전반적으로 빠른 query 성능을 보여준다. 심지어 최대 압축일때도 InnoDB보다 빠르다. 물론 cpu를 조금 더 쓰기는 하지만, 생각만큼 cpu load가 올라가지 않아서 테스트 내내 놀라움을 금치 못했다.
- Flash Drive(SSD) 최적화
B-Tree는 작은 블럭단위로 write가 발생하지만, Fractal-Tree는 큰 블럭단위로 write가 발생하는데, 이는 SSD의 수명이나 성능에 많은 영향을 미친다. (TokuDB가 SSD에 보다 더 적합하다고 볼 수 있다.)
- Hot Schema, Hot Index 기능
"Hot"이라는 말은 여기서는 실시간이라는 뜻으로 이해하는 것이 좋을 듯 하다.
InnoDB는 새로운 컬럼이나 인덱스를 추가하기 위해 서비스를 중단(Table Lock이 걸리기 때문)해야 하지만, TokuDB는 서비스중에 Table Lock 없이 새로운 컬럼이나 인덱스를 추가 할 수 있다.
- 빠른 복구 기능
InnoDB는 table 이 깨졌을 경우 이를 복구하는데 수분에서 몇시간까지의 시간이 필요한다. TokuDB는 몇초만에 데이터 복구가 가능하다.
- 개발 편의성
TokuDB는 MySQL과 MariaDB에서 사용할 수 있는 Storage Engine으로 사용법은 MySQL이나 MariaDB와 똑같으며, 기존 DBMS가 제공하는 함수기능들을 모두 사용할 수 있다.
TokuDB를 사용하기 위해 따로 학습이 거의 필요 없고 다만, tokuDB Engine tunning을 위해 my.cnf에 사용할 수 있는 configuration 몇가지만 알면 된다.
2. 테스트 결과
약 3억건의 Record를 가지는 데이터를 CSV 파일로 준비해서 InnoDB와 TokuDB에 각각 Bulk insert, select query를 날리는 테스트를 진행했다. (CSV파일의 총 용량은 22G)
- InnoDB
a. Bulk insert에 걸린 총 시간: 49분 22초
b. insert 후 DB size: 15G
c. select count query에 걸린 시간: 53초
d. index key add에 걸린 시간: 18분 26초
e. 부하테스트 툴을 이용한 query test: 초당 약 500건 처리
- TokuDB (기본 압축 레벨)
a. Bulk insert에 걸린 총 시간: 106분 14초 (primary key가 auto_increment값이라서 그런지 InnoDB가 훨씬 빨랐음)
b. insert 후 DB size: 3.7G (용량이 약 1/4로 줄어듬)
c. select count query에 걸린 시간: 44초 (약간 성능 향상)
d. index key add 에 걸린 시간: 4분 49초 (상당히 빨라졌음)
e. 부하테스트 툴을 이용한 query test: 초당 약 700건 처리 (약 1.4배 향상)
- TokuDB (최대 압축 레벨)
a. Bulk insert에 걸린 총 시간: 105분 52초
b. insert 후 DB size: 1.9G (InnoDB대비 8배 이상)
c. select count query에 걸린 시간: 44초
d. index key add 에 걸린 시간: 5분 27초
e. 부하테스트 툴을 이용한 query test: 초당 약 700건 처리
** 특이사항: 기본 압축 레벨에 비해 성능 하락은 거의 없지만, cpu load가 조금 더 올라갔고, Bulk insert 중 알 수 없는 이유로 2차례 Connection이 끊어짐, 그리고 약 1천건 정도의 데이터가 들어가지 않음 (최대 압축 레벨은 서비스에 쓰기에는 좀 불안 할지도.....)
- 테스트 결과에 대한 추가 설명
InnoDB와 TokuDB의 Insert 시간을 비교해 보면 2배 이상의 차이가 나는데, 이는 auto_increment 값을 primary key로 사용하고 있는 상태이기 때문으로 보이며, 순차적인 insert가 일어나는 경우에는 InnoDB가 배 이상의 속도를 내는 것으로 보인다.
하지만 auto_increment 데이터가 없는 상태에서 1천만건의 데이터 insert 속도를 비교했을 때는 InnoDB는 약 3분, TokuDB는 약 48초 정도가 걸렸는데, 데이터의 건수가 많아질수록 그 차이는 벌어질 것이다.
DB의 용량을 살펴 보면 TokuDB가 InnoDB에 비해 4배 이상 작으며, 최대 압축일 경우 8배까지 그 차이가 벌어지는 것을 볼수 있다.
부하테스트 툴을 이용한 query 테스트는 전반적으로 TokuDB가 우수한 것을 볼 수 있는데, 부하테스트의 경우 텟그트 환경중 네트워크 속도가 받혀 주지 않아 TokuDB의 경우는 실제로 위의 값보다 충분히 더 많은 초당 처리 갯수를 보일 수 있을 것으로 예상된다.
최대 압축 테스트중 2회 정도 Connection이 끊기는 현상이 발생했고, insert 후 record 갯수가 1천개 정도 적었는데, 이것이 최대 압축 라이브러리의 문제인지, 아니면 다른 외부요인이 있었는지는 확인하지 못했다.
출처: https://blog.embian.com/5 [Embian Blog]
UNION , UNION ALL 차이 (0) | 2019.11.05 |
---|---|
MySQL 숫자, 특수문자 체크 (0) | 2019.10.28 |
중복 데이터를 가져오는 쿼리 문 (0) | 2019.08.06 |
MYbatis fetchSize 설정 (0) | 2019.07.09 |
[SQLyog] sql 요그 툴 단축키 (0) | 2019.05.02 |
중복 쿼리를 체크하는 쿼리
SELECT column1
FROM tableA
GROUP BY column1
HAVING COUNT(*) > 1
중복쿼리의 키를 다찾을수있는 쿼리
SELECT A.column1, A.column2, A.column3 FROM
tableA AS A
INNER JOIN (SELECT column1 FROM tableA GROUP BY column1 HAVING COUNT(column1) > 1) B ON A.column1 = B.column1
MySQL 숫자, 특수문자 체크 (0) | 2019.10.28 |
---|---|
MYSQL TokuDB (0) | 2019.09.20 |
MYbatis fetchSize 설정 (0) | 2019.07.09 |
[SQLyog] sql 요그 툴 단축키 (0) | 2019.05.02 |
DB2 (0) | 2016.06.22 |
mybatis 사용중에 5000건 정도를 조회해서 화면에 표현해야하는 업무가 있었습니다.
툴에서 조회시에는 0.5 초 정도 걸리는데 웹상에서 jdbc를 통해 조회를하면 10초를 넘기는 상황이 발생했습니다.
구글링을 통해 찾아보니 mybatis에 fetchSize라는 옵션이 있더군요. 아래 처럼 추가했더니 0.5 초 이하로 속도가 나옵니다
<select id="selectList" resultMap="String" fetchSize="1000">
SELECT * FROM board
</select>
fetchSize 어떻게 작동하길래 이렇게 속도가 빨라지나 찾아보았습니다.
설정하지 않으면 기본 값은 10 이라고 합니다.
fetchSize 가 10 이면 5000건을 조회하면 실제 db에서 500번을 조회하게 되는 겁니다.
fetchSize 가 1000 이면 5번이면 되는 겁니다.
MYSQL TokuDB (0) | 2019.09.20 |
---|---|
중복 데이터를 가져오는 쿼리 문 (0) | 2019.08.06 |
[SQLyog] sql 요그 툴 단축키 (0) | 2019.05.02 |
DB2 (0) | 2016.06.22 |
DB2 기본 명령어 (0) | 2016.06.22 |
연결 Ctrl+M 새 연결 구성하기
객체 브라우저
SQL 창
쿼리 실행
SQL 포매터 SQL 스테이트먼트 붙여넣기
결과
표시/숨기기
데이터베이스/테이블
PowerTools
사용자 관리자
Favorites
비주얼 데이터 비교
기타
|
중복 데이터를 가져오는 쿼리 문 (0) | 2019.08.06 |
---|---|
MYbatis fetchSize 설정 (0) | 2019.07.09 |
DB2 (0) | 2016.06.22 |
DB2 기본 명령어 (0) | 2016.06.22 |
데이터베이스 (0) | 2014.11.18 |
1. 데이터베이스 생성(db2inst1)
create database safecert
2. 버퍼 풀 생성(db2inst1)
create bufferpool bp32 size 2000 pagesize 32K
3. 테이블스페이스 생성(db2inst1)
create tablespace safecerts_d pagesize 32K
managed by database using(file '/home/db2inst1/tbs/safecerts_d1' 2000)
extentsize 16 bufferpool bp32
create tablespace safecerts_i pagesize 32K
managed by database using(file '/home/db2inst1/tbs/safecerts_i1' 2000)
extentsize 16 bufferpool bp32
4. 권한 부여(db2inst1)
--GRANT
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE CCMS_ALLOWED_APP_INFO TO USER LCMS_APP WITH GRANT OPTION;
5. 별칭 부여(user)
CREATE ALIAS CCMS_ALLOWED_APP_INFO FOR LCMS_MGR.LCMS_APP;
5. db2에서 rownum, connect by 사용 설정
# db2stop
# db2set DB2_COMPATIBILITY_VECTOR=09
# db2start
DB2 테이블 정보
select * from tab; //테이블 리스트 확인
describe table 테이블이름; //테이블 정보 확인
MYbatis fetchSize 설정 (0) | 2019.07.09 |
---|---|
[SQLyog] sql 요그 툴 단축키 (0) | 2019.05.02 |
DB2 기본 명령어 (0) | 2016.06.22 |
데이터베이스 (0) | 2014.11.18 |
Oracle select 문제풀이 (0) | 2014.11.18 |
● UDB Start
IBM UDB를 운용하려면, 다음과 같은 명령들을 이용하여 데이타베이스, Instance 사용자로 로그인 한 다음, 데이타베이스를 시동시켜야 한다.
# su – db2inst1
$ db2start
$ db2 connect to teps <-- db명
$ db2 activate db depsdb
( 주 : DB2 ACTIVATE DB명령어는 DB global memory를 미리 메모리에 상주시키는 명령어로 처음 connect 시의 시간을 단축시키는 효과가 있음,
단 DB를 stop시킬때 db2 deactivate db 명령어를 이용하여 memory등을 release시켜주어야 함)
● UDB의 사용
데이타베이스가 시동되면, 사용하고자 하는 데이타베이스로 연결을
한다. 만약 데이타베이스가 없으면 "create database " 명령어를
이용하여 데이타베이스를 생성시킨 후 연결한다.
$ db2 create db database명
$ db2 connect to database명 user userid using password
$ db2 connect to PersonDB
예) db2 connect to person user db2inst1 using nadaimma
- db에 대한 접속 종료
$ db2 connect reset
- 데이터베이스 제거
$ db2 drop db database명
● mydb 에 있는 테이블의 목록을 확인하십시오.
db2 list tables
db2 list tables for all
db2 list tables for system
db2 list tables for user
db2 list tables for schema kkk
● 현재 데이터베이스에 접속되었는지의 여부를 확인하십시오.
db2 get connection state
● 현재 접속한 데이터베이스가 무엇인지 알아보십시오.
db2 “values (current server)”
● 현재 접속한 데이터베이스의 코드 페이지가 무엇인지 알아보십시오.
db2 get db cfg for mydb | grep code
● 현재 접속한 데이터베이스의 로그 파일에 관한 정보를 확인하십시오.
db2 get db cfg for mydb | grep LOG
● 인스턴스 db2inst1에 있는 시스템 데이터베이스의 목록을 확인하십시오.
db2 list db directory
● 현재 활성화되어 있는 데이터베이스의 목록을 확인하십시오.
db2 list active databases
● 테이블 생성
db2 "create table bbsdoc(IDX bigint not null primary key generated by default as identity(start with 1, increment by 1), TITLE varchar(30) not null, WRITER varchar(20) not null, WRITEDATE varchar(20) not null, CONTENTS varchar(50) not null, ATT varchar(20) not null)"
● 테이블 삭제
db2 drop table "tablename"
● SQL 문을 사용하여 테이블의 생성,조작을 수행할 수 있다.
1). select
db2 "select * from person";
- person 테이블의 데이터 건수를 확인하십시오.
db2 “select count(*) from person”
2). insert
db2 "insert into person values (1,'C0071','mail','unreadin')";
3). update
db2 "update bbsdoc set TITLE='3', CONTENTS='3' Where Idx = 1"
4). delete
db2 “delete from person where id < 13”
5) alter
DB2 ALTER 사용법
- 컬럼추가시
ex) ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 char(1) default '0'
- 컬럼수정시
ex) ALTER TABLE 테이블명 ALTER COULMN SET DATA TYPE (varchar/number...etc)(length);
- 컬럼삭제
DB2에서는 지원이 안됨
6) auto_increment(자동 인덱스 증가기능)
- TABLE 생성
db2 "create table test(a int not null generated by default as identity(start with 1, increment by 1), b varchar(20) not null)"
- DATA 입력
db2 "insert into test(a, b) VALUES(DEFAULT,'임의의문자열')"
● UDB 종료
테이블에 대한 조작이 끝나면, 다음의 명령어를 이용하여 데이터베이스의 연결을 중단하고, 운용중인 데이타베이스의 시동을 끝낸다.
$ su – db2inst1
$ db2 terminate
$ db2 force application all
$ db2stop
● Tablespace의 정보를 보고자 할 경우
$ db2 connect to person
$ db2 list tablespaces | more
or
$db2 list tablespace show detail | more
● Table의 list를 보고자 할 경우
$ db2 connect to person
$ db2 list tables for all | more
● Table의 column 정보를 보고자 할 경우
$ db2 connect to person
$ db2 “select tabschema, tabname, colname, typename,length, scale, default, nulls from syscat.columns “
● 시스템의 로그를 보고자 할 경우
$ tail -f SystemOut.log
출처: 한비광님의 블로그( http://blog.daum.net/foreverofsky/6)
MYbatis fetchSize 설정 (0) | 2019.07.09 |
---|---|
[SQLyog] sql 요그 툴 단축키 (0) | 2019.05.02 |
DB2 (0) | 2016.06.22 |
데이터베이스 (0) | 2014.11.18 |
Oracle select 문제풀이 (0) | 2014.11.18 |
create table emp01(
empno number(4),
ename varchar2(20),
sal number(7,2));
desc emp01;
create table dept01(
deptno number(2),
dname varchar2(14),
loc varchar2(13));
create table emp02
as select * from emp;
select * from emp02;
create table dept02
as select * from dept where 2>3;
select * from dept02;
select table_name
from user_tables;
insert into dapt02(DEPTNO,DNAME,LOC)
values (dd,aa,qq);
MYbatis fetchSize 설정 (0) | 2019.07.09 |
---|---|
[SQLyog] sql 요그 툴 단축키 (0) | 2019.05.02 |
DB2 (0) | 2016.06.22 |
DB2 기본 명령어 (0) | 2016.06.22 |
Oracle select 문제풀이 (0) | 2014.11.18 |