728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료를 남깁니다.

 

파이썬 GUI 프로그래밍

사용자가 윈도우 창을 통해서 

편리하게 마우스 클릭으로 MySQL 데이터베이스를 조작하는 방법입니다.

그러기 위해서 파이썬에서 제공하는 tkinter라는 라이브러리를 사용해야 합니다.

간단하게 윈도우 창을 만들도록 도와주는 라이브러리이다.

Tkinter 실습(1)

다음과 같이 윈도우 창이 뜨는 것을 확인할 수 있다.

Tkinter 실습(2)

다음과 같이 GUI 윈도우 창의 title과 크기를 조절할 수 있다.

Tkinter 실습(3)

 Label을 통해서 root인 tkinter에 글자를 입력할 수 있다.

또한 font로 글자 크기, 배경색, 글자색을 지정할 수 있다.

외우는 것은 아니고, 익히는 것이 좋다.

Tkinter 실습(4)

다음과 같이 버튼 클릭 함수를 미리 정의해놓고

버튼을 만듭니다.

핵심은 함수를 사용한다. 함수를 만들어주어야 한다.

Tkinter 실습(5)

버튼의 크기를 조절할 수 있다.

다음은 버튼 3개를 만들고, 버튼의 위치를 조절하였다.

side=LEFT라는 옵션을 주어서 버튼을 배치하였다.

Tkinter 실습(6)

side, fill, padx, pady 등의 옵션을 주어서 

버튼의 옵션을 주었다.

다음과 같이 버튼들이 여백을 두어서 윈도우창에 나오는 것을 볼 수 있다.

Tkinter 실습(7)

먼저 화면을 upFrame과 downFrame 이렇게 두 개로 나누었다.

Tkinter 실습(8)

파이썬을 통해서 GUI로 회원 입력 및 조회 윈도우창을 직접 만들고,

INSERT 및 SELECT를 실습해보았다.

 

감사합니다.

https://www.youtube.com/watch?v=gCeSU3ByGVs&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=24

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료를 남깁니다.

 

파이썬과 MySQL 연동

사용자가 python 응용 프로그램을 통해서 데이터베이스를 사용할 수 있도록 하는 것이다.

연동 프로그래밍

간단한 예로 쇼핑몰 데이터베이스를 사용을 하려고 한다.

이 안에 간단한 테이블을 만드려고 한다.

테이블은 SQL을 통해서 만든다.

SQL로 데이터베이스를 생성 완료하였다.

주로 이 규정된 형태를 따르고 있다.

먼저 import pymysql 명령어를 실행해서 외부 라이브러리를 사용한다.

conn 이라는 변수에 pymysql의 connect() 함수를 통해서 데이터베이스를 연동하고 이를 저장하여 conn 변수를 생성한다.

그리고 conn 변수의 cursor() 함수를 통해서 cur이라는 커서 변수를 생성한다.

그리고 각 커서별로 실행할 sql문을 문자열로 입력하여 실행한다.

SQL문이 잘못 입력되었을 시 오류도 발생을 하는 것을 볼 수 있다.

그리고 SQL 명령문을 모두 실행을 하였다면

conn 변수의 commit() 함수를 실행해서

실행한 SQL문을 연동한 데이터베이스에 저장한다.

그리고 반드시 데이터베이스와의 연동을 종료해야 한다.

conn 변수의 close()함수를 통해서 처리가 가능하다.

그러면

다음과 같이 workbench에서 확인해 볼 때 성공적으로 

테이블이 만들어지고, 데이터들이 입력이 된 것을 볼 수가 있다.

다음으로는 회원가입을 위한 파이썬 프로그래밍을 해보았다.

그리고 이 파일을 실행하면

실행 상자에서 정상적으로 프로그램이 실행되는 것을 볼 수 있다.

그리고 프로그래밍을 종료한 다음

workbench에서 테스트로 userTable을 SELECT시

정상적으로 수지 데이터가 입력된 것을 볼 수 있다.

이번에는 또 다른 예제를 가져왔다.

데이터를 조회하는 프로그램이다.

실행을 하면

다음과 같이 프로그램이 실행이 되는 것을 볼 수 있다.

 

감사합니다.

https://www.youtube.com/watch?v=Se1ImwcqmlA&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=23

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료는 남깁니다.

 

파이썬 개발 환경 준비

1) 파이썬 설치

2) PyMySQL 외부 라이브러리 설치

그러면 python과 MySQL이 PyMySQL이라는 라이브러리를 통해서 연동이 되는 것이다.

SQL문을 배워야만 사용을 할 수 있었다.

하지만 python을 통해서 마우스 클릭이나 간단한 명령어를 통해서 SQL의 명령문을 사용할 수 있게 되는 것이다.

예를 들어, 사용자가 회원가입을 하면 간단한 정보만 입력을 하면

INSERT문이 만들어지고, MySQL에 입력이 되기 때문에

사용자는 SQL을 안 배워도 회원가입을 할 수 있었던 것이다.

파이썬 소개

C언어에 비해서 훨씬 쉽다.

그리고 강력하다.

환경이 쉽고 설치도 쉽다.

그리고 강력한 외부 라이브러리들을 제공하는데

추가 기능이라고 생각하면 쉽다.

python은 여러 버전이 있는데

현재 가장 안정화된 3.9를 사용을 하면 된다.

PyMySQL을 추가로 설치를 할 것이다.

원래 python은 MySQL과 연동하는 기능이 없지만

PyMySQL 라이브러리를 통해서 MySQL과 연결하는 기능이 있다고 보면 된다.

자동차를 파이썬이라고 보면 원래는 에어컨 기능이 없었는데 

PyMySQL이라는 에어컨 기능을 추가하면 차가 시원해질 수 있다.

파이썬 설치

1) 혼공 카페에서 설치

2) 파이썬 공식 홈페이지에서 설치

3) 설치 방법

Add Python 3.9 to PATH를 선택하시고

Install Now를 선택을 하면

예를 누르면

설치가 진행이 된다.

1-2분 정도 설치 진행이 된다.

Disable path length limit을 선택을 하면

예를 클릭을 하면

설치가 완료되었다.

Close를 선택을 하면 된다.

PyMySQL 설치

윈도우 + R 키를 눌러서 cmd를 입력하여 명령 실행창을 연다.

그리고 pip install pymysql을 입력한다.

그러면 성공적으로 pymysql 외부 라이브러리 추가 기능이 설치된 것을 볼 수 있다.

파이썬 실행

IDLE를 클릭을 하면

대화형 모드라고 해서 

파이썬을 입력할 수 있는 상자가 실행이 된다.

다음과 같이 print() 함수를 사용해보고

연산을 수행해보았다.

한 줄 한 줄 정상적으로 실행이 되는 것을 볼 수 있다.

이번에는 여러 줄의 코드를 실행을 해보겠다.

File > New File 을 클릭한다.

메모장 같은 화면이 뜬다.

이렇게 코드를 입력을 하였다.

엔터를 입력하여도 실행이 되지 않는다.

File > Save를 눌러 저장을 한다.

First.py라는 이름으로 저장을 한다.

Run > Run Module을 클릭을 하면

대화형 모드 실행 상자에

실행이 된 것을 볼 수 있다.

 

감사합니다.

https://www.youtube.com/watch?v=OSKAT7IHzSE&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=22

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료를 남깁니다.

 

트리거란

자동으로 실행되는 것.

INSERT, UPDATE 및 DELETE 시 발생

데이터의 삭제를 방지

예를 들어, 블랙핑크를 삭제하기 전에 다른 곳에 저장을 하고 지우는 것이다.

그런데 업무적으로는 실수할 수도 있다.

이럴 때 트리거를 사용하면 된다.

테이블에 부착하는 것이다.

트리거 실습

CREATE TRIGGER 명령어를 통해서 트리거를 생성할 수 있다.

AFTER DELETE 명령어를 통해서 삭제후 작동하도록 지정할 수 있다.

ON 명령어를 통해서 트리거를 부착한 테이블을 만든다.

FOR EACH ROW 명령어를 통해서 각 행마다 적용시킨다.

BEGIN과 END 절 안에 트리거 실행시 작동되는 코도들을 살펴본다.

DELETE TRIGGER 생성을 완료하였다.

그리고 INSERT를 수행하면 트리거가 작동하지 않은 것을 볼 수 있다.

DELETE TRIGGER이기 때문이다.

자 이번에는 UPDATE를 해보겠다.

트리거가 작동하지 않은 것을 볼 수 있다.

이번에는 DELETE를 수행했다.

성공적으로 가수 그룹이 삭제된 것을 볼 수 있다.

트리거 활용

계좌 테이블을 예로 들자면,

계좌라는 중요한 정보를 누가 입력/수정/삭제했는지 알 수 없다. 나중에 계좌에 문제가 발생했을 때 원인을 파악하기 어렵다. 이럴 때를 대비해서 데이터에 입력/수정/삭제가 발생시 트리거를 자동으로 작동시켜 데이터를 변경한 사용자와 시간 등을 기록할 수 있다.

백업 테이블을 통한 트리거 예시

OLD 테이블은 조금 특별한 테이블이다.

시스템에서 갖고 있으며 

예를 들어, UPDATE 트리거가 작동 시 UPDATE 이전의 정보가 잠깐 들어간다고 보면 된다.

OLD 테이블에 잠깐 들어간 이전 데이터를 백업 테이블에 INSERT하는 구문이다.

CURRENT_USER() 함수를 통해서 현재 접속한 사용자의 이름을 조회한다. 현재는 root이다.

이번에는 DELETE TRIGGER를 생성하였다.

똑같이 MOD만 변경하여서 백업 테이블에 저장하는 예제이다.

UPDATE와 DELETE를 수행하였다.

백업 테이블에 잘 저장된 것을 볼 수 있다.

백업 테이블에 트리거가 잘 작동하였다는 것을 보여주는 예제이다.

보시면 modDate에 반영일 그리고 modUser에 현재 접속한 사용자를 조회하고

모든 데이터를 백업 데이블에 저장함으로써 보안성을 보장하고

데이터의 무결성에 한층 더 다가설 수 있다.

TRUNCATE TABLE 명령어를 통해서 singer 테이블의 데이터를 전부 삭제하였다.

SELECT를 해보니 결과가 조회되지 않는다.

성공적으로 TRUNCATE 구문을 완료한 것을 볼 수 있다.

backup_singer 테이블을 통해서 백업한 데이터를 확인이 가능하다.

singer테이블의 데이터를 그대로 보유하고 있는 것을 볼 수 있다.

 

감사합니다.

https://www.youtube.com/watch?v=bggWVsBmKag&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=21

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료를 남깁니다.

 

스토어드 함수란

스토어드 함수는 

우리가 MySQL에서 주로 사용하는 SUM(), CAST(), CONCAT(), CURRENT_DATE() 등을 사용해 봤습니다.

사용자가 원하는 함수를 직접 만들어서 사용할 수 있습니다.

이렇게 직접 만들어서 사용하는 함수를 스토어드 함수라고 부릅니다.

스토어드 프로시저는 입력 매개변수와 출력 매개변수가 있었는데

스토어드 함수는 입력 매개변수만 있다.

RETURNS 명령어를 통해서 반환형식을 정할 수 있고

RETURN 명령어를 통해서 반환값을 반환한다.

스토어드 함수의 경우 주로 SELECT [스토어드 함수 이름](); 의 형식으로 주로

SELECT문을 통해서 사용을 한다.

스토어드 함수의 사용

SQL로 스토어드 함수 생성 권한 허용

MySQL에서 주로 사용하는 변수이다.

한번만 실행을 해주면 다음부터는 적용이 되어서 동작한다.

먼저 스토어드 프로시저와 다른점을 살펴보자.

매개 변수에 IN 또는 OUT을 입력하여, 입력 매개변수와 출력 매개변수 선언이 없고 

오직 입력 매개변수만 입력할 수 있는 것을 볼 수 있다.

그리고 FUNCTION이라는 예약어를 사용하며

RETURNS 에 반환할 값의 데이터 형식

그리고 RETURN에 반환할 값을 입력을 하는 것을 볼 수 있다.

그외 DELIMETER, CREATE 그리고 BEGIN 및 END는 동일하다.

다음은 데뷔연도를 구하는 스토어드 함수이다.

다음과 같이 2010을 매개변수로 넘기면

활동 년수를 반환하는 것을 볼 수 있다.

SELECT INTO 를 통해서 변수를 입력하고

그 결과를 조회하는 것을 볼 수 있다.

또 다른 예시이다.

스토어드 함수는 이렇게 SELECT문을 통해서 주로 활용이 되는 것을 볼 수 있다.

스토어드 함수 삭제

DROP FUNCTION 명령어를 통해서 스토어드 함수 삭제가 가능하다.

또한 SHOW CREATE FUNTION [함수 이름]; 명령어를 통해서 기존에 작성된 스토어드 함수의 내용을 확인이 가능하다.

또한 추가적으로 result 창에서 Create Function을 우클릭 하고 Open Value in Viewer를 선택하면 Edit Data for Create Function (VARCHAR) 창의 Text탭에서 작성했던 스토어드 함수의 코드를 확인할 수 있다.

커서

커서는 기본적으로 가리킨다고 보면 된다.

먼저 커서를 선언하고

반복한 조건을 선언을 해야 한다.

그리고 데이터를 가져오고 데이터를 처리한다.

그리고 반드시 커서를 닫아야 한다.

사용할 변수 선언

변수 선언에도 DEFAULT 명령어를 통해서 초기값을 설정할 수 있다.

또한 행의 끝을 파악하기 위해서 endOfRow 변수를 준비했다. 

커서 선언하기

다음과 같이 DECLARE memberCuror CURSOR FOR SELECT mem_number FROM member; 명령어로 커서를 선언할 수 있다.

그리고 DECLARE CONTINUE HANDLER FOR NOT FOUND SET endOfRow = TRUE; 명령어를 통해서

더 이상 행이 없으면 endOfRow를 TRUE로 바꾸는 것이다.

커서 열기

행 반복하기

cursor_loop: LOOP

이 부분을 반복

END LOOP cursor_loop

를 통해서 반복이 가능하다.

무한반복을 피하기 위해서 LEAVE 명령어를 사용하여 반복문을 탈출할 수 있다.

그래서 IF 명령어를 통해서

IF endOfRow THEN

    LEAVE cursor_loop;

END IF;

이렇게 cursor_loop 를 탈출할 수 있다.

행의 하나 하나를 처리하기 위한 기능이다.

FETCH

FETCH 명령어를 통해서 하나씩 행을 데이터 처리가 가능하다.

다음은 실습한 코드이다.

커서는 역시 스토어드 프로시저에서 사용을 하는 것이다.

형식이 고정되어 있으므로 이와 같은 형식으로 코드를 사용하는 것이 바람직하다.

결과로 각 회원의 평균 인원수를 조회를 하였고, 그 결괏값은 6.6000이다.

다음과 같이 프로시저 내부에 변수들을 저장한 것을 볼 수 있다.

그리고 다음과 같이 CURSOR를 선언한 것을 볼 수 있다.

그리고 CONTINUE HANDLER 를 만들어서

FOR NOT FOUND SET endOfRow = TRUE; 를 하도록 하는 것을 볼 수 있다.

그리고 CURSOR를 OPEN하는 것을 볼 수 있다.

커서 내부의 반복문은 다음과 같은 형식으로 작성이 되었다.

IF 문을 통해서 행이 마지막인지 체크하는 것을 볼 수 있다.

마지막이  아니라면 읽은 행의 갯수를 count 하고 

회원의 수를 계속 count 하는 것을 볼 수 있다.

END LOOP 명령어를 통해서 cursor loop문을 그 사이에 선언할 수 있다.

모든 행을 읽으면 다음과 같이 SELECT문을 사용하여 '회원의 평균 인원 수'를 조회하는 것을 볼 수 있다.

그리고 CLOSE 명령어를 통해서 커서를 닫고

스토어드 프로시저 선언을 종료하는 것을 볼 수 있다.

그리고 해당 스토어드 프로시저를 CALL로 호출을 하면

다음과 같이 스토어드 프로시저의 목적인 

회원의 평균 인원 수를 조회한 것을 볼 수 있다.

 

감사합니다.

https://www.youtube.com/watch?v=bMQ_dAoaMzA&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=20

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료를 남깁니다.

 

스토어드 프로시저란

스토어드 프로시저 기본

DELIMITER $$

END $$

DELIMITER ;

이렇게 프로시저를 구분을 한다. (##, %%, &&, //) 등을 사용을 하여도 무방하다.

CREATE PROCEDURE [스토어드 프로시저 이름]( IN 또는 OUT 매개변수) 부터 END$$ 까지 

SQL 프로그래밍 코드를 작성할 수 있다.

스토어드 프로시저 이름은 우리가 정할 수 있다.

 

스토어드 프로시저를 만든 것을 커피 자판기를 만든 것으로 볼 수 있다.

실제 실행을 하려면 CALL [스토어드 프로시저 이름](); 명령어를 실행하여

프로시저를 호출할 수 있다. 커피 자판기에서 커피를 뽑는 것이다. 그러면 커피 자판기에서 커피를 뽑는 작동을 한다.

 

스토어드 프로시저를 만들어보았다.

그리고 CALL 명령어를 통해서 실행을 해보았다.

필요할 때마다 실행을 하면 SQL 프로그래밍 언어 코드가 실행이 된다.

프로시저 삭제

DROP PROCEDURE 명령어를 통해서

스토어드 프로시저 삭제가 가능하다.

입력 매개변수

입력 매개변수를 통해서 스토어드 프로시저에 전달할 수 있다.

커피자판기에 500원짜리 동전을 넣는 것과 동일하다.

IN [입력 매개 변수 이름] [데이터 형식]

명령어를 통해서 입력 매개변수를 지정할 수 있다.

그리고 CALL [프로시저 이름]([전달 값]); 명령어를 통해서

스토어드 프로시저에 입력 매개변수를 전달할 수 있다.

출력 매개 변수

실행한 스토어드 프로시저의 결과를 돌려 받을 매개변수가 바로

출력 매개변수이다.

OUT [출력 매개변수 이름] [데이터 형식];

CALL [프로시저 이름](@변수명)

SELECT @변수명; 명령어를 통해서 눈으로 변수에 담긴 값을 확인이 가능하다.

입력 변수 실습

IN 명령어를 통해서 입력 매개변수와 데이터 형식 지정이 가능하다.

그리고 SELECT * FROM member WHERE mem_name = userName; 을 통해서

입력 매개변수를 SQL 프로그래밍 코드에서 활용이 가능하다.

스토어드 프로시저를 실행하고 입력 매개변수를 전달하기 위해서는

CALL user_proc1('에이핑크'); 이렇게 '에이핑크' 문자를 넣어주면 입력 매개변수를 저장하고 스토어드 프로시저에서 활용이 가능하며 그에 대한 결과가 조회된다.

입력 매개변수는 여러개 선언이 가능하다.

콤마를 통해서 구분이 가능하다.

CALL user_proc2(6, 165); 이렇게 두 개의 INT 매개변수 두개를 전달하고

그에 대한 결과를 조회하는 것을 볼 수 있다.

이번에는 입력 매개변수와 출력 매개변수가 있는 스토어드 프로시저를 만들어 보았다.

INSERT 문을 통해 noTable에 데이터를 입력하는 것을 볼 수 있다.

그리고 SELECT INTO를 통해서 조회한 최대 아이디 값을 outValue라는 출력 매개변수에 저장하는 것을 볼 수 있다.

스토어드 프로시저 생성을 완료하고, 

DESC noTable; 을 실행을 했는데 noTable이 조회가 되지 않는다.

스토어드 프로시저를 생성하는 시점에서는 선언하는 것이므로 문제가 되지 않는다.

하지만 실행을 하면 오류가 발생을 하는 것을 볼 수 있다.

DESC 또는 DESCRIBE 명령어를 통해서 테이블의 정보를 확인이 가능하다.

그래서 noTable을 만들고 다시 user_proc3 스토어드 프로시저를 호출하였다.

그리고 출력 매개변수를 조회를 해보면 다음과 같이 정상적으로 나오는 것을 볼 수 있다.

이번에는 IF 및 ELSE 문이 담긴 스토어드 프로시저를 생성해보았다.

YEAR() 함수를 통해서 연도만 출력을 한 것을 확인할 수 있다.

정상적으로 결과가 조회되는 것을 확인할 수 있다.

추가적으로 YEAR(), MONTH(), DAY()를 통해서 연도, 월, 날을 구할 수 있다.

또한 CURDATE() 함수를 통해서 현재 날짜 (연도-월-일)의 형식으로 구할 수 있다.

다음은 1부터 100까지의 합계를 출력하는 스토어드 프로시저를 생성했다.

WHILE문을 통해서 작성을 했다.

다음과 같이 결과과 조회되는 것을 볼 수 있다.

다음은 동적으로 SQL 프로그래밍을 한 스토어드 프로시저를 생성해보았다.

조회하는 테이블의 명이 동적으로 변경해서 조회할 수 있는 스토어드 프로시저를 생성한 것을 볼 수 있다.

결과가 잘 조회되는 것을 볼 수 있다.

 

감사합니다.

https://www.youtube.com/watch?v=cw1wGN0ZdFA&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=19

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료를 남깁니다.

 

인덱스의 생성과 제거

인덱스 생성

CREATE INDEX [인덱스 이름]

CREATE UNIQUE INDEX [인덱스 이름]

이렇게 두 가지로 분류가 된다.

CREATE UNIQUE INDEX로 만들어진 INDEX를 갖은 테이블은

INSERT 시 중복이 허용이 되지 않는다.

인덱스 제거 문법

인덱스를 제거하는 문법은 DROP INDEX [인덱스 이름] ON [테이블 이름]

입니다.

주의할 점은 자동 생성된 INDEX들은 DROP INDEX로 제거하지 못한다는 점입니다.

자동 생성된 인덱스들은 ALTER TABLE문으로 기본 키나 고유 키를 제거하여, 자동 생성된 인덱스를 제거할 수 있습니다.

SHOW INDEX FROM

SHOW INDEX FROM member; 명령어로

member 테이블의 mem_id에 자동 클러스터형 인덱스로, PRIMARY KEY가 생성되어 있는 것을 볼 수 있습니다.

인덱스 목록 확인이 가능하다.

테이블의 인덱스 정보 보기 (SHOW TABLE STATUS LIKE)

SHOW TABLE STATUS LIKE 'member';

명령어를 통해서 인덱스의 세부 정보를 볼 수 있다.

다음과 같이 Rows, Avg_row_length, Data_length 등 페이지의 크기나 생성일자 등 세부정보를 볼 수 있다.

Data_length를 보면 16384인데, 16KB를 의미한다.

한 페이지가 16KB로 되어있다. 실제로는 엄청나게 많은 양이다. 한 페이지짜리 책이라고 보면 된다.

Index_length는 책 뒤의 찾아보기이다. 보조 인덱스의 크기를 의미한다.

현재 보조 인덱스가 만들어져있지 않기 때문에 0이라고 표현이 되어있다.

보조 인덱스 추가

주소 열에 INDEX를 만들겠다.

단순 INDEX를 생성했다.

SHOW INDEX FROM member;를 하면 

인덱스의 세부 정보를 확인할 수 있다.

member 테이블의 addr 컬럼에

idx_member_addr라는 이름의 인덱스가 생성된 것을 확인할 수 있다.

Non_unique에 1(True)이 되어 있는 것을 볼 수 있다.

중복이 허용되는 단순 INDEX이다.

인덱스 적용

SHOW TABLE STATUS LIKE 'member'; 명령어를 통해서 인덱스의 세부정보를 확인한다.

또한 ANALYZE TABLE member; 명령어를 통해서

member 테이블에 지금까지 만들어진 인덱스를 적용한다.

그 결과로, Index_length의 값이 기존에는 0이었는데, Index_length의 값이 16384(16KB) 즉 한 페이지가 만들어진 것을 볼 수가 있다. 

인덱스 적용이 성공한 것을 볼 수 있다.

지금은 소규모 데이터량이어서 괜찮지만

예를 들어 데이터의 양이 100만건을 넘어가면 

Data_length, Index_length의 값이 커진다.

CREATE UNIQUE INDEX

member 테이블의 회원명으로 UNIQUE INDEX를 만들면

다음과 같이 오류가 발생하는 것을 볼 수 있다.

mem_number의 컬럼에 중복된 값이 있기 때문이다.

UNIQUE를 제거한다면 만들 수 있다.

회원명으로 UNIQUE INDEX를 만들었다.

성공한 것을 확인할 수 있다.

하지만 회원명은 언제든지 겹칠 수 있으므로

위험한 것이다.

SHOW INDEX FROM member; 명령어를 통해서

member 테이블에 지금까지 만든 INDEX 생성이 성공한 것을 볼 수 있다.

하지만

더 이상 같은 회원 이름은 회원가입이 불가능하다.

말이 안되는 이야기다.

mem_name에 진짜로 중복이 안 되냐 이런 경우에만 UNIQUE를 만들 수 있다.

예를 들어 email, 주민등록번호는 UNIQUE 인덱스를 만들어도 무방하다.

다시 지금까지 만든 인덱스를 적용시킨다.

member 테이블에 INDEX가 정상적으로 3개가 만들어진 것을 볼 수 있다.

하지만 INDEX를 만드는 것보다 더 중요한 것은 INDEX를 사용하는 것이다.

Full Table Scan

인덱스를 생성하여도 SELECT * FROM member; 명령어를 실행하면

모든 열을 조회하는 것이기 때문에 인덱스를 찾아볼 필요가 없다.

그래서 Full Table Scan을 한 것이다.

인덱스를 사용하지 않고, 전체 테이블을 뒤진 것이다.

이외에는 인덱스를 사용한다고 볼 수 있다.

이번에는 mem_id, mem_name, addr을 member 테이블에서 조회를 하였다.

그리고 Execution Plan을 확인을 하였는데

또 다시, Full Table Scan을 한 것을 볼 수 있다.

인덱스가 있음에도 불구하고 Full Table Scan을 한 것이다.

WHERE 절에 나와야만 인덱스를 사용한다.

에이핑크를 조회를 하니 

Single Row (constant)를 사용해서 데이터를 조회한 것을 확인할 수 있다.

mem_name 열의 인덱스를 만들고

WHERE 절에 mem_name을 사용을 하면

인덱스를 사용을 한다.

지금은 데이터가 10건이어서 표시가 안 나지만

만약에 데이터가 100만건, 1,000만건이었다면 엄청나게 빠른 조회결과가 된다.

실제 WHERE절에 열이름이 나와야 인덱스를 쓴다는 것을 확인하면 좋다.

이번에는 mem_number에 인덱스를 만들고

ANALYZE TABLE member; 명령어를 통해서 인덱스를 적용을 하였다.

그리고 mem_number >= 7 인 회원을 조회를 하면

Executin Plan에서 확인 시 다음과 같이

Index Range Scan을 사용한 것을 볼 수 있다.

이번에는 mem_number >= 1인 결과를 조회하고 Execution Plan을 확인해보았다.

이번에는 다르게 Full Table Scan을 한 것을 볼 수 있다.

7이상인 데이터는 몇 건 없기 때문에 MySQL이 알아서 인덱스를 쓰는게 더 효과적이겠네해서 인덱스를 사용을 한 것이다.

1이상은 인덱스를 찾아봤자 더 비효율적일 것 같에 해서 Full Table Scan을 한 것이다.

MySQL이 알아서 판단을 한 것이다.

이번에는 mem_number*2 >= 14이면

mem_number >= 7 과 같으므로 인덱스가 사용이 되어야 하지만 Full Table Scan을 한 것을 볼 수 있다.

인덱스를 사용을 하려면 인덱스를 사용하는 컬럼을 아얘 가공을 해서는 안된다.

그러면 다음과 같은 방법으로 조회가 가능하다.

Index Range Scan을 사용한 것을 볼 수 있다.

인덱스를 갖은 컬럼을 가공하지 말고

비교하는 대상이 되는 데이터를 가공을 하는 것이다.

조금 복잡하긴 하지만, 인덱스 조회를 성공한 것을 확인할 수 있다.

결과는 똑같다. 하지만 인덱스를 사용하는 것이 훨씬 효율적이다.

DROP INDEX [인덱스 명] ON [테이블 명];

DROP INDEX 명령어를 통해서 3개의 인덱스를 모두 제거한 것을 확인할 수 있다.

ALTER TABLE member DROP PRIMARY KEY; 를 통해서 PRIMARY KEY를 지우려고 했는데

오류가 발생한다.

member 테이블을 buy 테이블이 참조하고 있기 때문이다.

information_schema.referential_constraints

다음과 같은 명령어를 통해서 market_db의 외래키 정보를 조회할 수 있다.

TABLE_NAME과 CONSTRAINT_NAME을 알아볼 수 있다.

buy 테이블을 통해서 buy_ibfk_1의 이름의 제약조건이 있는 것을 확인할 수 있다.

이 이름을 통해서 buy 테이블의 외래키를 제거가 가능하다.

ALTER TABLE buy DROP FOREIGN KEY buy_ibfk_1; 명령어를 통해서

buy 테이블의 외래키를 삭제했다.

그리고 

ALTER TABLE member DROP PRIMARY KEY; 명령어를 통해서

member 테이블의 기본키를 삭제를 했다.

 

감사합니다.

https://www.youtube.com/watch?v=aiMSluMNzI8&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=18

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 혼자 공부하는 SQL를 보고 학습한 자료를 남깁니다.

 

트리구조

인덱스의 내부 작동 원리

노드는 데이터가 저장되는 공간들이다.

루트와 리프노드(잎사귀)가 달려있다 이렇게 보면 된다.

이 노드를 MySQL에서는 페이지라고 부른다.

한 페이지에 그림에서는 4개의 데이터를 저장할 수 있는 것이다.

리프 페이지 - Full Table Scan

3페이지짜리 책인데, 찾아보기가 없다는 것이다.

그래서 첫 페이지를 다 찾아봐요, 그리고 두 번째 페이지를 다 찾아봐요. 이렇게 8번만에 MMM이라는 데이터를 찾아낸 것이다.

중요한 것은 몇 페이지를 읽었냐는 것이다.

인덱스가 없이 생성된 테이블에서 MMM을 조회 시 3페이지를 읽게 된다.

이를 전체 테이블 검색(Full Table Scan)을 했다고 한다.

이것이 굉장히 안 좋은 것이다.

만약 1,000만 페이지짜리 책이다. 그러면 한 건의 데이터를 찾기 위해서 1,000만건의 데이터를 뒤졌다.

엄청나게 오래 걸리는 작업이다.

예를 들어 카카오톡은 이용자수가 5,000만명이 넘는다.

그런데 대부분의 사람들이 동시에 접속을 할텐데 

그러면 각 사용자가 5,000만건의 데이터를 찾는 일이 어마어마하게 시간이 걸리게 된다.

루트 페이지

그래서 루트 페이지를 추가를 하면

새로운 데이터를 추가하는 것은 아니다.

루트 페이지에 각각의 페이지의 맨 위의 것들만 가져오는 것이다.

이 상태에서 다시 MMM을 찾으면

무조건 먼저 루트 페이지를 찾게 된다. 

루트 페이지에 있는 데이터는 진짜 데이터가 아니라 찾아보기 데이터이다.

그래서 LLL을 찾고, 어디에 MMM이 있을지 예측을 하게 된다.

그래서 3페이지에서 찾아서 MMM을 찾은 것이다.

결국 1페이지만에 MMM을 찾게 된 것이다.

인덱스가 없었을 때는 3페이지가 걸렸다.

적은 건수만 찾아서도 데이터를 찾아냈다.

데이터를 찾는 결과는 똑같다. 결과가 바뀌는 것은 아니지만 빠르게 찾느냐 느리게 찾느냐 그 차이만 기억하면 된다.

균형 트리의 페이지 분할

결론은 SELECT는 빨라져요. 그러나 INSERT, UPDATE, DELETE 작업 시 느려질 수 있다.

그 이유가 '페이지 분할' 때문이다.

현재 그림은 인덱스가 만들어진 상태다.

INSERT로 III 데이터를 입력 시 

JJJ 데이터를 아래로 한칸 내리고

그 위에 III 데이터를 INSERT를 시킨 것이다.

하지만 크게 문제가 되는 것은 아니다.

왜냐 하면 리프 페이지에 한칸의 빈 공간이 있었기 때문이다.

하지만,

이번에는 GGG 라는 데이터를 입력해보겠다.

먼저 루트 페이지에 GGG라는 데이터가 입력되었다. 한칸의 여유가 있었기 때문에 순서에 맞게 데이터를 이동 시키고 입력 시키는 작업을 통해 입력되었다.

리프 페이지에서는 페이지 분할이 이루어져서 

새로운 리프 페이지가 만들어지고, GGG라는 데이터가 입력되었다.

원래는 3페이지였는데 변경되어서 총 4페이지가 만들어졌다.

이게 느려지는 작동이에요.

이번에는 더 느려지는 현상을 알아보겠다.

PPP, QQQ 데이터를 입력해보겠다.

루트 페이지에 공간이 가득 찼으므로 분할이 이루어져야 한다.

그래서 루트 페이지의 분할이 이루어져서

또 새로운 루트 페이지가 만들어지고

중간 페이지로 분할이 일어나는 것이다.

언제는 똑같이 한 건을 입력을 했는데 금방 되고, 언제는 엄청나게 오래 걸리는 경우가 발생을 한다.

페이지 분할이 여러 건 발생하는 현상이 있다.

INSERT 시 느려지는 경우를 개념적으로 알아보았다. 이유는 페이지 분할 때문이다.

인덱스의 구조

클러스터형 인덱스와 보조 인덱스 둘 다 SELECT 시 빠르다.

이번에는 두 인덱스의 종류 중 어떤 인덱스가 빠른지 알아보겠다.

클러스터형 인덱스의 속도

먼저 인덱스 없이 10건의 데이터를 INSERT 해보겠다.

 

그러면 다음과 같이 페이지로 구분 되어서 순서대로 데이터가 입력된 것을 볼 수 있다.

이 상태에서 클러스터형 인덱스를 지정해보겠다.

이번에는 클러스터형 인덱스를 생성하고 다시 SELECT를 해보겠다.

mem_id로 순서가 정렬되어서 데이터가 조회되는 것을 볼 수 있다.

내부 구조는 다음과 같다.

루트 페이지가 만들어진다.

그리고 리프 페이지(=데이터 페이지) 별로 가장 첫 번째 데이터가 루트 페이지에 저장이 된다.

보조 인덱스의 속도

보조 인덱스를 같이 알아보겠다.

table second를 생성해서 데이터를 마구잡이로 입력을 하고 

mem_id에 UNIQUE를 제약조건으로 추가하고

조회를 한 결과이다.

순서에는 그리고 내용에는 전혀 변함이 없다.

내부 구조를 살펴보겠다.

책 뒤에 찾아보기가 따로 만들어진 것을 볼 수가 있다.

인덱스 페이지가 만들어지고 

리프페이지에 실제 데이터 페이지의 데이터의 위치를 #을 통해서 담고 있는 것을 볼 수 있다.

이렇게 데이터는 그대로 있고, 찾아보기가 만들어진다.

두 인덱스의 비교

1) 클러스터형 인덱스로 SELECT 시 데이터를 찾는 방법

SPC 데이터를 찾아보겠다.

클러스터형 인덱스는 내용 자체도 인덱스라고 생각하면 된다. 전체가 인덱스다.

클러스터형 인덱스로 SPC를 찾는데 몇 페이지를 읽었는가

루프 페이지 그리고 1001페이지, 이렇게 총 2개의 페이지를 읽어서 데이터를 찾은 것을 볼 수 있다.

2) 보조 인덱스로 SELECT 시 데이터를 찾는 방법

총 3개의 페이지를 읽고 SPC 데이터를 찾은 것을 볼 수 있다.

 

결론적으로, SPC 데이터를 찾았다는 결과는 똑같다. 하지만 읽은 페이지 수를 보면 

클러스터형 인덱스가 조금 더 효율적이다 라고 볼 수 있다.

 

실무에서는 300만 페이지일 수도 있다.

그런데 인덱스를 통해서 20만 페이지로 데이터를 찾아냈다.

이렇게 데이터를 효율적으로 찾아야 한다.

 

감사합니다.

https://www.youtube.com/watch?v=vWTDuoSG-YQ&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=17

 

728x90
반응형
LIST

+ Recent posts