본문 바로가기

SQL/MYSQL

MySQL INDEX 인덱스, View 뷰, MySQL 계정 비밀번호 변경




MySQL INDEX 인덱스


1. 인덱스 책의 맨 앞에 목차를 인덱스라고 합니다 테이블에 여러 데이터들이 무작위로 섞여 있으면 조회를 하는데 시간이 오래걸리게 됩니다. 이 때 인덱스를 이용하면 검색 속도를 향상시킬 수 있습니다. 검색 알고리즘의 자료구조로 이진트리(또는 해시)를 사용하기 때문입니다. 그런데 이진트리를 사용하기 위해서는 데이터가 미리 정렬되어 있어야 합니다. 테이블 내에서 데이터가 항상 정렬되어 있기란 어렵기 때문에 어떤 열의 값들을 기준으로 이진트리를 만들어 새로운 테이블인 인덱스 테이블을 만듭니다. 그 결과 원하는 데이터를 빠르게 찾을 수가 있습니다. 또한 인덱스로 설정된 값들은 중복되지 않고 유일합니다. 인덱스는 테이블과 같은 데이터베이스 객체입니다. 그러나 인덱스만 갖고는 아무런 기능을 할 수 없기 때문에 다른 테이블에 의존적입니다. ex) 인덱스 테이블 생성 CREATE INDEX products_index ON products(no); produts_index라는 인덱스 테이블을 생성하는데, 이 인덱스 테이블은 products 테이블의 no열을 데이터로 갖습니다. 인덱스 테이블은 의존하는 테이블의 PK로 생성하는 것이 좋습니다. 또한 MySQL에서는 어떤 칼럼을 PK로 설정하면 그 열에 대한 인덱스 테이블을 만들어 놓습니다. 인덱스의 단점 1) 자원 인덱스와 관련해서 주의할 점은 인덱스 테이블을 생성하면 검색 속도가 향상되지만, 메모리를 많이 소비하게 되므로 남용하지 않는 것이 좋습니다. 2) SELECT 성능은 상승하지만 INSERT, UPDATE, DELETE에 대한 성능은 저하 또한 products 테이블에 데이터를 추가할 경우 prodcits_index 테이블에서 방금 추가한 데이터를 정렬하느라 성능이 떨어집니다. 위의 예제에서는 일반적으로 no가 1씩 증가하기 때문에 관련이 없을 수 있지만, 다른 열을 인덱스로 만들 경우 삽입에 대한 성능이 떨어질 수 있습니다. ex) 인덱스 테이블 삭제 DROP INDEX products_index ON products; DROP INDEX 명령어는 인덱스 테이블을 삭제합니다. 일반 table을 삭제하는 명령어는 DROP TABLE이였습니다. DROP TABLE을 명령 할 때는 그 테이블과 관련된 index table도 같이 사라지게 되므로 주의해야 합니다. ex) SELECT * FROM products where no = 3; 인덱스를 활용할 때는 인덱스 테이블이 갖고 있는 열을 검색 조건에 추가하는 것이 좋습니다. 애초에 그럴 목적으로 인덱스 테이블을 만들었으니 말이죠. 만약 인덱스 테이블인 products_index의 no 열을 검색 조건에 추가하지 않는다면 products를 조회할 때 조건문으로 인덱스를 사용하지 않게 됩니다.








MySQL 뷰 View

2. 뷰 SELECT의 결과로 어떤 테이블이 생성되지만 이는 객체가 아닙니다. 단지 명령의 결과일 뿐이죠. 뷰는 객체가 아닌 SELECT를 객체로 만든 기법입니다. 즉 SELECT의 결과는 데이터들을 반환하는데 반해, 뷰를 참조하면 SELECT의 결과를 테이블로 만들어서 테이블처럼 사용할 수 있습니다. 단, 실제로 존재하는 테이블이 아닌 가상 테이블 입니다. 그래서 뷰를 조작할 때 뷰는 저장공간이 없기 때문에 삽입, 수정, 삭제를 할 때 조건으로 PK를 반드시 지정해야 한다는 조건이 필요합니다. 일반적으로 뷰는 SELECT 명령에서만 사용하는 것이 좋습니다. ex) 뷰 생성(1) CREATE VIEW products_view AS SELECT 명령 (SELECT 명령)의 결과를 produts_view라는 이름의 뷰로 생성합니다. 뷰는 SELECT 명령을 가상의 테이블로 만든 것이라는 점을 기억해주세요. 뷰는 SELECT 명령을 가상의 테이블로 만들어서 테이블처럼 사용할 수 있기 때문에 편리합니다. 그러나 뷰를 참조할 때 마다 CPU가 소모되므로 뷰의 근원이 되는 테이블의 데이터가 많을수록 성능 저하의 원인이 됩니다. products_view라는 가상의 테이블을 만들었으니 이 테이블을 사용해서 쿼리를 작성할 수 있습니다. 즉 일반 테이블 처럼 SELECT 조회를 할 수 있습니다. SELECT * FROM products_view WHERE no = 1; ex) 뷰 생성(2) CREATE VIEW products_view (열1, 열2 ... ) AS SELECT 명령 가상의 테이블을 만드는 것이므로 생성할 테이블의 열을 지정할 수도 있습니다. 이것이 뷰를 사용하는 목적이죠 ! 그러나 열의 자료형, 제약을 새롭게 지정할 수는 없습니다. ex) 뷰 삭제 DROP VIEW products_view



MySQL 계정 비밀번호 변경


USE mysql; UPDATE user SET PASSWORD=PASSWORD('ChangePassword') WHERE user='ChangeUser'; FLUSH privileges;