[DB, SQL] 뷰, 인덱스

JUNHO YEOM·2022년 11월 9일
0

DB, SQL

목록 보기
11/21
post-thumbnail

뷰 - 가상의 테이블

조회한 data의 결과를 저장하여 활용할 수 있게 하는 것

  • 보안 측면에서 활용 가능(일부 data에서만 접근이 가능하도록 뷰 생성)
  • 일부 내용을 숨겨서 원하는 내용만 보이게 할 수 있음

뷰 생성하기

CREATE VIEW section_view AS # section_view라는 이름으로 뷰 생성
SELECT section_id, section_name
FROM sections;

뷰 조회하기

SELECT * FROM section_view; # 일반 조회 쿼리와 동일

---

뷰 삭제하기

-- 뷰 삭제
DROP VIEW section_view; # 일반 삭제와 동일

뷰 생성하여 데이터 일부 숨기기

CREATE VIEW menu_view AS
SELECT
  menu_id,
  menu_name,
  CONCAT(
    SUBSTRING(business_name, 1, 1), # 컬럼 내용 일부를 감추기
    REPEAT('*', CHAR_LENGTH(business_name) - 1)
  ) AS business,
  price,
  likes AS evaluation
FROM businesses B
INNER JOIN menus M
  ON M.fk_business_id = B.business_id;

내용 수정이 가능한 뷰

  • 집계함수를 사용하지 않음(MAX, MIN, AVG)
  • GROUP BY 사용하지 않음
  • UNION, DISTINCT 사용하지 않음
  • SELECT절에 서브쿼리 없음
  • WHERE절의 서브쿼리가 FROM절의 테이블을 참조하지 않음
  • 조인은 INNER 조인만 가능

예시

UPDATE section_view
	SET section_name = '서양식'
WHERE section_id = 5;
# 일반 조회로 만들어진 뷰 테이블이어서 수정 가능
UPDATE business_view
  SET business_name = '화룡반점'
WHERE business_name = '화룡각';
# 집계함수가 사용된 뷰 테이블이기 때문에 수정 불가능함

인덱스

  • 특정 컬럼에 대한 목차 생성하여 검색 속도를 빠르게 함
  • 테이블 내용 변경(추가, 수정, 삭제)시 속도는 더 느려진다.
  • 데이터의 변경이 잦지 않은 테이블
  • WHERE, ORDER BY 에 자주 사용되는 컬럼(찾기)
  • JOIN에 사용되는 컬럼(찾아서 가져오는 작업)
  • Cardinality가 높은 컬럼 = 중복도가 낮은 컬럼 (B-Tree 경우)
    (데이터가 많아서 검색까지의 속도가 오래걸릴 가능성이 있는 경우)

Primary Key에는 기본적으로 인덱스가 적용됨


인덱스 만들기

일반 인덱스 지정

ALTER TABLE `mydatabase`.`businesses` 
ADD INDEX index_biz_name (business_name);
# index_biz_name이라는 인덱스를 business_name이라는 컬럼에 추가

다중 컬럼 인덱스

ALTER TABLE menus
ADD INDEX index_name_cal (menu_name, kilocalories);
# index_name_cal이라는 인덱스를 menu_name과 kilocalories 두개 컬럼에 추가

인덱스 조회하기

SHOW INDEX FROM businesses;

인덱스 삭제하기

ALTER TABLE businesses
DROP INDEX index_biz_name;

인덱스의 종류

1. B-Tree 인덱스

  • 기본(default) 인덱스
  • Cardinality(중복도)가 높은 컬럼에 적합

2. Full-Text 인덱스

  • 다수의 단어 등을 포함하는 컬럼에서 단어 및 구문을 검색하기 위해 사용됨
  • 데이터를 일정 단위로 분할하여 인덱싱
  • CHAR, VARCHAR, TEXT 컬럼에만 적용 가능

Full-Text 인덱스는 InnoDB, MyISM에서만 사용 가능
InnoDB : 수정, 삭제, 추가 작업이 발생할 경우 적합
MyISM : 대량의 읽기 작업만 발생할 경우 적합

Full-Text 인덱스 생성하기

ALTER TABLE ratings
ADD FULLTEXT INDEX index_full_text (comment);
# Full-text 인덱스 만들기

Full-Text 인덱스 사용하여 조회하기

SELECT * FROM ratings
WHERE MATCH(comment) AGAINST ('괜찮은데');

3. Hash 인덱스

  • 일치 여부만 확인 가능( <, >, Like등은 사용 불가)
  • 인덱스 크기가 작고 검색이 매우 빠름
  • MEMORY, NDB 엔진에서만 사용 가능
  • InnoDB 엔진에서는 내부적으로 Adoptive Hash Index를 구현한다
    - 자주 사용되는 데이터는 내부적으로 Hash값을 생성하여 속도 증가시킴

4. 비트맵 인덱스

  • Cardinality(중복도)가 낮은 컬럼에 적합
  • MySQL에서는 지원하지 않음

0개의 댓글