인덱스 (MySQL INDEX)

이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
잔재미코딩 소식 공유
좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 사이트와, 다음 두 채널도 오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
●  잔재미코딩 뉴스레터 오픈 [구독해보기]
●  잔재미코딩 유투브 오픈 [구독해보기]

5. 인덱스 (MySQL INDEX)

  • 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조
  • 인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작음
    • 인덱스는 키-필드만 갖고 있고, 나머지 세부 테이블 컬럼 정보는 가지고 있지 않기 때문
  • 어떤 데이터를 인덱스로 만드느냐에 따라 방대한 데이터의 경우 성능에 큰 영향을 미칠 수 있음

5.1. 인덱스 종류

  • 클러스터형 인덱스: 영어 사전과 같은 형태로 이해하면 됨 (데이터가 순서대로 정렬됨)
    • 테이블에 PRIMARY KEY 로 정의한 컬럼이 있을 경우, 자동 생성 (즉, 테이블당 하나)
  • 보조 인덱스: 일반 책 뒤에 있는 <찾아보기> 와 같은 형태로 이해하면 됨
In [ ]:
db.close()
In [ ]:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import pymysql
In [ ]:
host_name = "funcoding-db.ca1fydhpobsc.ap-northeast-2.rds.amazonaws.com"
username = "davelee"
password = "korea234"
database_name = "sqlDB"    # 데이터베이스 이름을 sakila 로 바꿔줘야 합니다.
본 자료 보다 업데이트된 자료와 함께 온라인 강의로 익히면 체계적으로 이해할 수 있습니다!
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요
In [ ]:
db = pymysql.connect(
    host=host_name,  # DATABASE_HOST
    port=3306,
    user=username,  # DATABASE_USERNAME
    passwd=password,  # DATABASE_PASSWORD
    db=database_name,  # DATABASE_NAME
    charset='utf8'
)

userTbl 테이블 구조

In [ ]:
CREATE TABLE userTbl (
    userID CHAR(8) NOT NULL PRIMARY KEY,
    name  VARCHAR(10) NOT NULL,
    birthYear INT NOT NULL,
    addr  CHAR(2) NOT NULL,
    mobile1 CHAR(3),
    mobile2 CHAR(8),
    height SMALLINT,
    mDate  DATE
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
In [ ]:
SQL = "DESC userTbl"
df = pd.read_sql(SQL, db)
df
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
  • Key_name 이 PRIMARY 로 된 것은 클러스터형 인덱스를 의미
  • Column_name 이 userID 임을 확인할 수 있음
  • (참고) 주요 인덱스 컬럼
    • Table: The name of the table.
    • Non_unique: 0 if the index cannot contain duplicates, 1 if it can.
    • Key_name: The name of the index. If the index is the primary key, the name is always PRIMARY.
    • Seq_in_index: The column sequence number in the index, starting with 1.
    • Column_name: The column name.
    • Collation: How the column is sorted in the index. This can have values A (ascending) or NULL (not sorted).
    • Cardinality: An estimate of the number of unique values in the index.
    • Index_type: The index method used (BTREE, FULLTEXT, HASH, RTREE).

buyTbl 테이블 구조

In [ ]:
CREATE TABLE buyTbl (
    num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    userID CHAR(8) NOT NULL,
    prodName CHAR(4),
    groupName CHAR(4),
    price  INT NOT NULL,
    amount  SMALLINT NOT NULL,
    FOREIGN KEY (userID) REFERENCES userTbl(userID)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
In [ ]:
SQL = "DESC buyTbl"
df = pd.read_sql(SQL, db)
df
In [ ]:
SQL = "SHOW INDEX FROM buyTbl"
df = pd.read_sql(SQL, db)
df
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
  • Key_name 이 PRIMARY 가 아닌 것은 보조 인덱스를 의미
  • foreign key로 설정된 컬럼이 인덱스가 없다면, 인덱스를 자동 생성
In [ ]:
cursor = db.cursor()
cursor.execute("set names utf8")
db.commit()
In [ ]:
SQL_QUERY = "ALTER TABLE userTbl ADD CONSTRAINT TESTDate UNIQUE(mDate);"
cursor.execute(SQL_QUERY)
db.commit()
  • ALERT TABLE 테이블이름 ADD CONSTRAINT 제약조건명 UNIQUE(컬럼명)
    • 테이블에 특정 컬럼에 duplicate 값이 나오지 않도록 제약조건을 추가하기

UNIQUE 제약을 넣으면, 보조 테이블이 만들어짐

본 자료 보다 업데이트된 자료와 함께 온라인 강의로 익히면 체계적으로 이해할 수 있습니다!
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df

5.2. 인덱스 생성 및 삭제

  • 인덱스를 필요에 따라 생성/삭제 가능

5.2.1. 생성된 테이블에 인덱스 추가하기

  • 기본 문법
    • CREATE INDEX 인덱스명 ON 테이블명 ( column 1, column 2, ... );
    • ALTER TABLE 테이블명 ADD INDEX 인덱스명 ( column 1, column 2, ... );
  • 생성된 테이블에 인덱스 추가 예제 (CREATE INDEX 사용)
In [ ]:
SQL_QUERY = "CREATE INDEX idx_name ON userTbl (name);"
cursor.execute(SQL_QUERY)
db.commit()
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
  • 인덱스 확인
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df
  • 생성된 테이블에 인덱스 추가 예제 (ALTER TABLE 사용)
In [ ]:
SQL_QUERY = "ALTER TABLE userTbl ADD INDEX idx_addr (addr)"
cursor.execute(SQL_QUERY)
db.commit()
  • 인덱스 확인
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df

1) groupName 으로 인덱스 추가하고 확인해보기 (실습)

In [ ]:
SQL_QUERY = "CREATE INDEX idx_groupName ON buyTbl (groupName);"
cursor.execute(SQL_QUERY)
db.commit()

2) prodName 으로 인덱스 추가하고 확인해보기 (실습)

In [ ]:
SQL_QUERY = "ALTER TABLE buyTbl ADD INDEX idx_prodName (prodName)"
cursor.execute(SQL_QUERY)
db.commit()
본 자료 보다 업데이트된 자료와 함께 온라인 강의로 익히면 체계적으로 이해할 수 있습니다!
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요
In [ ]:
SQL = "SHOW INDEX FROM buyTbl"
df = pd.read_sql(SQL, db)
df

5.2.2. 테이블 생성하며 인덱스도 함께 만들기

  • 기본 문법
    • INDEX <인덱스명> ( 컬럼명1, 컬럼명2 )
    • UNIQUE INDEX <인덱스명> ( 컬럼명 ) --> 항상 유일해야 함.
      • UNIQUE INDEX 의 경우 컬럼명은 유일한 값을 가지고 있어야 함
In [ ]:
db.close()
In [ ]:
host_name = "funcoding-db.ca1fydhpobsc.ap-northeast-2.rds.amazonaws.com"
username = "davelee"
password = "korea234"
database_name = "sqlDB"    # 데이터베이스 이름을 sakila 로 바꿔줘야 합니다.
In [ ]:
db = pymysql.connect(
    host=host_name,  # DATABASE_HOST
    port=3306,
    user=username,  # DATABASE_USERNAME
    passwd=password,  # DATABASE_PASSWORD
    db=database_name,  # DATABASE_NAME
    charset='utf8'
)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
In [ ]:
cursor = db.cursor()
cursor.execute("set names utf8")
db.commit()
In [ ]:
SQL_QUERY = """
DROP DATABASE IF EXISTS sqlDB;
CREATE DATABASE sqlDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

USE sqlDB;
DROP TABLE IF EXISTS userTbl;
CREATE TABLE userTbl (
    userID CHAR(8) NOT NULL PRIMARY KEY,
    name VARCHAR(10) UNIQUE NOT NULL,
    birthYear INT NOT NULL,
    addr CHAR(2) NOT NULL,
    mobile1 CHAR(3),
    mobile2 CHAR(8),
    height SMALLINT,
    mDate  DATE,
    UNIQUE INDEX idx_userTbl_name (name),
    INDEX idx_userTbl_addr (addr)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DROP TABLE IF EXISTS buyTbl;
CREATE TABLE buyTbl (
    num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    userID CHAR(8) NOT NULL,
    prodName CHAR(4),
    groupName CHAR(4),
    price  INT NOT NULL,
    amount  SMALLINT NOT NULL
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO userTbl VALUES('LSG', '이승기', 1987, '서울', '011', '11111111', 182, '2008-8-8');
INSERT INTO buyTbl (userID, prodName, groupName, price, amount) VALUES('KBS', '운동화', '의류', 30, 2);
"""
In [ ]:
cursor.execute(SQL_QUERY)
db.commit()
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df
  • UNIQUE INDEX idx_uerTbl_name (name) : name 컬럼에 대해 idx_userTbl_name 이름으로 인덱스 생성, name 은 UNIQUE 제약조건 필요
  • INDEX idx_userTbl_addr (addr) : addr 컬럼에 대해 idx_userTbl_addr 이름으로 인덱스 생성
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다

5.2.3. 인덱스 삭제

  • 기본 문법
    • ALTER TABLE 테이블명 DROP INDEX 인덱스명
  • idx_userTbl_name 인덱스 삭제
In [ ]:
SQL_QUERY = "ALTER TABLE userTbl DROP INDEX idx_userTbl_name"
cursor.execute(SQL_QUERY)
db.commit()
  • 인덱스 확인
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df
본 자료 보다 업데이트된 자료와 함께 온라인 강의로 익히면 체계적으로 이해할 수 있습니다!
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요
  • idx_userTbl_addr 인덱스 삭제
In [ ]:
SQL_QUERY = "ALTER TABLE userTbl DROP INDEX idx_userTbl_addr"
cursor.execute(SQL_QUERY)
db.commit()
  • 인덱스 확인
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df

3) PRIMARY KEY 놔두고 모든 인덱스 삭제하기 (실습)

본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
In [ ]:
SQL_QUERY = ""
cursor.execute(SQL_QUERY)
db.commit()
In [ ]:
SQL = "SHOW INDEX FROM userTbl"
df = pd.read_sql(SQL, db)
df