컬쥐네 다락방

Index와 SQL 기초 본문

공부방/IT

Index와 SQL 기초

코딩하는 갱얼쥐 2021. 10. 25. 21:59

인덱스(Index)란?

테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해서 사용한다.

인덱스는 자주 사용되는 필드 값으로 만들어진 원본 테이블의 사본이라 생각할 수 있다.

 

MySQL은 데이터를 검색할 때 첫 번째 필드부터 차례대로 테이블 전체를 검색한다.

따라서 테이블이 크면 클수록 데이터를 탐색하는 시간도 많이 늘어나게 된다.

 

하지만 인덱스를 사용하면 테이블 전체를 읽지 않아도 되므로 검색과 정렬에 대한 처리가 빠르게 이루어진다. 이때 이런 인덱스는 사용자가 직접 접근할 수 없고 검색과 정렬에 대한 처리에서만 사용된다.

 

인덱스는 설정된 필드 값을 포함해 데이터의 삽입, 삭제, 수정 작업이 원본 테이블에서 이루어질 경우 인덱스도 함께 수정이 필요하다. 따라서 인덱스가 설정된 테이블은 처리 속도가 느려질 수 있다.

인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 좋다! 

 

인덱스 생성 : 

CREATE INDEX 인덱스이름
ON 테이블이름 (필드이름1, 필드이름2, ...)

이때 쉼표를 사용해 여러 필드를 가지는 인덱스를 생성할 수 있다.

 

인덱스 정보 보기

SHOW INDEX
FROM 테이블이름

이 문법은 해당 테이블에 생성된 모든 인덱스의 정보를 보여준다. 이때 반환되는 인덱스 정보의 필드 값은 다음과 같다.

 

1. Table : 테이블의 이름을 표시함.

2. Non_unique : 인덱스가 중복된 값을 저장할 수 있으면 1, 저장할 수 없으면 0을 표시함.

3. Key_name : 인덱스의 이름을 표시하며, 인덱스가 해당 테이블의 기본 키라면 PRIMARY로 표시함.

4. Seq_in_index : 인덱스에서의 해당 필드의 순서를 표시함.

5. Column_name : 해당 필드의 이름을 표시함.

6. Collation : 인덱스에서 해당 필드가 정렬되는 방법을 표시함.

7. Cardinality : 인덱스에 저장된 유일한 값들의 수를 표시함.

8. Sub_part : 인덱스 접두어를 표시함.

9. Packed : 키가 압축되는(packed) 방법을 표시함.

10. Null : 해당 필드가 NULL을 저장할 수 있으면 YES를 표시하고, 저장할 수 없으면 ''를 표시함.

11. Index_type : 인덱스에 사용되는 메소드(method)를 표시함.

12. Comment : 해당 필드를 설명하는 것이 아닌 인덱스에 관한 기타 정보를 표시함.

13. Index_comment : 인덱스에 관한 모든 기타 정보를 표시함.

 

UNIQUE 인덱스 생성

CREATE UNIQUE INDEX 인덱스이름
ON 테이블이름 (필드이름1, 필드이름2, ...)

이렇게 UNIQUE 를 붙여주면 중복 값을 허용하지 않는 인덱스를 붙여줄 수 있다.

 

인덱스 정렬

CREATE INDEX 인덱스이름
ON 테이블이름 (필드이름 DESC)

CREATE INDEX 인덱스이름
ON 테이블이름 (필드이름 ASC)

인덱스를 생성할 때 인덱스에 포함되는 필드의 정렬 방식을 설정할 수 있다.

DESC는 내림차순으로 정렬, ASC는 오름차순으로 정렬된다.

 

SELECT 컬럼명
FROM 테이블명
WHERE 조건식
ORDER BY 컬럼명 OR  표현식 (ASC OR DESC);

WHERE 절에서 쓰이는 연산자 : 

논리 연산자 : ! = <> ^=

 

SQL 비교 연산자 : 

1. NOT BETWWEN ~ AND ~ 

2. NOT IN 

3. NOT LIKE (사용할 시 결과도 알아야 함)

4. IS NOT NULL

 

MariaDB에 데이터 베이스를 만들때 이미 존재하는 데이터 베이스와 같은 이름의 데이터 베이스를 만들면 에러가 난다.

MariaDB [(none)]> CREATE DATABASE test;
ERROR 1007 (HY000): Can't create database 'test'; database exists

같은 이름의 데이터베이스가 존재하지 않을 때만 만들고 싶다면 IF NOT EXISTS를 붙여주면 된다! 

MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS test;
Query OK, 0 rows affected, 1 warning (0.00 sec)

마침표같은 특별한 문자를 포함하는 경우에는 에러가 난다.

이럴땐 억음 부호(`)로 감싸주면 에러가 나지 않고 잘 입력된다. (기존 DB 데이터를 입력하는 과정에서 인덱스를 주기위해 언급할 때도 감싸줘야 에러가 나지 않았는데, 이러한 설명을 적은 블로거는 없어서 확인해봐야한다)

 * 추가사항 : 

key 같이 특정 고유 단어들도 `로 감싸줘야 에러가 나지 않는다. 

Mac 기준 `는 영어 설정일때 쳐진다.. 한글일땐 ₩가 쳐진다 ! 

MariaDB [(none)]> CREATE DATABASE test.test;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.test' at line 1

MariaDB [(none)]> CREATE DATABASE `test.test`;
Query OK, 1 row affected (0.00 sec)

 

다음에는 테이블 JOIN에 대해 공부하기.

Docker에 대해 공부한 내용 기록하기.

Comments