<!--StartFragment-->- MariaDB  (http://mariadb.com) -
(1) 소개
  MySQL 개발자 미카엘 위데니우스에 의해 만들어진 MariaDB는
  MySQL이 MariaDB의 모태이며, Sun에서 가져온 DataBase입니다.
  그러므로 MySQL과 흡사합니다.
 

(2) MariaDB 다운로드
  https://downloads.mariadb.org/mariadb/repositories/

(3) 설치
yum -y install MariaDB-server MariaDB-client
또는
컴파일버전이 아닌 보다 high performance인 바이너리버전(64bit)으로 설치하겠습니다.
OS = CentOS 5.4
MariaDB버전 = mariadb-5.1.47
설치경로 = /home/csr
baserdir = /home/csr/mariadb
datadir = /home/csr/mariadb/data

① 다운로드 및 압축해제
   shell> wget 'http://askmonty.org/downloads/r/http://ftp.rediris.es/mirror/MariaDB/mariadb-5.1.47/kvm-bintar-hardy-x86/mariadb-5.1.47-Linux-i686.tar.gz'
   shell> tar xvfz mariadb-5.1.47-Linux-i686.tar.gz -C /home/csr

② user , group 생성
   shell> groupadd mysql
   shell> useradd -g mysql mysql

③ 심벌릭링크 권한변경
   shell> ln -s mariadb-5.1.47-Linux-x86_64 mariadb
   shell> chown -R mysql.mysql /home/csr/mariadb-5.1.47-Linux-x86_64

④ my.cnf 생성및수정
   shell> cp /home/csr/mariadb/support-files/my-huge.cnf /home/csr/mariadb/my.cnf
   shell> vi my.cnf
[client]
#password       = your_password
port            = 3306
socket          = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
basedir         = /home/csr/mariadb
datadir         = /home/csr/mariadb/data
skip-external-locking

⑤ install db (datadir 생성)
  shell> /home/csr/mariadb-5.1.47-Linux-x86_64/script-xs/mysql_install_db --defaults-file=/home/csr/mariadb/my.cnf --user=mysql

⑥ mariaDB 데몬 start
  shell> /home/csr/mariadb/bin/mysqld_safe --defaults-file=/home/csr/mariadb/my.cnf --basedir=/home/csr/mariadb --datadir=/home/csr/mariadb/data --user=mysql &

⑦ mariaDB connect
  shell> /home/csr/mariadb/bin/mysql -uroot -p
MariaDB [mysql]> select version();
+--------------------+
| version()          |
+--------------------+
| 5.1.47-MariaDB-log |
+--------------------+
1 row in set (0.00 sec)

⑧ Engine 확인
MariaDB [(none)]> show engines;
+---------------+----------+----------------------------------------+--------------
| Engine            | Support   | Comment                                             | Transactions
+---------------+----------+--------------------------------------------+--------------
| BLACKHOLE    | YES        | /dev/null storage engine (anything you   | NO          
| MRG_MYISAM | YES        | Collection of identical MyISAM tables      | NO          
| FEDERATED    | YES        | FederatedX pluggable storage engine      | YES         
| MARIA            | YES        | Crash-safe tables with MyISAM heritage  | YES         
| CSV               | YES        | CSV storage engine                               | NO          
| MEMORY        | YES        | Hash based, stored in memory, useful fo | NO          
| ARCHIVE        | YES        | Archive storage engine                           | NO          
| MyISAM         | DEFAULT | Default engine as of MySQL 3.23 with gr   | NO          
| InnoDB           | YES        | Supports transactions, and foreign keys    | YES         
| PBXT             | YES        | High performance, multi-versioning tran    | YES         
+---------------+----------+----------------------------------------+--------------
10 rows in set (0.00 sec)
Engine중에 MySQL에서는 접하지 못했던 MARIA , PBXT 라는 Engine이 보입니다.
Transaction 지원도 InnoDB는 물론이고 MARIA , PBXT Engine도 지원하는걸로 보입니다.
(MARIA Engine은 현재 transaction을 지원하지않으나, 앞으로의 버전에서는 지원한다는뜻같습니다.)
아쉬운점은 foreign key지원이 MySQL과 동일하게 InnoDB만 지원하네요.

⑨ MARIA Engine 으로 table 생성 및 data insert

MariaDB [test]> CREATE TABLE `mariatable` (
    ->   `idx` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ->   `name` VARCHAR(24) NOT NULL,
    ->   PRIMARY KEY (`idx`)
    -> ) ENGINE=MARIA DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> insert into mariatable(idx,name)values('','양택조');
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> select * from mariatable;
+-----+--------+
| idx | name   |
+-----+--------+
|   1 | 양택조 |
+-----+--------+
1 row in set (0.00 sec)

MARIA Engine의 data file 확장자는 *.frm(스키마)  *.MAD(데이타)  *.MAI(인덱스) 입니다.
data file 확장자가 MyISAM 과 흡사합니다.

⑩ partition 지원
MariaDB [test]> show plugin;
+--------------------------------+--------+--------------------+---------+---------+
| Name                           | Status | Type               | Library | License |
+--------------------------------+--------+--------------------+---------+---------+
| binlog                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| MyISAM                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| partition                      | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| ARCHIVE                        | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| BLACKHOLE                      | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| CSV                            | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| FEDERATED                      | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| MEMORY                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| MARIA                          | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| MRG_MYISAM                     | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| PBXT                           | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| PBXT_STATISTICS                | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| InnoDB                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |
| INNODB_RSEG                    | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_POOL_PAGES       | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_POOL_PAGES_INDEX | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_BUFFER_POOL_PAGES_BLOB  | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_TRX                     | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCKS                   | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCK_WAITS              | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP                     | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP_RESET               | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM                  | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM_RESET            | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_TABLE_STATS             | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_INDEX_STATS             | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| XTRADB_ADMIN_COMMAND           | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_TABLES              | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_SYS_INDEXES             | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
| XTRADB_ENHANCEMENTS            | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |
+--------------------------------+--------+--------------------+---------+---------+


⑪MySQL과의 호환성
  MySQL과의 호환성이  대부분 되는듯 보입니다.(테스트진행중)
  또한 PHP에서도  mysql관련 함수들과 호환됩니다.

부팅시 자동시작 설정
기본으로 설정되어 있지만 한번 더 확인

[root@jmnote ~]# chkconfig mysql on
[root@jmnote ~]# chkconfig --list mysql
mysql          0:off 1:off 2:on 3:on 4:on 5:on 6:off

이상으로 MariaDB 바이러리버전 설치를 마치겠습니다.


[출처] ::: MySQL Korea ::: - http://www.mysqlkorea.co.kr/

'데이터베이스' 카테고리의 다른 글

[MYSQL] LIKE vs INSTR()  (0) 2014.08.23
MySQL JOIN 이란?  (0) 2014.08.20
MySQL DB 테이블 연산자 - JOIN 명령어  (0) 2014.08.20
REPAIR TABLE 속도  (0) 2014.08.20
SQLyog 에서 한글이 네모등으로 깨져서 나올때  (0) 2014.08.20
Posted by 주말소프트
,

출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=22334

안녕하세요?

좀더 다양한 테스트를 해보질 않아서
단정짓기는 어렵지만 우선 테스트한 결과(단순 막노동?)를 올립니다.

column 길이가 극히 짧은 것만 테스트한 경우이므로
다소 틀릴 수 도 있습니다.

- 8 bytes 이하       <--- 본 테스트 포함
- 9 ~ 16 bytes       <--- 본 테스트 포함
- 17 ~ 32 bytes
- 33 ~ 64 bytes      <--- 본 테스트 포함(일부)
- 65 ~ 128 bytes
- 129 ~ 256 bytes
- 257 ~ 512 bytes
- 513 - 1024 bytes  <-- 보통 게시물 평균 크기
- 1025 - 2048 bytes
- 2049 - 4096 bytes
- 4097 bytes 이상

이와 같이 여러가지 경우에 대해서 좀더 테스트해 봐야 합니다.

혹시 아래와 비슷한 방법으로 테스트해 주실분 있나요?

--------------------------------

[MYSQL] LIKE vs INSTR()

0. 배경

1. 영문 검색어 테스트
  1-1. 앞 부분 검색
  1-2. 중간 부분 검색
  1-3. 끝 부분 검색

2. 한글 검색어 테스트
  2-1. 앞 부분 검색
  2-2. 중간 부분 검색
  2-3. 끝 부분 검색

3. 결과 비교(표)
  3-1. 영문 검색어 결과
  3-2. 한글 검색어 결과

4. 결론

5. 후기

---------------------------------------

0. 배경

TRUE 인 경우만 테스트한 경우임.

... cols LIKE '%한글검색어%'
... BINARY cols LIKE '%한글검색어%'

웹 게시판에서, 후자의 경우 속도가 약 3 배, 또는 그 이상 빠름
(평균 레코드가 길이가 1KB,  text 자료형에서 검색)

마찬가지로,

... cols LIKE '%숫자형조합%'
... BINARY cols LIKE '%숫자형조합%'

숫자의 검색도 BINARY 로 검색할 경우 빠름.
(정수형만 테스트해 보았음)



1. 영문 검색어 테스트

1-1. 앞 부분 검색

1) 대소문자 구별시

  DO BENCHMARK(1000000, BINARY 'MSIEdddddd' LIKE 'MSIE%');
  0.47

  DO BENCHMARK(1000000, INSTR('MSIEdddddd','MSIE'));
  0.27


2) 대소문자 구별없이

  DO BENCHMARK(1000000, 'MSIEdddddd' LIKE 'MSIE%');
  0.66

  DO BENCHMARK(1000000, INSTR(LOWER('MSIEdddddd'),LOWER('MSIE')));
  1.86


1-2. 중간 부분 검색

1) 대소문자 구별시

  DO BENCHMARK(1000000, BINARY 'dddMSIEdddddd' LIKE '%MSIE%');
  0.60

  DO BENCHMARK(1000000, INSTR('dddMSIEdddddd','MSIE'));
  0.44

2) 대소문자 구별없이

  DO BENCHMARK(1000000, 'dddMSIEdddddd' LIKE '%MSIE%');
  1.15

  DO BENCHMARK(1000000, INSTR(LOWER('dddMSIEdddddd'),LOWER('MSIE')));
  2.15


1-3. 끝 부분 검색

1) 대소문자 구별시

  DO BENCHMARK(1000000, BINARY 'dddMSIE' LIKE '%MSIE');
  0.56

  DO BENCHMARK(1000000, INSTR('dddMSIE','MSIE'));
  0.43

2) 대소문자 구별없이

  DO BENCHMARK(1000000, 'dddMSIE' LIKE '%MSIE');
  1.22

  DO BENCHMARK(1000000, INSTR(LOWER('dddMSIE'),LOWER('MSIE')));
  1.77


2. 한글 검색어 테스트

2-1. 앞부분 검색

1) 대소문자 구별시

  DO BENCHMARK(10000000, BINARY '한글 테스트' LIKE '한글%');
  Query OK, 0 rows affected (4.70 sec)

  DO BENCHMARK(10000000, INSTR('한글 테스트','한글'));
  Query OK, 0 rows affected (2.73 sec)


2) 대소문자 구별없이

  DO BENCHMARK(10000000, '한글 테스트' LIKE '한글%');
  Query OK, 0 rows affected (6.60 sec)

  DO BENCHMARK(10000000, INSTR('한글 테스트',LOWER('한글')));
  Query OK, 0 rows affected (7.48 sec)

  DO BENCHMARK(10000000, INSTR(LOWER('한글 테스트'),'한글'));
  Query OK, 0 rows affected (12.23 sec)

  DO BENCHMARK(10000000, INSTR(LOWER('한글 테스트'),LOWER('한글')));
  Query OK, 0 rows affected (17.25 sec)


2-2. 중간 부분 검색

1) 대소문자 구별시

  DO BENCHMARK(10000000, BINARY '테스트 한글 테스트' LIKE '%한글%');
  Query OK, 0 rows affected (6.63 sec)

  DO BENCHMARK(10000000, INSTR('테스트 한글 테스트','한글'));
  Query OK, 0 rows affected (5.52 sec)


2) 대소문자 구별없이

  DO BENCHMARK(10000000, '테스트 한글 테스트' LIKE '%한글%');
  Query OK, 0 rows affected (19.50 sec)

  DO BENCHMARK(10000000, INSTR('테스트 한글 테스트',LOWER('한글')));
  Query OK, 0 rows affected (10.60 sec)

  DO BENCHMARK(10000000, INSTR(LOWER('테스트 한글 테스트'),'한글'));
  Query OK, 0 rows affected (18.39 sec)

  DO BENCHMARK(10000000, INSTR(LOWER('테스트 한글 테스트'),LOWER('한글')));
  Query OK, 0 rows affected (23.25 sec)


2-3. 끝 부분 검색

1) 대소문자 구별시

  DO BENCHMARK(10000000, BINARY '테스트 한글' LIKE '%한글');
  Query OK, 0 rows affected (6.40 sec)

  DO BENCHMARK(10000000, INSTR('테스트 한글','한글'));
  Query OK, 0 rows affected (5.51 sec)


2) 대소문자 구별없이

  DO BENCHMARK(10000000, '테스트 한글' LIKE '%한글');
  Query OK, 0 rows affected (19.51 sec)

  DO BENCHMARK(10000000, INSTR('테스트 한글',LOWER('한글')));
  Query OK, 0 rows affected (10.60 sec)

  DO BENCHMARK(10000000, INSTR(LOWER('테스트 한글'),'한글'));
  Query OK, 0 rows affected (15.39 sec)

  DO BENCHMARK(10000000, INSTR(LOWER('테스트 한글'),LOWER('한글')));
  Query OK, 0 rows affected (20.32 sec)


3. 결과 비교(표)

각 5번 테스트 최상,최하 버리고 중간값 선택

3-1. 영문 검색어 결과


+-----------+----------+-------------------+-------------------+--------------------+
|           |          | 대소문자 구별 (O) | 대소문자 구별 (X) |                    |
|   구 분   |  테스트  |---------+---------+---------+---------|       비고         |
|           |          |   LIKE  | INSTR() |   LIKE  | INSTR() |                    |
|-----------+----------+---------+---------+---------+---------+--------------------|
| 앞부분검색| 1,000,000|   0.47  |   0.27  |   0.66  |   1.86  |                    |
|           |10,000,000|   4.69  |   2.72  |   6.55  |  18.58  |                    |
|-----------+----------+---------+---------+---------+---------+--------------------|
|  중간 부분| 1,000,000|   0.60  |   0.44  |   1.15  |   2.15  |                    |
|           |10,000,000|   5.90  |   4.38  |  11.43  |  21.66  |                    |
|           |10,000,000|   8.38  |  18.65  |  37.46  |  53.59  | 51 bytes           |
|-----------+----------+---------+---------+---------+---------+--------------------|
| 뒷부분검색| 1,000,000|   0.56  |   0.43  |   1.22  |   1.77  |                    |
|           |10,000,000|   5.65  |   4.35  |  11.08  |  17.53  |                    |
|-----------+----------+---------+---------+---------+---------+--------------------|
|       결과           |  winner |         |  winner |         |                    |
+----------------------+---------+---------+---------+---------+--------------------+

*주) 단위 초(seconds), 값이 작을수록 우세

영문 검색은 대소문자를 구별하는 경우에 최단 시간이 걸림.

대소문자를 구별하는 검색에서는 검색할 데이터 분포가 중요한데,
앞부분 검색에서는 절대적(길이에 상관없이)으로 INSTR() 함수가 빠르지만,
나머지는 비슷하거나 BINARY ... LIKE 연산이 월등함.
즉,
검색 대상 길이가 길어지고 뒤쪽으로 검색할 수록 확실히 BINARY ... LIKE 연산이 더 빠름.

대소문자를 구별하지 않을 경우에서는,
모든 검색에서 LIKE 연산이 약 1.5 배 이상 우세함.

최악의 경우는 INSTR(LOWER(...),LOWER(...)) 로써 이것은 LIKE 연산보다
절대적으로 느림.

웹 게시판과 같은 검색에서는, 대부분 대소문자를 구별하지 않고 검색하는
경우가 많으므로 영문 검색은 LIKE 연산이 더 유리함.


3-2. 한글 검색어 결과


+-----------+----------+-------------------+----------------------------------------+
|           |          | 대소문자 구별 (O) |           대소문자 구별 (X)            |
|   구 분   |  테스트  |---------+---------+---------+---------+---------+----------|
|           |          |   LIKE  | INSTR() |   LIKE  |INSTR(,L)|INSTR(L,)|INSTR(L,L)|
|-----------+----------+---------+---------+---------+---------+---------+----------|
| 앞부분검색|10,000,000|   4.70  |   2.73  |   6.60  |   7.48  |  12.23  |   17.25  |
|-----------+----------+---------+---------+---------+---------+---------+----------|
|  중간 부분|10,000,000|   6.63  |   5.52  |  19.50  |  10.60  |  18.39  |   23.25  |
|           |10,000,000|  21.40  |  29.62  |  95.39  |  35.19  |  66.47  |   71.71  |
|-----------+----------+---------+---------+---------+---------+---------+----------|
| 뒷부분검색|10,000,000|   6.40  |   5.51  |  19.51  |  10.60  |  15.39  |   20.32  |
|-----------+----------+---------+---------+---------+---------+---------+----------|
|       결과           |  winner |         |         |(winnner)|         |          |
+----------------------+---------+---------+---------+---------+---------+----------+

*주) 단위 초(seconds), 값이 작을수록 우세

한글은 외관적으로 대소문자를 구별하지는 않지만, MySQL 의 내부적 연산에서,
대소문자를 구별하도록 실행할 경우, 모든 면에서 항상 우세함.
(*** 이것은 '한글'뿐만 아니라 '숫자' 자료형의 경우도 그대로 적용됨 ***)

일례로, 앞의 표의 '중간 부분' 검색에서 BINARRY ... LIKE 는 LIKE 보다
약 3 배 이상 빠르다는 것을 알 수 있고 INSTR() 함수 역시 마찬가지임.

영문검색과 마찬가지로 앞부분 검색을 제외하고, 검색 대상 길이가 길어지고
뒤쪽으로 검색할 수록 확실히 BINARY ... LIKE 연산이 더 빠름.

역시 최악의 경우는 최악의 경우는 INSET(LOWER(...),LOWER(...)) 임.


4. 결론


앞의 검색 테스트와 그 결과에서 알 수 있듯이, LIKE 연산이 대부분
유리하지만, LIKE 연산이 더 유리한가 아니면 INSTR() 연산이 더 유리한가에
대한 확답은 없습니다.

이것은, 검색할 타겟(대부분 columns)의 자료형이 어떤 문자열(문자셋)과
어떤 형태로 분포되어 있느냐에 따라서 속도차이가 날 뿐입니다.

그러나,

대부분 웹 게시판 같은 경우는 찾고자하는 단어 배열 형태가 무작위로 분포되어
있고, 또한 사용자 검색어 역시 무작위 임의의 단어있기 때문에 앞에서
테스트한 '중간부분 검색'이 실제 실무에서 적용가능한 방법임을
시사하고 있습니다.

검색할 column 역시, 대부분 32 또는 255 bytes(특이한 경우 제외) 이상이라는
점에서 다름과 같은 방법을 권장합니다.


+----------------+------------------------+------------------------------+
| column 형태    | 권장 (32 bytes 이상)   | 예제                         |
|----------------+------------------------+------------------------------|
| 대문자만       | BINARY str LIKE substr | BINARY cols LIKE '%KWD%'     |
| 소문자만       | BINARY str LIKE substr | BINARY cols LIKE '%kwd%'     |
| 대+소문자      | str LIKE substr        | cols LIKE '%kWd%'            |
|----------------+------------------------+------------------------------|
| 한글만         | BINARY str LIKE substr | BINARY cols LIKE '%한글%'    |
| 한글+대문자    | BINARY str LIKE substr | BINARY cols LIKE '%한글KWD%' |
| 한글+소문자    | BINARY str LIKE substr | BINARY cols LIKE '%한글kwd%' |
| 한글+대+소문자 | str LIKE substr        | cols LIKE '%한글kWd%'        |
+----------------+------------------------+------------------------------+

*주) column length 가 255 bytes 이상, 중간 검색이라는 가정
*주) 'kwd' 는 사용자가 검색하는 임의의 단어

PHP 적용 예)

< ?php
...
$kwd = '사용자 임의 검색어'; // add quoted string

$binary = ''; // 초기값
if(!preg_match('/[a-zA-Z]/',$kwd)) // 영문문자가 들어가 있는 않는 경우
{ $binary = 'BINARY'; }

$sql = "SELECT ... WHERE $binary board.text LIKE '%$kwd%' ...";
...
? >



만약, 검색할 column 이 32 bytes 이하이고, 또한 검색위치가 중간이 아닌
앞이거나 뒤쪽이라면, 앞의 결과표를 보고 적절한 방법을 선택해야 합니다.



5. 후기

없따앙.......

Posted by 주말소프트
,
SQL 문법 공부하는 도중 좋은 자료가 있어서 퍼옴 

1. JOIN 이란?
데이터를 검색하다 보면 테이블 하나만을 이용해서는 원하는 정보를 다 가져오지 못하는 경우가 많습니다. 예를 들어 사원의 급여 정보를 검색하는 경우에 [급여] 테이블에는 사원 번호와 급여 정보만 있는 경우 사원 이름을 같이 검색하고자 한다면 사원 이름을 가지고 있는 [사원] 테이블을 참조해야 합니다. 이렇게 테이블을 서로 연결하여 검색을 할 때 사용되는 것이 JOIN 문 입니다.
JOIN의 종류는 다음과 같이 나눌 수 있습니다.
o INNER JOIN
o OUTER JOIN
o FULL JOIN
o CROSS JOIN
이 중에서 가장 많이 사용되는 것이 INNER JOIN 입니다. 다음 [그림 1]을 기준으로 해서 이들 조인의 기능을 살펴보도록 하겠습니다.

[그림 1]
[그림 1]과 같이 [사원] 테이블과 [급여] 테이블이 있습니다. 실제 업무와 다를 수 있지만 조인의 기능을 확인하기 위하여 가정을 하도록 하겠습니다. [사원] 테이블에는 사원 정보가, [대출] 테이블에는 대출 정보가 기록되어 있습니다.
2. INNER JOIN
INNER JOIN은 양쪽의 행들 중에서 서로 연관된 내용만 검색하는 조인 방법입니다. INNER JOIN을 위해서는 우선 [그림 2]처럼 두 테이블에서 공통되지 못한 부분은 JOIN의 대상에서 제외가 됩니다.

[그림 2]
그리고 남아 있는 양쪽의 행들이 다음 [그림 3]과 같이 서로 연관된 행들끼리 결합을 하게 됩니다.

[그림 3]
결국 다음 [그림 4]와 같은 결과를 얻을 수 있게 됩니다.

[그림 4]
위 내용을 INNER JOIN을 이용한 쿼리문으로 표현한다면 다음과 같습니다.

SELECT A.사번, A.이름, B.도서
FROM 사원 A INNER JOIN 대출 B ON A.사번 = B.사번

o 이 쿼리문에서 A와 B 는 [사원] 테이블과 [대출] 테이블을 가리키는 Alias 입니다. 
o ON 부분을 보면 두 테이블을 '사번' 을 이용하여 연결하고 있습니다.

위 쿼리문은 다음과 같이 표현 할 수도 있습니다.

SELECT A.사번, A.이름, B.도서
FROM 사원 A JOIN 대출 B ON A.사번 = B.사번

즉 'INNER' 를 생략하고 단순히 'JOIN' 만 사용해도 'INNER JOIN'으로 인식됩니다. 이것은 대부분의 JOIN 이 INNER JOIN 이기 때문에 사용자의 편의를 위한 것입니다.
3. OUTER JOIN
OUTER JOIN은 한쪽 테이블을 기준으로 해서 조인을 형성합니다. 그래서 기준이 되는 테이블은 조인되는 테이블과 연관성이 없다 하여도 검색의 대상이 됩니다. 이러한 이유로 OUTER JOIN에는 다음과 같이 두가지의 방법이 존재하게 됩니다.
o LEFT OUTER JOIN (기본값)
o RIGHT OUTER JOIN
만일 [사원] 테이블과 [대출] 테이블을 OUTER JOIN 시킬 때 [사원] 테이블을 기준으로 한다면 다음 [그림 5] 와 같은 결과를 얻게 됩니다.

[그림 5]
위 내용을 쿼리문으로 표현한다면 다음과 같습니다.

SELECT A.사번, A.이름, B.도서
FROM 사원 A LEFT OUTER JOIN 대출 B ON A.사번 = B.사번

하지만 [대출] 테이블을 기준으로 한다면 다음 [그림 6] 과 같은 결과를 얻게 됩니다.

[그림 6]
위 내용을 쿼리문으로 표현한다면 다음과 같습니다.

SELECT A.사번, A.이름, B.도서
FROM 사원 A RIGHT OUTER JOIN 대출 B ON A.사번 = B.사번

4. FULL JOIN
FULL JOIN은 [그림 5]와 [그림 6]의 결합이라고 생각하시면 됩니다. 결합이 되는 양쪽 테이블에서 연관성이 없는 행도 조인의 결과에 포함되기 때문입니다. [사원] 테이블과 [대출] 테이블의 FULL JOIN의 결과는 다음 [그림 7]과 같습니다.

[그림 7]
위 내용을 쿼리문으로 표현한다면 다음과 같습니다.

SELECT A.사번, A.이름, B.도서
FROM 사원 A FULL JOIN 대출 B ON A.사번 = B.사번

5. CROSS JOIN
CROSS JOIN은 한쪽 테이블의 모든 행들에 대하여 다른 쪽 행들이 전부 대입이 되는 형태의 조인입니다. 만일 [사원] 테이블과 [대출] 테이블을 CROSS JOIN 시킨다면 [그림 8] 과 같은 각각 대입되어 [그림 9]와 같은 결과를 얻게 됩니다. 단, [그림 8]은 첫번째 행에 대한 대입만을 보여주고 있는데 이러한 대입이 [사원] 테이블의 모든 행에 대하여 이루어지게 됩니다.

[그림 8]

[그림 9]
결국 [사원] 테이블의 행의 갯수 X [대출] 테이블의 행의 갯수 만큼의 행이 CROSS JOIN의 결과를 얻어지게 됩니다.
위 내용을 쿼리문으로 표현한다면 다음과 같습니다.

SELECT A.사번, A.이름, B.도서
FROM 사원 A CROSS JOIN 대출 B

즉, 두 테이블의 연관성이 전혀 필요없게 되므로 ON 절이 포함되지 않습니다.
6. 정리
SELECT 문을 사용 할 때 가장 이해하기 힘든 부분이 JOIN 이 아닌가 싶습니다. JOIN 기능을 잘 익혀 두면 좀더 효율적인 검색을 할 수 있습니다. OUTER JOIN이나 FULL JOIN, CROSS JOIN은 잘 사용이 되지 않습니다. 그 이유는 많은 사람들이 INNER JOIN 까지만 배우고 더이상은 JOIN에 대하여 배우지 않고 무작정 SELECT 문을 사용하기 때문이 아닌가 싶습니다.
다음 강좌에서는 실제로 JOIN을 사용하는 예제를 보면서 다시한번 JOIN에 대하여 살펴볼 예정입니다. 온라인 설명서(Books Online)을 보시면 JOIN에 대한 방대한 량의 설명이 있습니다. 그 내용을 꼭 참고하여 주시기 바랍니다.
Posted by 주말소프트
,

JOIN (조인) 연산자
 - 두개 이상의 테이블을 연결하여 데이터를 검색할때 사용한다.
 - 데이터베이스 시스템과 그 환경의 성능을 확인하는데도 사용할 수 있다. (느린 쿼리를 사용하여 비교)
 - 조인에는 여러가지 종류가 있다.

 

 조인 종류  설명 
 내부조인(INNER JOIN)  조건을 사용해서 두 테이블의 레코드를 결합한다.
 외부조인(OUTER JOIN)  내부조인과 비슷한데 일치하지 않는 열까지 반환하며 그 열은 NULL로 반환한다.
 동등 조인(EQUI JOIN)  내부조인이다. 두 테이블 사이의 같은 행들을 반환한다.
 비동등 조인(NON-EQUI JOIN)  내부조인이다. 두 테이블 사이의 같지 않은 행들을 반환한다.
 자연 조인(NATURAL JOIN)  'ON' 절이 없는 내부조인. 같은 열 이름을 가진 두 테이블을 조인할때만 작동
 크로스 조인(CROSS JOIN)  한 테이블의 모든 행과 다른 테이블의 모든 행이 연결되는 모든 경우를 반환.
 카티젼 조인(CARTESIAN JOIN)  크로스 조인의 한 종류. 조건이 없다. (크로스 프로덕트)
 콤마 조인(COMMA JOIN)  콤마가 CROSS JOIN 키워드 대신 사용된다는 점을 제외하면 크로스 조인과 같다.
 셀프 조인(SELF JOIN)  자기 자신을 조인한다.

 



1. 내부 조인(INNER JOIN)
 - 조건을 사용하여 두 테이블의 레코드를 결합한다.
 - 동등 조인, 비동등 조인, 자연 조인 등이 있다.

 

1
2
3
4
Select somecolumns From table1          -- 반환되는 열
                Inner Join                    
                table2
                ON somecondition;   -- ON 또는 WHERE 조건절

 

 


 
 1) 동등 조인(EQUI JOIN)
      - 두 테이블 사이의 같은 행들을 반환한다.

 예) 각 boy가 어떤 toy를 가지고 있는지 조사한다. (매핑 확인)

 

1
2
3
Select boys.boy, toys.toy
From boys INNER JOIN toys
ON boys.toy_id = toys_toy.id;

 

 

 


  
 2) 비동등 조인(NON-EQUI JOIN)
     -두 테이블 사이의 같지 않은 모든 행들을 반환한다.
 
 예)

 

1
2
3
4
Select boys.boy, toys.toy
From boys INNER JOIN toys
ON boys.toy_id <> toys.toy_id -- <> :  같지 않음
ORDER BY boys.boy;          -- 정렬

 

 



 3) 자연 조인(NATURAL JOIN)
     - 두 테이블에 같은 이름의 열이 있을때만 동작한다.
     - ON이 필요없다.

  예) 

 

1
2
Select boys.boy, toys.toy
From boys NATURAL JOIN toys;

 

 

 

 


2. 외부 조인(OUTER JOIN)
  - 내부 조인과 유사하며 일치하는 것이 없을 경우 NULL로 표시한다.
  - 왼쪽 테이블은 FROM 바로 다음에 나오는 테이블이고, JOIN 뒤에 나오는 테이블이 오른쪽 테이블이다.
  - 왼쪽 외부 조인(LEFT OUTER JOIN)과 오른쪽 외부 조인(RIGHT OUTER JOIN)이 있다.
  - 왼쪽 외부 조인을 사용할 경우 왼쪽 테이블을 오른쪽 테이블에 비교한다. 오른쪽 외부 조인도 그 반대로 동작한다. 일대다 관계에 유용하다.

 유용한 예) girls가 어느 toys를 가지고 있는지 알아보도록 쿼리를 작성한다.

  i) 왼쪽 테이블을 오른쪽 테이블에 비교하는 방법 

 

1
2
3
Select g.girl, t.toy From girls g
Left Outer Join toys t
ON g.toy_id = t.toy_id;

 

 

 


  ii) 반대로 했을때

 

1
2
3
Select g.girl, t.toy From toys t
Left Outer Join girls g
ON g.toy_id = t.toy_id;

 

 

 


  
 
3. 크로스 조인(CROSS JOIN)
  - 한 테이블의 모든 행과 다른 테이블의 모든 행을 짝지워 반환한다.
  - 카티전 조인, 카티전 프로덕트 등이 있다.

 예)

 

1
2
Select t.toy, b.boy
From toys AS t CROSS JOIN boys AS b;

 

 




4. 셀프 조인(SELF JOIN)
  - 자기 자신을 조인한다.
  - 자기 자신을 하나씩 비교하기 위해 사용한다.
  - 하나의 테이블로 같은 정보를 가진 테이블이 두 개 있는 것처럼 쿼리를 보낼 수 있다.

  예) 각 사람의 이름(name)과 그 사람을 담당하는 보스(boss)의 이름을 가져온다. 

 


 

 

1
2
3
4
Select c1.name, c2.name AS boss
From clown_info c1
Inner Join clown_info c2
ON c1.boss_id = c2.id;

 

 

Posted by 주말소프트
,
REPAIR NO_WRITE_TO_BINLOG TABLE  {테이블}

7GB(7807133888 Byte) 의 MYD 를 해봤음
1시간 38분 17초

mysqldump로 덤프 받지 않고 그냥 MYD와 MYI를 복사(frm 은 미리 만들고 덮었음)
check table {테이블}로 에러가 있다고 나와서 repair를 해봤음.


2GB를 할 때는 10분이 안걸렸음(3분정도?)

큰 파일 할 때 REPAIR 테이블... 조심하자...


REPAIR할 때 시스템은 MYSQL이 떠있기만 하고 서비스는 안 하고 있었음.

 

Posted by 주말소프트
,

Sqlyog 에서 한글이 네모등으로 깨져서 나올때


폰트 설정이 잘못되어서 그럴수도 있다.
Tools >Editㅐr > Fonts 부분에서 change > 한글폰트(돋움체 등)을 선택 후 스크립트에서 한글을 선택한다.

SQLyog Community - MySQL GUI v9.02
에서 테스트 해보았음.
Posted by 주말소프트
,

MySQL 에서 workbench 와 GUI Tools 이 나와있지만 정작 쿼리브라우저를 쓸때 한글이 제대로 써지지 않는다거나 프로그램이 뻗어버리는 등의 문제로 짜증이 나신다구요? 그런 문제만 해결되는 툴이라면 Editplus 처럼 시작할때 "사세요~" 라는 문구정도는 애교로 봐주실 수 있으시다구요? 그럼! 여기 로 가보세요. SQLyog 는 한글이 제대로 써집니다. 커뮤니티 에디션은 공짜랍니다. ㅋㅋㅋ

'데이터베이스' 카테고리의 다른 글

MySQL JOIN 이란?  (0) 2014.08.20
MySQL DB 테이블 연산자 - JOIN 명령어  (0) 2014.08.20
REPAIR TABLE 속도  (0) 2014.08.20
SQLyog 에서 한글이 네모등으로 깨져서 나올때  (0) 2014.08.20
DB 내용 찾아바꾸기  (0) 2013.12.30
Posted by 주말소프트
,

phpmyadmin 접속하셔서 SQL 질의에 내용입력후 실행하세요.

update `테이블명` set 컬럼명 = replace(컬럼명, '찾을문자', '변경할문자');

ex)
update `g4_write_E000004` set wr_content = replace(wr_content, 'http://naver.com/data/cheditor4', 'http://sir.co.kr/data/cheditor4');

Posted by 주말소프트
,