본문 바로가기

카테고리 없음

8주차 배운점 느낀점 - INDEX, ER다이어그램

728x90
반응형

8주차

면접볼 때 나를 어필해야한다. 예를 들어 검색에대한 리스폰스 타임 줄일수있도록 튜링 해봤다면 튜닝 알고리즘을 이용해서 이거이거해봤다 -> 일일이 지시하지 않아도 자기가 무엇을 해야할지 계획해서 진행할 줄 아는 자질이 있구나를 인지 시키자. 회사는 일을하는 곳이지 배우러가는 곳이 아니다라고 하셨다.

 

"백앤드에서 제일 변하지않는 게 뭐다? 데이타베이스다."라고 하셨다.
개발 여러 언어가 새로 나오고 발전한다. 변하지 않는 데이터베이스 잘 숙지하자

 

프로젝트에 대한 구현은 잘 안물어본다고 하셨다.
주제 선정이유에 대해서, 밴치마킹한 사이트, 그 사이트와 무슨 차이점이 있는지? 어떤기술 도입했는지?를 생각해야한다. 유념하며 프로젝트를 진행해야겠다.

 

인덱스에 대해 배웠다. 테이블을 빠르게 조회할 수 있다. 인덱스를 만들기 전과 후의 성능차이를 비교했다.

예시문을 보고 다이어그램을 그렸다.

 

배운점

 

데이터베이스 튜닝

 

성능 향상 --> 응답 시간의 단축
인덱스 (활용)

 

인덱스
==> 열 (column)

 

첫째줄에 인덱스조회를 검사할 테이블 indexTbl2를 만들었다.
두째줄에 employees.employees에서 1000개의 데이터를 가져온다.
셋째줄에 first_name = 'Mary'를 조회해본다.
넷째줄에 first_name 속성을 이용해서 인덱스를 만든다.
다섯째줄에 first_name = 'Mary'를 다시 조회해본다.
처음 조회와 나중 조회를 비교해본다.

-- index 테이블 생성
create table indexTbl2(first_name varchar(14), last_name varchar(16), hire_date date);

-- 1000개만 인덱스테이블에 갖고와
insert into indexTbl2 select first_name, last_name, hire_date from employees.employees limit 1000;

-- indexTbl2 에 first_name = 'Mary' 
select * from indexTbl2 where first_name = 'Mary';

-- 컬럼에 뭔가 걸때 on 사용, Mary만 있는 인덱스로 조회
create index idx_indexTbl2_firstname on indexTbl2(first_name);

-- indexTbl2 에 first_name = 'Mary' 
select * from indexTbl2 where first_name = 'Mary';

 

처음 조회: Query cost: 100.25, 1000rows를 일일이 확인한다.

 


인덱스 만든 후 조회: 딱봐도 쾌적한 초록색이다. Query cost: 1.40, 4rows만 확인했다.

 


인덱스가 B-Tree를 구성하여 원하는 값을 빠르게 찾아갈 수 있다.
조회 기능 성능을 높히려면 인덱스 걸어줘라. 성능차이가 있다.
책 앞장에있는 인덱스는 이름으로 인덱스를 만든 것

 

단점:
인덱스 위한 추가 공간 필요
생성에 시간이 소요 될 수 있음
인서트 업데이트 딜리트가 자주발생하면 성능 많이 하락할 수 있다.

 

pk (클러스터형 인덱스)
테이블당 한 개
테이블 생성 시 제약 조건 primary key 또는 unique를 사용하면 자동으로 인덱스가 생성된다.

 

a 속성에 pk로 하여 체이블을 생성한다. a 기준으로 인덱스가 만들어져있다.

create table tbl1 (a int primary key, b int , c int);
show index from tbl1;

 


unique 를 사용한 b, c 인덱스도 생겼다.

create table tbl2 (a int primary key, b int unique, c int unique, d int);
show index from tbl2;

 


b not null 해서 클러스터형 인덱스로 만들어주었다.

unique에 not null 을 추가해서 일부러 클러스터형 인덱스로 만들 어줌
create table tbl3 (a int primary key, b int unique not null, c int unique, d int);
show index from tbl3;


클러스터형 인덱스는 행 데이터를 자신의 열을 기준으로 정렬한다.

 

pk 지정한 열은 클러스터형 인덱스가 된다.
unique not null 지정한 열은 클러스터형 인덱스로 생성된다.
unique(unique null) 지정한 열은 보조 인덱스가 생성된다.
pk와 unique not null 지정한 열이 두 개가 있다면 pk의 열이 우선 클러스터형 인덱스가 생성된다.
pk로 지정한 열로 데이터가 오름차순 정렬된다.
인덱스라는건 데이터 입력전에 만들고 넣어주는게 베스트다.

 

pk를 drop 하면 인덱스가 조회되지 않는다.
테이블을 한개 만들어줬다.

-- 회원 usertbl에 회원 2명 정보를 입력해 주세요.
create table usertbl2(userID CHAR(8) primary key, name varchar(10) not null, birthYear integer, addr varchar(40));
insert into usertbl2 select userID, name, birthYear, addr from usertbl;
insert into usertbl2 values('KGB','김종봉',1987,'서울');
insert into usertbl2 values('YKL','임경림',1980,'제주');
select * from usertbl2;


PK를 DROP 한다.

-- 테이블 변경 userID열의 PK 제거, name열을 PK 지정 해보자
ALTER TABLE userTbl2 DROP PRIMARY KEY;
show index from userTbl2;

 

아무것도 안나온다.

 


name PK 만들어줬다. 인덱스가 생겨있다.

alter table usertbl2 add constraint pk_name primary key(name);
select * from usertbl2;
show index from userTbl2;

 

프로젝트(Project)
대규모의 프로그램을 작성하기 위한 전체 과정

 

소프트웨어 공학 (소프트웨어 개발 방법론)

소프트웨어 공학 제시 모델

 

폭포수 모델
프로젝트 기획 -> 업무 분석 -> 시스템 설계 -> 프로그램 구현 -> 테스트 -> 유지보수

 

데이터베이스 모델링
1. 개념적 모델링 (업무 분석)
2. 논리적 모델링 (시스템 설계)
3. 물리적 모델링 (시스템 설계 후반부)

 

ER 다이어그램

① 교수(Professor)는 아이디(ssn), 이름(name), 나이(age), 직위(rank), 연구 분야(speciality)를 가진다.
② 학과(Department)에는 학과번호(dno), 학과이름(dname), 학과사무실(office)이 있다.
③ 대학원생(Graduate)은 아이디(ssn), 이름(name), 나이(age), 학위과정(deg_prog, 석사/박사)을 가진
다.
④ 과제(Project)는 과제번호(pid), 지원기관(sponsor), 개시일(start_date), 종료일(end_date), 예산액
(budget)이 있다.
⑤ 학과마다 그 학과를 운영(run)하는 교수(학과장이라고 한다)가 한 명씩 있다.
⑥ 한 교수가 여러 학과에서 근무(work-dept)할 수 있는데, 이때 각 학과별로 참여백분율(pct_time)이
기록된다.
⑦ 대학원생에게는 학위 과정을 밟을 전공학과(major)가 하나씩 있다.
⑧ 대학원생에게는 어떤 과목을 들으면 좋을지 조언(advisor)해주는 선임 대학원생(학생조언자라고
한다)이 있다.
⑨ 과제는 한 교수(연구책임자라고 한다)에 의해 관리(manage)된다.
⑩ 과제는 한 사람 이상의 교수(공동연구책임자라고 한다)에 의해 수행(work-in)된다.
⑪ 한 과제는 한 명 이상의 대학원생(연구조교라고 한다)에 의해 수행(work-prog)된다.


5.학과마다 그 학과를 운영(run)하는 교수(학과장이라고 한다)가 한 명씩 있다.
학과장을 여러명의 교수가 할 수 없다, 학과장 한명은 한개의 학과를 맡는다. -> 1:1
교수는 학과의 학과장을 안 맡을 수있다 -> 1 : 0

 

6.한 교수가 여러 학과에서 근무(work-dept)할 수 있는데, 이때 각 학과별로 참여백분율(pct_time)이 기록된다.
학과는 여러 교수를 가진다. 교수는 여러 학과를 가질 수 있다. -> * : *
교수는 여러 학과를 근무(work-dept)를 할 수도 있고 안할 수도 있다. -> 0,*
학과는 근무(work-dept)하는 교수가 있을수도 있고 없을 수도 있다. -> 0,*

 

7.대학원생에게는 학위 과정을 밟을 전공학과(major)가 하나씩 있다.
학생들은 한개의 전공학과를 가진다, 한개의 학과를 여러개의 학생들이 가질 수 있다. -> 1 : *
학과를 수강하는 학생이 하나도 없을 수 있다. 1 : 0

 

8.대학원생에게는 어떤 과목을 들으면 좋을지 조언(advisor)해주는 선임 대학원생(학생조언자라고한다)이 있다.
한 학생은 여러명의 조언학생들을 가질 수 있다. -> 1 : *
학생은 조언해주는 학생이 없을 수 있다. -> 1: 0

 

9.과제는 한 교수(연구책임자라고 한다)에 의해 관리(manage)된다
교수는 여러과제를 내줄 수 있다. 과제는 한명의 교수만 내줄수있다. -> 1 : *
교수가 과제를 하나도 안내줄수도 있다. 1 : 0

 

10.과제는 한 사람 이상의 교수(공동연구책임자라고 한다)에 의해 수행(work-in)된다
여러 교수가 한 과제의 공동연구책임자가 될 수 있다, 한 교수가 여러 과제들의 연구책임자가 될 수 있다. -> * : *
여러 교수가 한 과제를 수행(work-in)할 수도 있고 안할 수도 있다. 1 : 0 ~ *
한 교수가 여러 과제를 수행(work-in)할 수 있다. 1 : *

 

11.한 과제는 한 명 이상의 대학원생(연구조교라고 한다)에 의해 수행(work-prog)된다.
여러 학생이 한 과제를 맡을 수 있다. 한 학생이 여러 과제를 맡을 수 있다. -> * : *
학생은 여러 과제를 수행(work-prog)할 수도 있고 안할 수도 있다. 1 : 0 ~ *
여럿 학생이 한 과제를 수행(work-prog)할 수 있다. 1 : *

 

 

회고

 

인덱스를 사용하면 조회가 빠르다고는 알고있었는데 쿼리문을 직접 EXPLAIN하여 성능 차이를 눈으로 확인할 수 있어서 좋았다. 기억에 오래남을 것 같다.

 

대학교 대학원에대한 다이어그램을 모델링했다. 예시대로 테이블을 만들고 관계를 연결해보려고했지만 쉽지않았다.
예를 들어 과제는 '한 교수(연구책임자라고 한다)에 의해 관리(manage)된다'라는 한 문장을 보고도 단순히 한 교수니까 1 대 다 라고 생각하지 않아야한다. 각각의 개체를 생각하고 1 : * , 거꾸로 * : 1 을 대입해보고 어느것이 적용이 되는지, 둘 다 적용되는지, 1 : 1 만되는지, 0이어도 되는지를 찾아야한다.

 

익숙하지 않아서 그런지 생각보다 깊은 사고가 필요했다.

 

이글보는 술마시러간김소진, 손혜지 반성해라 . 부럽다

반응형