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 30148 게시물 읽기
No. 30148
mysq int unsigned index
작성자
우영제(rolo)
작성일
2011-11-18 10:47
조회수
7,835

mysql> desc ip_isp;
+------------+------------------+------+-----+---------+-------+
| Field      | Type             | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| ip_from    | int(10) unsigned | NO   | PRI | NULL    |       |
| ip_to      | int(10) unsigned | NO   | PRI | NULL    |       |
| cntry_code | char(2)          | YES  |     | NULL    |       |
| cntry_name | varchar(64)      | YES  |     | NULL    |       |
| isp_name   | varchar(255)     | YES  |     | NULL    |       |
+------------+------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> show index from ip_isp;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| ip_isp |          0 | ip       |            1 | ip_from     | A         |     3972496 |     NULL | NULL   |      | BTREE      |         |
| ip_isp |          0 | ip       |            2 | ip_to       | A         |     3972496 |     NULL | NULL   |      | BTREE      |         |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
2 rows in set (0.00 sec)

mysql> explain select * from ip_isp where 1677721500 >= ip_from   limit 1;
+----+-------------+--------+-------+---------------+------+---------+------+---------+-------------+
| id | select_type | table  | type  | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+--------+-------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | ip_isp | range | ip            | ip   | 4       | NULL | 2199503 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)

 

보시면 index(ip)를 이용하지 않는 듯합니다.

무엇이 문제일까요?

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

select count(*) from ip_isp;

select count(*) from ip_isp where ip_from <= 1677721500;

를 해보세요.

 

인덱스를 타는 것보다 안 타는 것이 효율적이다고 판단되면

인덱스를 타지 않을 수 있습니다.

ip_from <= 1677721500 조건이 row수를 30% 이내로 줄이지 못하는 것 같습니다.

박인호(paerae)님이 2011-11-18 18:07에 작성한 댓글입니다.

 정확한 수치는 아니지만, Cardinality가 397만인데, 조건에 해당하는 값이 219만이기 때문에, 박인호님께서 말씀해주시는 것 처럼 인덱스를 사용하는 것이 효율이 나쁘다고 판단해, 인덱스를 사용하지 않는 것입니다.

 

이렇게 판단하는 이유는, (1) 인덱스에서 전체 값을 읽어올 수 있는 경우(Using Index)가 아니라면, (2) 인덱스에서 찾아본 다음에, (3) 값을 실제 테이블 데이터 페이지에서 읽는 과정에서 disk i/o가 늘어나기 때문입니다.

 

일반적으로 인덱스를 통해 lookup row의 수가 1/3 이상 줄어들지 않는다면 인덱스를 사용하지 않는 것으로 압니다. 이는, 인덱스를 읽고 다시 데이터를 읽는 경우가 그냥 데이터를 시퀀셜하게 읽어 조건을 보는 경우에 비해 약 3배 정도의 disk overhead를 일으킨다고 가정하고 있기 때문입니다. ( 정확한 수치는 아닙니다 )

 

만약에, SELECT * 이 아니라 ip_from, ip_to 값을 읽도록 하면 Using Index 조건이 포함되며 혹시라도 인덱스를 사용할지는 모르겠으나 현재와 같이 2백만건 정도 추출되는 경우라면 어려울 것 같습니다.

박현우(lqez)님이 2011-11-22 18:49에 작성한 댓글입니다.
이 댓글은 2011-11-23 04:35에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
30152my.cnf 옵션들중에... [1]
이제환
2011-11-22
8077
30151페이징 처리시 총건수 문제.. [4]
최진규
2011-11-21
10187
30149group by 최소값이 이상합니다. [2]
장민철
2011-11-19
7460
30148mysq int unsigned index [2]
우영제
2011-11-18
7835
30147한글검색문제 [2]
김양훈
2011-11-17
7573
30146top명령어로 본 현황인데요... [5]
최진규
2011-11-17
7977
30145mysql 설정관련 질문드립니다. [1]
최진규
2011-11-16
8301
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.033초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다