인덱스 (데이터베이스)

위키백과, 우리 모두의 백과사전.

인덱스(영어: index)는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다. 인덱스는 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다. 고속의 검색 동작뿐만 아니라 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공한다. 인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다. (왜냐하면 보통 인덱스는 키-필드만 갖고 있고, 테이블의 다른 세부 항목들은 갖고 있지 않기 때문이다.) 관계형 데이터베이스에서는 인덱스는 테이블 부분에 대한 하나의 사본이다.

인덱스는 고유 제약 조건을 실현하기 위해서도 사용된다. 고유 인덱스는 중복된 항목이 등록되는 것을 금지하기 때문에 인덱스의 대상인 테이블에서 고유성이 보장된다.



+ 인덱스는 특정 칼럼 값을 가지고 있는 열 혹은 값을 빠르게 찾기 위해서 사용된다. 

+ MySQL은 첫 번째 열부터 전체 테이블에 걸쳐서 연관된 열을 검색하기 때문에 테이블이 크면 클 수록 비용이 엄청나게 늘어난다. 

+ 만약 테이블이 쿼리에 있는 컬럼에 대한 인텍스를 가지고 있다면, 

+ MySQL은 모든 데이터를 조사하지 않고도 데이터 파일의 중간에서 검색위치를 빠르게 잡아낼 수 있다. 

+ 인덱스 위주 검색 후, 관련된 혹은 원하는 데이터들을 가져올 수 있다고 생각할 수도 있다.



인덱스를 사용하는 이유 

WHERE 구문과 일치하는 열을 빨리 찾기 위해서.

열을 고려 대상에서 빨리 없애 버리기 위해서. 

조인 (join)을 실행할 때 다른 테이블에서 열을 추출하기 위해서.

특정하게 인덱스된 컬럼을 위한 MIN() 또는 MAX() 값을 찾기 위해서.

사용할 수 있는 키의 최 좌측 접두사 (leftmost prefix)를 가지고 정렬 및 그룹화를 하기 위해서.

데이터 열을 참조하지 않는 상태로 값을 추출하기 위해서 쿼리를 최적화 하는 경우에.


인덱스를 사용해야 하는 경우 

데이터 양이 많고 검색이 변경보다 빈번한 경우

인덱스를 걸고자 하는 필드의 값이 다양한 값을 가지는 경우 


   인덱스의 사용 


  기존의 테이블에 인덱스를 추가하기 

ALTER TABLE  테이블명 ADD INDEX(필드명(크기));


mysql> ALTER TABLE temp ADD INDEX(keyword(20));

Query OK, 554604 rows affected (1.31 sec)

Records: 554604  Duplicates: 0  Warnings: 0



  테이블 생성시 인덱스 추가하기 
CREATE TABLE 테이블 명 ( 필드명 데이터타입(데이터크기), 
INDEX(필드명(크기)) ENGINE MyISAM; 

mysql> CREATE TABLE test (
    -> keyword varchar(20),
    -> INDEX(keyword(20)))
    -> ENGINE MyISAM;
Query OK, 0 rows affected (0.11 sec)


  FULLTEXT 인덱스 만들기 
일반적인 인덱스와는 달리 MySQL의 FULLTEXT는 매우 빠르게 모든 텍스트 열을 검색한다. 검색 엔진과 유사한 방법으로 자연 언어를 이용해 검색할 수 있는 특별한 인덱스로 모든 데이터 문자열의 단어를 저장하기 때문이다. 

참고사항 
FULLTEXT 인덱스는 MySQL의 기본 저장 엔진 타입인 MyISAM 테이블에만 사용된다. 
만약 테이블을 MyISAM 으로 변경해야 된다면 
ALTER TABLE 테이블명 ENGINE = MyISAM; 
FULLTEXT 인데스는 CHAR 와 VARCHAR, TEXT 열로만 생성 가능하다.

ALTER TABLE 테이블명 ADD FULLTEXT(필드명)

mysql> ALTER TABLE temp ADD FULLTEXT(keyword);
Query OK, 554604 rows affected (1.49 sec)
Records: 554604  Duplicates: 0  Warnings: 0


  인덱스의 효과 
인덱스를 걸게 되면, 테이블 생성시에 인덱스의 정보도 만들게되므로 생성속도가 느려진다. 


비교를 위해서 두개의 테이블을 생성하였다. 하나는 인덱스가 걸려있는 테이블 (test_index) 와 걸려 있지 않은 테이블 (test)이다. 그림을 보면 생성 속도에서 차이가 꽤 나는 것을볼 수 있다. 

이런데도 인덱스를 거는 이유는 바로 조건문 등에 대한 SELECT 속도 등에서 차이가 나기 때문이다. 

위 테이블의 데이터는 약 55만개의 데이터가 저장되어있다. 그 중에서 '가'로 시작되는 데이터들을 뽑아 오자 .

SELECT * FROM test WHERE keyword LIKE '가%' ; 
5056 rows in set (0.08 sec) 

SELECT * FROM test_index WHERE keyword LIKE '가%' ; 
5056 rows in set (0.01 sec) 



출처: http://ra2kstar.tistory.com/96 [초보개발자 이야기.]


++++

프로시져 내부에서 인덱스를 사용하여 속도 향상을 시켜 보자.

프로시져를 이용하여 2년치의 데이터를 가져올 때, 30초의 대기 시간을 부여한 결과 TimeOut의 결과를 가져왔다.


따라서 프로시져 내부에 인덱스를 부여한 결과 놀라운 속도의 차이를 가져왔다.


프로시져 내용은 

create temporary table tmptbl (cons char(10), custm varchar(60), phone char(50), group char(2), use char(4), 

                               inspe char(8), cd char(8), consl char(5),

                               status char(1), no char(12), reque char(8), INDEX `index1` (consl_no)); 


프로시져 내에서 update 구문이 있어서, 더 오래 걸린 이유도 되었습니다.


하지만 인덱스를 추가한 이후 연관된 데이터의 업데이트 및 select 문이 빠르게 이루어지기 때문에,

타임아웃에도 안걸리고 속도는 향상되는 결과를 얻을 수 있었습니다.


update tmptbl a, something b set a.reque = b.reque,

                     where a.consl_no=b.consl_no;


이처럼 Index는 조건절에 따른 구분이 들어가 있는 것을 선택할 수록 효과는 더 좋습니다.


---

직접 느껴 본 것만 적다 보니깐, 이론적으로 안 맞는 경우도 있는데, 

제가 놓친 정확한 정보와 지식은 댓글로 남겨주시면 감사하겠습니다.










'Computer_IT > MySQL' 카테고리의 다른 글

[MySql]Column count doesn't match value count at row 1 에러  (0) 2017.05.31

인터넷 검색 및 데이터 수집을 하고 싶다...

라는 생각에 기술을 알아보는 중 

크롤링이라는 기술이 있다고 한다.


크롤링이란 무엇 일까?

Web Scraping(웹 크롤링) 이란?

[펌] 네이버 블로그
(http://m.blog.naver.com/potter777777/220605598446)

컴퓨터 업계에서 일하는 사람들은 "크롤링", "크롤러", "크롤링 알바" 이런 말을 들어본 적이 있을 겁니다. 저도 친구들이나 선배들이 회사에서 크롤링하는 알바를 했다는 경험담을 많이 들었습니다. 개인 프로젝트를 하면서 혹은 팀 프로젝트를 하면서 크롤링 할 일이 있었습니다. 하지만, 어떻게 하는지 몰랐죠.

 여러 사람들에게 조언을 구하고 구글의 힘을 빌려서 제가 원하는 정보를 파싱해서  DB에 넣는 데에 성공했습니다. 원하는 데이터가 잘 나와서 눈물이 앞을 가리더군요. 사람들에게 스크린샷을 찍어서 보내면서 "내가 한거라고 ㅠㅠ" 3일 밤을 새면서 고생했어요. "잘했어... (토닥토닥)" 아 논지를 벗어 났군요.

우리가 흔히 부르는 웹 크롤러 크롤링의 정식명칭은 'Web Scraping' 입니다. 외국 자료를 찾으려고 하니까 'Web Crawling' 보다는 'Web Scraping' 이라는 용어를 자주 사용하더군요.

"Web scraping is a computer software technique of extracting information from websites."
-> 웹 크롤링이란 컴퓨터 소프트웨어 기술로 웹 사이트들에서 원하는 정보를 추출하는 것을 의미합니다.

 웹 크롤러란 인터넷에 있는 웹페이지를 방문해서 자료를 수집하는 일을 하는 프로그램을 말합니다. 이때 한 페이지만 방문하는 것이 아니라 그 페이지에 링크되어 있는 또 다른 페이지를 차례대로 방문하고 이처럼 링크를 따라 웹을 돌아다니는 모습이 마치 거미와 비슷하다고 해서 스파이더라고 부르기도 합니다. 엄청난 분량의 웹문서를 사람이 일일 구별해서 모으는 일은 불가능에 가깝습니다. 때문에 웹 문서 검색에서는 사람이 일일이 하는 대신 이를 자동으로 수행해 줍니다. 

예를 들면, "멜론 사이트에서 현재 음악 차트 순위 자료가 필요하다."고 해보겠습니다. 물론, 사이트에 가서 일일이 보고, 엑셀에 값을 넣고 정리해서 상사에게 보고하는 사람들도 있을 겁니다. 하지만 이 데이터를 다른 프로그램이나 무언가를 만들 때 사용하려면 DB 형태로 저장해 놓을 필요가 있습니다.

카테고리, 순위, 발매일, 제목, 앨범제목, 그룹이름 등등... 차트에도 여러 정보가 있겠죠.

 웹은 기본적으로 HTML 형태로 되어 있는 건 다들 아실 겁니다. 저희가 눈으로 볼 수 있다면, 해당 정보가 HTML 형태로 어떻게 보여지는지도 '페이지 소스 보기' 또는 '개발자 검사' 로 볼 수 있습니다. 이런 소스들은 보통 개발자들이 어떤 정형화된 형태로 관리하고 있습니다. 때문에 규칙이 생기죠. 이런 규칙을 분석해서 우리가 원하는 정보들만 뽑아오는 것을 웹 크롤링 작업이라고 생각하시면 됩니다.

 한국에서도 웹 크롤링 할 일이 많기 때문에 알바를 구하는 구인 광고도 본 적이 있고 네이버, 다음, 구글 등등 여러 포털 사이트 블로그에 크롤링 하는 방법을 치면 나오는 정보들도 많습니다. 가장 많이 나오는 것이 Python으로 크롤링 하는 소스들이 제일 흔하죠. 현재 파이썬이 가장 떠오르는 언어이죠? 하지만 저는 파이썬보다는 현재 루비와 레일즈를 주로 공부하고 있어서 루비로 크롤러 개발을 할 수 있는 방법을 찾아보았습니다.

 저는 다음 블로그 포스팅부터 몇 차례에 걸쳐서 제가 주로 포스팅하는 언어인 'Ruby' 와 'Rails' 그리고 'nokogiri' 라는 잼(gem)을 이용하여 크롤링하는 방법에 대해서 포스팅 할 예정입니다. 한국에서 nokogiri로 스크래핑하는 것에 대한 방법을 기술한 자료는 그렇게 많지 않았습니다. 일주일 내내 찾아도 제대로 된 것이 2개? 1개? 정도 였고 정보도 통틀어 10개를 넘지를 않았습니다. 그래서 루비와 노코기리로 크롤링 하는 방법을 찾는 분들을 위해서 노코기리 잼 분석부터 레일즈로 띄우는 방법까지 자세히 포스팅하겠습니다.

자세한 웹 크롤링에 대한 정의는 아래 '위키 피디아를 참조'하시기 바랍니다.
https://en.wikipedia.org/wiki/Web_scraping

그리고 외국 자료들이 더 정확하고 유용하니, 웹 크롤링 웹 크롤러로 검색하기 보다는 "Web Scraping with something" 이런 식으로 검색하여 원하는 정보를 찾아서 활용하시기 바랍니다.



위 블로그 분의 좋은 이야기를 듣고, 

내가 필요한 Scraping을 만들기 위해


Python으로 작성을 시도해 볼려고 한다.

+ Recent posts