database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 27837 게시물 읽기
No. 27837
레코드 inset 질문 입니다.
작성자
김지수
작성일
2008-10-23 21:52ⓒ
2008-10-24 10:14ⓜ
조회수
4,270

안녕하세요 mysql을 공부 하고 있는데 막히는 부분이 있어서 이렇게 질문을 드립니다.

 

예를 들어서  테이블을 아래와 같이 생성한 후에 

 

create table test (num int(4) auto_increment primary key, data char(10))

 

+-------+----------+------+-----+---------+----------------+

| Field | Type     | Null    | Key | Default  | Extra                   |

+-------+----------+------+-----+---------+----------------+

| num  | int(4)     | NO    | PRI |  NULL    | auto_increment     |

| data  | char(10) | YES  |        | NULL    |                            |

+-------+----------+------+-----+---------+----------------+

 

inset 문으로 레코드를 삽입을 하게 되면 

insert into test values(0,"aa");

insert into test values(0,"bb");

insert into test values(0,"cc");

insert into test values(0,"dd");

 

이와 같이 레코드들이 삽입 되어 있습니다.

+-----+------+

| num | data |

+-----+------+

|   1 | aa       |

|   2 | bb       |

|   3 | cc       |

|   4 | dd       |

+-----+------+

 

저장된 레코드 들은 내림 차순으로 정렬을 해서 보게 되면 

select * from test order by num desc; 이렇게 쿼리를 날려야 하는데

레코드들이 너무 많은 경우 약 1000만개 라고 하면 시간이 너무 많이 걸리게 됩니다.

 

그래서 처음부터 로그를 insert할때 

+-----+------+

| num | data |

+-----+------+

|   4 | dd       |

|   3 | cc       |

|   2 | bb       |

|   1 | aa       | 

+-----+------+

위와 같이 입력 할 수 있는 방법이 있을까여??

이렇게 저장되면 order by를  이용하지 않고 바로 limit 로 보여 질 수 있을거 같은데

해결 할 수 있는 방법을 모르겠습니다. 

 

초보적은 질문 이지만 좋은 방법이 있으면 여러 고수님들의 답변을 듣고 싶습니다.

 

 

이 글에 대한 댓글이 총 2건 있습니다.

천만개의 레코드가 있는 경우 모든 데이터를 다 뽑아내려면 어떤 방법을 써도 너무 느린 것이 사실입니다. (물론 이런 경우는 web log로부터 통계를 뽑아내는 등의 경우가 아니라면 매우 드물겠죠. *^_^*)

 

 

테이블을 생성하실때 num 컬럼에 primary key를 설정하셨습니다.

 

즉, num에는 index가 걸려있다는 말이죠.

 

정말로 천만건의 data를 입력하고

 

select * from test order by num desc limit 5;

 

와 같이 해보세요. index를 이용해서 data를 뽑아내기 때문에 많이 걸려야 0.01초 정도에 결과가 나옵니다.

 

진짜로 그렇게 되는지는 적당히 만건만 넣으시고

 

explain select * from test order by num desc limit 5;

 

라고 해보시면 '음 진짜로 실행계획을 index를 사용하는 것으로 잡았구먼'하실겁니다.

 

 

 

참고로 레코드 간의 순서는 order by를 사용하지 않으면 select 되어지는 순서는 보장되지 않음(!!!)이 원칙입니다.

우욱님이 2008-10-24 23:25에 작성한 댓글입니다. Edit

우욱님께서 충분한 답변을 해주셨지만, 한 가지 덧붙이자면,

 

김지수님께서 원하고 계신 형태로 인덱스를 구성할 수는 있습니다. 역순 인덱스라는 것인데요, 인덱스를 생성할 때 MySQL은 기본적으로 어센딩으로 인덱스를 구성합니다. 물론 order by ... desc해도 인덱스를 활용하여 빠르게 소트할 수 있지만, 원하시는 대로 select .. limit 5 만 가지고도 상위 5개를 뽑아낼 수는 없는 노릇이죠.

아마 역순 인덱스를 지원하는 다른 DBMS를 선택하신다면 구현하실 수 있습니다. ( 허나, 삭제되는 row가 있다면, 그 이후에 insert되는 녀석들이 가장 위쪽에 위치할지는 잘 모르겠습니다. 제가 다른 DBMS는 더 모르거든요... )

 

( 현재의 MySQL에서는 역순 인덱스 '문법' 만을 지원하고, 실제로 '구현'되어 있지 않다고 알고 있는데, 보다 최신의 정보를 알고 계신 분께서 더 좋은 정보를 적어주셔도 좋을 것 같습니다. )

박현우(lqez)님이 2008-10-30 23:34에 작성한 댓글입니다.
이 댓글은 2008-10-30 23:35에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
27840이것좀 봐주세요...; [1]
yjs
2008-10-25
3840
27839root로 로그인이 안되요...ㅠㅠㅠ [1]
초보
2008-10-24
4185
27838쿼리문 만들려고하는데 좀 도와주세요~ [2]
이병윤
2008-10-24
4306
27837레코드 inset 질문 입니다. [2]
김지수
2008-10-23
4270
27835replication 기능 질문 [2]
정화용
2008-10-22
4173
27834유저별 게시판 문의 드립니다. [1]
kino
2008-10-21
4398
27833해결점 해주세요can't connect to MYSQL server on 'localhost' [1]
권재현
2008-10-18
5094
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다