본문 바로가기
Language/mySQL

공부 내용 정리 mySQL :: 기초 V

by Cs.Woo 2021. 5. 19.

# 정렬(Order)

 정렬은 지정된 열(Column)을 기준으로 하여 행(row)을 정렬하는 것이다. 명령어는 다음과 같다.

ELECT * FROM 테이블명 
ORDER BY 정렬의 기준으로 사용할 열 
[DESC(내림차순) | ASC(디폴트, 오름차순)]

하기와 같은 예제도 가능하다.

select * 
from student 
order by distance desc;

# student 의 모든 열(*)을 갖고와서 distance를 내림차순으로 정렬(desc)

select * 
from student 
order by distance desc, address asc;

# student 의 모든 열(*)을 갖고와서 distance를 내림차순으로 정렬(desc), 
# 값이 같을떄는 adress를 오름차순(asc)로 함께 정렬

# 인덱스(Index)

  색인, 조회할 떄 원하는 행을 빠르게 찾을 수 있게 준비해둔 데이터이다. 

데이터 베이스 안의 테이블에 들어있는 특정 행(row)이 너무 많아서 물리적으로 헤아리기가 어렵다면,  그 중에서 찾고자 하는 행이 있어도 그것을 수행하기가 상당히 어려울 것이다.

  또한 데이터베이스를 기반으로 만든 웹 서비스가 있는데, 특정 데이터를 검색하거나 불러올 때 그 시간이 오래걸리거나 그것이 불가능하다면 그 웹 서비스는 기능적 방면에서 완벽하지 못하다 할 수 있다.

 상기와 같은 문제점을 해결하기 위한 방책으로서 인덱스(index)가 존재한다. 인덱스의 종류에는 다음과 같은 것이 있다.

primary 중복되지 않는 유일한 키
normal 중복을 허용하는 인덱스
unique 중복을 허용하지 않는 유일한 키
foreign 다른 테이블과의 관계성을 부여하는 키
full text 자연어 검색, myisam에서만 지원

 특정 행에 키(key)라는 것을 주입하고 색인할 떄 사용할 수있는데, 이 키(key)라는 것이 인덱스이다.

#Primary

 primary 는 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다. where문을 이용하여 데이터를 조회할 때 가장 고속으로데이터를 가져올 수 있다는 특징이 있다. 테이블 마다 딱 하나의 primary key를 가질 수 있다.

해당되는 테이블에 있어서 유일무이한 값이어야만 하는 것은 Primary 키이다. 하나에 딱 하나만 정의할 수 있다. id에 정의하였으면 name에는 정의할 수 없다.

select * 
from student 
where id=3;

# Unique key

 unique는 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야한다. (PRIMARY key와 유사하다) 고속으로 데이터를 가져올 수 있다는 장점이 있다. 여러개의 unique eky를 지정할 수 있다. 경우에 따라 primary보다 느릴 수 있다,

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `name` char(4) NOT NULL,
  `address` varchar(50) NOT NULL,
  `department` enum('국문과','영문과','컴퓨터공학과','전자공학과','물리학과') NOT NULL,
  `introduction` text NOT NULL,
  `number` char(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_number` (`number`) USING BTREE,
  KEY `idx_department` (`department`),
  KEY `idx_department_name` (`department`,`address`),
  FULLTEXT KEY `idx_introduction` (`introduction`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

 unique는 여러번 정의하여 줄 수 가있다. 상기의 예제에서 unique key 의 `idx_number`는 unique key의 이름인 것이다. 만약 이름을 지정해주지 않으면 데이터가 임의적으로 이름을 부여한다. 이렇게 name에 유니크 키를 지정하게 되면 넘버는 다른 값이랑 충돌하지 않는다는 것을 보장받을 수 있다.

 

 

select * 
from student 
where number=0534543;

# normal key

 normal은 중복을 허용한다, primary나 unique에 비하여 속도가 느리다는 특징이있다. 대신 여러개의 키를 지정할 수 있다.

select * 
from student 
where department='국문과'

 

 인덱스는 자주 조회되는 열에 적용하고, 조회 시 오랜 시간을 소모하는 열에 적용하고 데이터가 긴 경우에는 인덱스를 사용하지 않는 것이 정의 방법이다.