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 25967 게시물 읽기
No. 25967
인덱스를 안탑니다..ㅜㅜ
작성자
김태호(LikeVinci)
작성일
2006-10-24 18:55ⓒ
2006-10-24 18:56ⓜ
조회수
2,738

버전은 4.023쓰고 있습니다.

1개의 DB안에 1개의 테이블이 있고, 그 안에 9개의 컬럼이 있는 구조입니다.

9개 컬럼중 첫 컬럼은 프라이머리 키이고, 중복되지 않습니다.

첫 컬럼의 데이터(숫자 9자리입니다) 중 11등 특정 두자리로 시작되는 로우만을 꺼내오려고 합니다.

그래서, 

select * from jibun_2 where b_code like '11%';

로 사용했는데 속도가 너무 느려서 인덱싱을 하고 싶어서,

인덱스를 걸었는데 하고 나서 explain으로 확인해보니

Possible key에는 제가 준 인덱스가 있는데, Key에는 Null로 나오네요.. 타입도 All로 나오구요.
전체 로우가 천팔백만개쯤 되구요, 그 중 오십만개 정도를 빼내는거라, 인덱스를 타는게 훨씬 빠를것 같은데 안타네요.

이유가 뭘까요? 제가 인덱스를 잘못 걸어준걸까요?

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

Sometimes MySQL does not use an index, even if one is available. One circumstance under which this occurs is when the optimizer estimates that using the index would require MySQL to access a very large percentage of the rows in the table. (In this case, a table scan is likely to be much faster because it requires fewer seeks.) However, if such a query uses LIMIT to retrieve only some of the rows, MySQL uses an index anyway, because it can much more quickly find the few rows to return in the result. 

가끔 인덱스가 사용가능하여도 인덱스를 사용하지 않는 경우가 있습니다.
옵티마이저가 쿼리문 실행환경을 분석하여 테이블의 많은 양을 검색할 때 인덱스를 사용하는 것보다 테이블 스캔이 더 빠르기 때문입니다. 
그러나 LIMIT를 사용하면 결과물의 몇개만 가져오게 되기 때문에 무조건 인덱스를 사용하게됩니다. 

한테이블에 인덱스를 만들고 1~10까지 입력한 후 
desc select * from t  where t.aa > 1;
desc select * from t  where t.aa > 10;
desc select * from t  where t.aa > 1 limit 1;

이렇게 실행해 보면 
2,3 번째 문장에서 인덱스를 타는 걸 알 수 있습니다. 

좋은 하루 되세요. ^^*

정왕균(아레아)님이 2006-10-25 00:26에 작성한 댓글입니다.
이 댓글은 2006-10-25 00:28에 마지막으로 수정되었습니다.

 답변 감사합니다^^

그런데, 테스트를 해보니, 테이블에 1~10까지 입력하는것은 말씀하신 세가지 모두 type이 range로 나오고, key역시 지정한 인덱스로 나오는걸로 보아, 세가지가 모두 인덱스를 타는것 같습니다.

그런데 원래 있던 테이블에서 테스트를 해보니, limit를 지정하였음에도 불구하고 같은 결과를 보입니다. 

mysql> desc select * from jibun_2 where jibun_2.b_code like '1111%' limit 5;
+---------+------+----------------------------+------+---------+------+---------
-+-------------+
| table   | type | possible_keys              | key  | key_len | ref  | rows
 | Extra       |
+---------+------+----------------------------+------+---------+------+---------
-+-------------+
| jibun_2 | ALL  | jibun_2_idx,b_code,bcd_idx | NULL |    NULL | NULL | 13981301
 | Using where |
+---------+------+----------------------------+------+---------+------+---------
-+-------------+
1 row in set (0.00 sec)

그리고 실질적으로도 일치하는 모든 데이터를 받아야 하기 때문에 limit를 사용하긴 어려울것 같습니다. 어떤 방법이 없을까요?

+--------+------------+------+-----+---------+-------+
| Field  | Type       | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+-------+
| b_code | bigint(20) | YES  | MUL | NULL    |       |
| code   | int(11)    | YES  |     | NULL    |       |
| san    | int(11)    | YES  |     | NULL    |       |
| bunji  | int(11)    | YES  |     | NULL    |       |
| ho     | int(11)    | YES  |     | NULL    |       |
| x      | int(11)    | YES  |     | NULL    |       |
| y      | int(11)    | YES  |     | NULL    |       |
| minx   | int(11)    | YES  |     | NULL    |       |
| miny   | int(11)    | YES  |     | NULL    |       |
+--------+------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

이런 테이블 구성이구요. 여기서 b_code값에 인덱스를 걸려고 합니다. 현재 1400만개 정도의 로우가 있구요 그 중에 50만개 정도를 추출하는데 약 13초 정도가 걸립니다. 이걸 극단적으로 줄여보고 싶어서 인덱스를 건건데 어째서 안되는지 모르겠습니다.

김태호(LikeVinci)님이 2006-10-25 09:35에 작성한 댓글입니다.
이 댓글은 2006-10-25 09:37에 마지막으로 수정되었습니다.

b_code | bigint(20) 컬럼이 상수형인데 


b_code like '1111%' 문자형로 검색해서 그런것 같습니다.

문자는 앞에 있는 문자부터 검색하니 숫자의 크기로 정렬되어 있는 인덱스를 탈 수 없겠죠.


b_code < 1000 이렇게 상수로 검색해서 인덱스를 잘 타나 보세요. 


좋은 하루 되세요.


정왕균(아레아)님이 2006-10-25 13:24에 작성한 댓글입니다.

말씀하신대로, bigint인데 %로 쿼리를 보내서 그랬네요.^^


해결에 도움주셔서 감사합니다..^^

김태호(LikeVinci)님이 2006-10-25 16:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
25970쿼리문 좀 도와주세요
나비133
2006-10-25
1316
25969한테이당 최대 레코드수??? [3]
궁금
2006-10-25
1665
25968MFC와 mysql을 연동하려합니다. [1]
배성인
2006-10-24
3423
25967인덱스를 안탑니다..ㅜㅜ [4]
김태호
2006-10-24
2738
25966mysql configure 옵션 확인 방법 [1]
냐하하하
2006-10-24
4641
25965mysql 3.23 에서 5.0 버전의 업그레이드 [1]
진정우
2006-10-24
2231
25964version 3.23.5 data를 version 4.1.8로 복구하는 방법
이정진
2006-10-23
2184
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다