데이터 센터의 주요 요소

애플리케이션 : 컴퓨팅 연산의 로직을 제공하는 컴퓨터 프로그램.

데이터베이스 관리 시스템 (RDBMS) : 서로 연관된 논리적 테이블에 데이터를 저장하기 위한 구조적인 방법을 제공한다.

호스트 또는 컴퓨터 : 애플리케이션과 데이터베이스를 실행하는 컴퓨팅 플랫폼.

네트워크 : 여러 네트워크 디바이스 간의 통신을 위한 데이터 이동 경로.

스토리지 : 데이터를 영속적으로 저장하기 위한 디바이스.

데이터 센터 요소에 대한 주요 요구 사항

Availability(가용성) : 언제 어디서든 서비스에 접근 가능해야 한다(정보를 즉시 제공해야 한다).

Security(보안) : 데이터 센터는 인증된 사람만 정보에 액세스할 수 있도록 정책과 절차를 수립하고 핵심 요소를 통합해야 한다.

Capacity(용량) : 데이터 센터 운영에는 많은 양의 데이터를 효율적으로 저장하고 처리하기 위한 적절한 리소스가 필요하다.

Scalability(확장성) : 필요 시 비즈니스 운영의 중단 없이 리소스를 확장할 수 있어야 한다.

Performance(성능) : 데이터 센터의 모든 요소는 서비스 레벨에 기반해 최적의 성능을 제공해야 한다.

Data Intergrity(데이터 무결성) : 데이터를 전송받는대로 올바르게 저장하고 추출되는지를 보장해야 한다.

(내결함성 : 하드웨어적인 요소들의 문제로 서비스가 중지되면 안 된다. 이 때문에 모든 부품들은 예비 용도로 이중화 처리가 되어 있다.)

 

데이터 센터 관리

모니터링 : 데이터 센터의 여러 엘리먼트와 수행되는 서비스들에 대해 지속적으로 정보를 수집해야 한다. 모니터링해야 할 것으로는 보안과 성능, 가용성, 용량이 있다.

보고 : 서로 연관된 논리적 테이블에 데이터를 저장하기 위한 구조적인 방법을 제공한다.

공급 : 애플리케이션과 데이터베이스를 실행하는 컴퓨팅 플랫폼.

네트워크 : 여러 네트워크 디바이스 간의 통신을 위한 데이터 이동 경로.

스토리지 : 데이터를 영속적으로 저장하기 위한 디바이스.

 

ex) 하드 디스크의 수명이 거의 다 되었을 때 모니터링을 통해 확인하고 보고함으로써 데이터의 손실을 방지할 수 있다.

 

Information Lifecycle Management

정보화 시대에 돌입하면서 데이터와 정보들이 폭발적으로 증가하고 있고 고가용성을 보장하기 위한 데이터의 복제 및 용도 변경도 정보 증가에 큰 영향을 끼치고 있다. 이렇게 폭증한 정보들은 비즈니스적 측면에서 성공의 여부를 좌우하는 중요한 역할을 하고 시장에서 경쟁 우위를 가지게 하는데, 이러한 정보의 가치는 계속 변화하고 있기 때문에 정보를 효율적으로 운용하기 위해서는 정보 수명주기 동안 정보의 가치를 이해해야 한다.

 

아래는 시간이 지남에 따라 변화하는 주문 정보의 가치를 나타낸 이미지이다.

Virtualization

가상화(Virtualization)는 물리적 리소스를 추상화하여 논리적 리소스로 보이게 하는 기술이다.

    - 물리적 디스크의 파티션

가상화는 여러 개의 물리적 리소스를 모아 하나로 합친 형태로 제공할 수 있다.

    - 스토리지 가상화

    - 컴퓨터 가상화

여러 개의 물리적 리소스를 모아 풀(pool)을 구성한 후, 여기서 가상 리소스를 만들어 공급할 수 있다.

    - 스토리지 풀에서 지정한 크기의 가상 디스크

    - 특정 CPU 파워와 메모리를 가진 가상 서버를 컴퓨터 풀에서 만들 수 있다.

 

클라우드 컴퓨팅의 특징

  • 클라우드 컴퓨팅은 개인 및 조직이 IT 리소스를 네트워크를 통한 서비스로 사용할 수 있도록 지원한다.
  • 클라우드 컴퓨팅은 완전히 자동화된 요청 및 공급 프로세스를 통해 셀프 서비스로 필요한 것을 요청할 수 있게 한다 (사용자가 컴퓨팅 리소스 사용을 신속하게 확장 또는 축소할 수 있다).
  • 클라우드 컴퓨팅에서는 사용량 기반의 비용 청구가 가능하다 (사용자는 CPU 사용 시간과 데이터 전송량, 저장한 데이터의 용량 등 자신이 사용한 리소스에 대한 비용만 지불하면 된다).
  • 클라우드 인프라 스트럭쳐는 보통 리소스 풀링과 빠른 리소스 공급을 제공하는 가상화된 데이터 센터를 기반으로 구축된다 (빠르게 서비스를 시작하고 경쟁해야 하는 프로젝트에서 온프레미스가 아닌 클라우드 서비스를 이용할 경우 이점이 있다).

Redis 클라이언트 접속

root@db2:~# redis-cli

127.0.0.1:6379>

 

데이터 저장

127.0.0.1:6379> set 1111 "JM JOO"

OK

127.0.0.1:6379> set 1112 "YH JOO"

OK

127.0.0.1:6379> set 1113 "KO HONG"

OK

127.0.0.1:6379> set 1114 "DJ HONG"

OK

 

데이터 검색

127.0.0.1:6379> get 1111

"JM JOO"

127.0.0.1:6379> get 1112

"YH JOO"

 

Key값 출력

127.0.0.1:6379> keys *

1) "1113"

2) "1111"

3) "1112"

4) "1114"

127.0.0.1:6379> keys *2

1) "1112"

 

Key 삭제

127.0.0.1:6379> del 1112

(integer) 1

127.0.0.1:6379> keys *

1) "1113"

2) "1111"

3) "1114"

 

Key 이름 변경

127.0.0.1:6379> rename 1113 1116

OK

127.0.0.1:6379> keys *

1) "1111"

2) "1116"

3) "1114"

 

랜덤 Key 검색

127.0.0.1:6379> randomkey

"1116"

127.0.0.1:6379> randomkey

"1114"

 

존재 여부 검색

127.0.0.1:6379> exists 1111

(integer) 1

127.0.0.1:6379> exists 1112

(integer) 0

 

Value 길이 확인

127.0.0.1:6379> strlen 1111

(integer) 6

 

전체 Key 삭제

127.0.0.1:6379> flushall

OK

127.0.0.1:6379> keys *

(empty array)

 

일정 시간 동안만 저장

127.0.0.1:6379> setex 1111 30 "JM JOO"

OK

127.0.0.1:6379> ttl 1111

(integer) 18

127.0.0.1:6379> ttl 1111

(integer) 5

127.0.0.1:6379> ttl 1111

(integer) 0

127.0.0.1:6379> ttl 1111

(integer) -2

127.0.0.1:6379> get 1111

(nil)

 

데이터 다중 일괄 저장 및 검색

127.0.0.1:6379> mset 1113 "NoSQL User Group" 1115 "PIT"

OK

127.0.0.1:6379> mget 1113 1115

1) "NoSQL User Group"

2) "PIT"

'IT > Database' 카테고리의 다른 글

[RDBMS] Sub Query, UNION, JOIN Example  (0) 2021.10.07
[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06

TABLE STRUCTURE



QUERY



EXPLAIN


'IT > Database' 카테고리의 다른 글

[NoSQL] Redis Commands  (0) 2021.10.08
[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06

 UNION

특징

  • 여러 개의 테이블을 세로로 합치는 개념이다(추가적인 레코드 출력).
  • UNION하는 두 테이블의 컬럼명이 다른 경우에는 첫 번째 테이블의 컬럼명으로 출력된다.
  • 중복되는 데이터는 자동으로 DISTINCT해서 출력한다(UNION ALL 사용 시 전부 출력).
  • LIMIT을 걸면 UNION을 통해 테이블을 합친 후에 수행한다. 괄호로 SELECT문을 묶는다면 해당 단일 쿼리 안에서 LIMIT을 수행하도록 할 수 있다.

JOIN

특징

  • 여러 개의 테이블을 가로로 합치는 개념이다(레코드 당 추가적인 정보).
  • 각 테이블에 같은 컬럼이 있을 때만 JOIN을 할 수 있으며, 그 컬럼이 '붙이기 위한 키워드'가 된다.
  • JOIN은 INNER JOIN을 기본으로 사용하며, 일치하지 않는 값은 출력하지 않는다(곱집합).
  • LEFT OUTER JOIN (LEFT JOIN) = 왼쪽 테이블을 우선시하는 합집합.
  • RIGHT OUTER JOIN (RIGHT JOIN) = 오른쪽 테이블을 우선시하는 합집합.
  • CROSS JOIN = 두 테이블의 레코드들의 모든 조합 (모든 경우의 수)
  • INNER JOIN과 OUTER JOIN은 결합 조건을 ON 구에 적어야 한다. 비교 연산자 뿐만 아니라 논리 연산자 등 다양한 연산자로 조건을 설정할 수 있다.
  • 컬럼명 간 등호를 사용하여 결합 조건을 설정할 경우 ON 대신 USING 구를 사용할 수도 있다.

'IT > Database' 카테고리의 다른 글

[NoSQL] Redis Commands  (0) 2021.10.08
[RDBMS] Sub Query, UNION, JOIN Example  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06

서브 쿼리란 쿼리 안의 쿼리를 말한다. 서브 쿼리를 감싸고 있는 원래의 쿼리는 메인 쿼리라고 부른다.

 

SELECT [컬럼명] FROM [테이블명]

    WHERE [컬럼명] [연산자] (SELECT ~);

 

서브 쿼리는 위의 형식과 같이 괄호로 감싸며, 서브 쿼리에는 세미콜론을 사용하지 않는다.

 

아래의 예제들을 살펴보자.


WHERE절에서의 사용

SELECT -- (3)
    order_id, price
FROM -- (1)
    productorder
WHERE -- (2)
    price >= (
        SELECT -- (2-2)
            AVG(price)
        FROM -- (2-1)
            productorder
    );

 

WHERE절에서 서브 쿼리를 날리는 쿼리문이다. 서브 쿼리로 가져온 결과를 메인 쿼리의 조건으로 사용하고 있다.

 


SELECT절에서의 사용

SELECT -- (2)
    order_id, price,
    (
        SELECT -- (2-2)
            COUNT(*)
        FROM -- (2-1)
            productorder
    ) AS order_count
FROM -- (1)
    productorder
ORDER BY -- (3)
    price
LIMIT -- (4)
    3;

 

SELECT절에서 서브 쿼리를 사용했다. 원래라면 집약 함수와 일반 컬럼을 동시에 가져올 수 없기 때문에

SELECT
    order_id, price, COUNT(*)
~

이런 식의 쿼리를 작성하면 에러가 발생해 결과값을 도출할 수 없지만 서브 쿼리를 사용함으로써 가능케 하는 것이다.

 


HAVING절에서의 사용

SELECT
    customer_id, AVG(price)
FROM
    productorder
GROUP BY
    customer_id
HAVING
    AVG(price) < (
        SELECT
            AVG(price)
        FROM
            productorder
    );

 

WHERE절에서 사용한 것과 비슷하게 HAVING절에서도 서브 쿼리로 가져온 값으로 조건을 걸어줄 수 있다.


서로 다른 테이블

SELECT
    customer_id, customer_name
FROM
    customer
WHERE
    membertype_id = (
        SELECT
            membertype_id
        FROM
            membertype
        WHERE
            membertype = "할인 회원"
    );

 

메인 쿼리의 customer 테이블과는 다른 membertype 테이블에서 membertype 컬럼이 할인 회원인 멤버의 아이디만 가져와서 조건을 걸 수도 있다.


복수행 서브 쿼리

SELECT
    order_id, product_id
FROM
    productorder
WHERE
    product_id IN (
        SELECT
            product_id
        FROM
            product
        WHERE
            price >= 150
    );

 

 

위와 같이 서브 쿼리의 결과가 단일행이 아닌 복수행으로 반환되는 경우 일반적인 연산자(<, >, = 등...)는 사용할 수 없다. 그 대신 IN, ANY, ALL 등의 연산자를 통해 비교할 수 있다.

 

IN : 리스트에 이 값이 하나라도 있으면 1 반환.

ANY : 조건이 일치하는 값이 리스트에 하나라도 있으면 1 반환.

ALL : 리스트에 있는 값이 전부 조건에 일치하면 1 반환.


ANY, ALL 연산자

SELECT
    *
FROM
    product
WHERE
    stock < ANY (
        SELECT
            SUM(quantity)
        FROM
            productorder
        GROUP BY
            product_id
    );

 

위와 같은 방식으로 사용할 수 있다.

 


서브 쿼리에서의 LIMIT 오류 해결법

SELECT
    customer_id, customer_name
FROM
    customer
WHERE
    customer_id IN (
        SELECT
            customer_id
        FROM (
            SELECT
                customer_id
            FROM
                productorder
            ORDER BY
                price DESC
            LIMIT 3
        ) AS tmp
    );

 

서브 쿼리를 IN, ANY, ALL 등의 연산자를 통해 처리할 때 해당 서브 쿼리 내부에서 LIMIT 예약어 사용 시 MySQL 버전에 따라 오류가 발생할 수 있다. 이 때 서브 쿼리를 이중으로 중첩시켜서 제일 내부에 있는 서브 쿼리에서 LIMIT을 걸어주면 문제없이 LIMIT을 사용할 수 있다.


상관 서브 쿼리

SELECT
    product_id,
    product_name
FROM
    product
WHERE
    3 < (
        SELECT
            SUM(quantity)
        FROM
            productorder
        WHERE
            product.product_id = productorder.product_id
    );

 

상관 서브 쿼리의 실행 구조

상관 서브 쿼리란 기존의 메인 쿼리 이전에 서브 쿼리를 완전히 끝내고 그 결과값을 통해 메인 쿼리를 하는 방식과는 달리 메인 쿼리를 수행하는 중에 서브 쿼리도 수행하는 것이다. 서브 쿼리의 결과를 매번 비교해서 메인 쿼리에게 전달한다.


외래 키(Foreign Key)

어떤 테이블의 PRIMARY KEY 값이 다른 테이블의 컬럼 중에 포함될 경우 이것을 외래 키라고 한다.

예를 들어 customer 테이블과 order 테이블이 있을 때 customer 테이블에 있는 customer_id는 PK, order 테이블에 있는 customer_id는 FK이다.

 

customer 테이블에 존재하지 않는 값은 order 테이블에서도 외래 키로 사용할 수 없다.

ex) customer_id = 100 은 존재하지 않기 때문에 order 테이블에도 넣을 수 없음.


EXISTS

SELECT
    product_id, product_name
FROM
    product AS p
WHERE
    EXISTS (
        SELECT
            *
        FROM
            productorder AS po
        WHERE
            p.product_id = po.product_id
    );

 

EXISTS 뒤에 오는 서브 쿼리의 결과값이 존재하면 1을 반환(출력), 하나의 레코드도 리턴되지 않는다면 0을 반환한다.

존재하지 않으면 출력하는 NOT EXISTS도 사용 가능하다.

'IT > Database' 카테고리의 다른 글

[RDBMS] Sub Query, UNION, JOIN Example  (0) 2021.10.07
[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06
[RDBMS] CASE 함수  (0) 2021.10.06
SELECT
    CAST("123" AS SIGNED) + 1;

위와 같이 CAST 함수를 이용하여 문자열 타입이었던 "123"을 정수형 123으로 치환해서 1을 더할 수 있게 된다.

 

SIGNED 대신 UNSIGNED 사용 시 출력값이 음수가 되면 out of range가 뜬다. 절대값 출력일 것이라 생각했으나 단순히 양수만 처리 가능한 것 같다.

 

SIGNED 대신 DECIMAL 사용 시 실수 처리 가능.

'IT > Database' 카테고리의 다른 글

[RDBMS] UNION & JOIN  (0) 2021.10.07
[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06
[RDBMS] CASE 함수  (0) 2021.10.06
[RDBMS] IF 함수 및 함수 중첩(nest)  (0) 2021.10.06

IFNULL(인수1, 인수2)

  1. 인수1이 NULL이 아니면 인수1 반환, NULL이면 (2)번 과정으로.
  2. 인수2가 NULL이 아니면 인수2 반환, NULL이면 NULL 반환.

 

SELECT
    *
FROM
    product
ORDER BY
    IFNULL(price, 999999) ASC;

 

price가 NULL일 경우에 값을 999999로 만들어서 맨 마지막에 위치하도록 정렬한다.

 

NULLIF(인수1, 인수2)

  1. 인수1 = 인수2 → NULL 반환
  2. 인수1 ≠ 인수2 → 인수1 반환

데이터가 NULL일 경우에 0이 아닌 NULL 그대로 나오게 해야할 경우 사용한다.

ex) 나눗셈의 분모 지정 시

'IT > Database' 카테고리의 다른 글

[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] CASE 함수  (0) 2021.10.06
[RDBMS] IF 함수 및 함수 중첩(nest)  (0) 2021.10.06
[RDBMS] WHERE와 HAVING의 차이  (0) 2021.10.05

First Match 기법을 사용하기 때문에 위의 조건부터 체크하며 하나의 조건이 만족하면 해당 처리를 수행 후 그 아래는 확인하지 않고 바로 END로 이동한다. 어떤 것에도 들어맞지 않으면 ELSE의 처리를 수행한다.

 

조건 CASE

SELECT
    customer, quantity,
    CASE
        WHEN quantity <= 3 THEN 1000
        WHEN quantity <= 7 THEN 1200
        WHEN quantity <= 10 THEN 1500
        ELSE 2000
    END AS delivery_fee
FROM
    delivery;

WHEN 뒤에 어떤 조건을 주고, THEN 뒤에 해당 조건을 만족한다면 실행할 동작을 작성한다.

만약 "WHEN quantity <= 10 THEN 1500"이 맨 위로 갈 경우 전부 맨 위에서 걸릴 것이기 때문에 항상 내려갈수록 조건의 범위가 좁아지도록 설정해주어야 한다(피라미드 형태).

 

값 CASE

SELECT
    customer,
    CASE delivery_time
        WHEN 1 THEN "오전"
        WHEN 2 THEN "오후"
        WHEN 3 THEN "야간"
        ELSE "지정 없음"
    END AS delivery_time2
FROM
    delivery;

WHEN 뒤에 어떤 값을 주고, CASE 뒤의 Column이 해당 값이라면 THEN 뒤의 값을 END AS 뒤의 별명으로 출력한다.

'IT > Database' 카테고리의 다른 글

[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06
[RDBMS] IF 함수 및 함수 중첩(nest)  (0) 2021.10.06
[RDBMS] WHERE와 HAVING의 차이  (0) 2021.10.05
MySQL Workbench Tips (Updating)  (0) 2021.10.05

+ Recent posts