https://youtu.be/aiMSluMNzI8


USE market_db;
SELECT * FROM member;
SHOW INDEX FROM member; 
SHOW TABLE STATUS LIKE 'member';
(인덱스 하나도 없는 상태 확인.)
 
<인덱스 생성>
 
1) 인덱스 생성

CREATE INDEX idx_member_addr
ON member (addr);
    
SHOW INDEX FROM member;

SHOW TABLE STATUS LIKE 'member';
인덱스 만들고 다시 실행했는데 인덱스 정보가 안 보임.

---->
ANALYZE TABLE member;  
이걸 해야 인덱스가 적용된다.

SHOW TABLE STATUS LIKE 'member';
인덱스 생긴 거 확인 가능.
 
 
 
2) 유니크  인덱스 생성
 
CREATE UNIQUE INDEX idx_member_mem_name
ON member (mem_name);
유니크 인덱스는 중복값이 없어야 한다.

SHOW INDEX FROM member;

INSERT INTO member VALUES('MOO', '마마무', 2, '태국', '001', '12341234', 155, '2020.10.10');
ANALYZE TABLE member;
멤버 이름이 같은 데이터_ 유니크 인덱스가 있어서 삽입 불가능.
 
 
 
3) 인덱스 사용해서 검색

SELECT mem_id, mem_name, addr
FROM member
        WHERE mem_name = '에이핑크';
인덱스 사용해서 검색했음. 인덱스는 where절, 열 이름이 나와야 쓸 수 있음.


4) 인덱스를 사용하려면, WHERE 절에 뒤에 쓰는 열에 아무 가공을 하면 안된다.  
 
CREATE INDEX idx_member_mem_number
ON member (mem_number);
ANALYZE TABLE member;

SELECT mem_name, mem_number
FROM member
    WHERE mem_number >= 7;
    인덱스가 있든 없든 결과는 동일하게 나옴.
    execution plan 에 들어가서 결과 나오는 과정을 보면 
    index range scan --> query block #1 이런 식의 과정이 확인 됨.
   
SELECT mem_name, mem_number
FROM member
    WHERE mem_number >= 1;
    결과값으로 테이블의 모든 행이 출력됨.
    이 경우 execution plan 보면 인덱스 사용하지 않음. 
    어떤 방식이 더 효과적인지 자동으로 계산을 하는 것. 
   
SELECT mem_name, mem_number
FROM member
        WHERE mem_number*2 >= 14;
멤버 수가 7 이상인 거랑 똑같은 결과가 나오지만, 인덱스를 사용하지 않음.
 
SELECT mem_name, mem_number
FROM member
        WHERE mem_number >= 14/2;
        
이렇게 2를 뒤로 넘기면 인덱스 사용한다. 
--> WHERE절에 가공을 하지 않으면 더 효율적으로 정보를 불러올 수 있다.
 
 

5) 인덱스 제거

DROP INDEX idx_member_mem_name ON member;
DROP INDEX idx_member_addr ON member;
DROP INDEX idx_member_mem_number ON member;

 ALTER TABLE member
DROP PRIMARY KEY;
이건 PK, FK로 지금 buy 테이블과 연결되어 있기 때문에 안 지워짐.

SELECT table_name, constraint_name
 FROM information_schema.referential_constraints
     WHERE constraint_schema = 'market_db' ;
market_db의 외래키 이름 확인하는 구문. 

ALTER TABLE buy
DROP FOREIGN KEY buy_ibfk_1;
    
ALTER TABLE member
DROP PRIMARY KEY;
    
FK먼저 지우고 다시 mem 테이블의 PK 지우기 --> 잘 지워짐.

+ Recent posts