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 27446 게시물 읽기
No. 27446
도와주세요 ㅠㅠ 쿼리문과 인덱스
작성자
머신
작성일
2008-03-06 23:34
조회수
3,336

검색코드입니다. 초기검색이 너무 느려요 ㅠㅠ 아래와 같은  진행을 했는데요
g_info와 t_test는 일대 다의 관계입니다.
g_info는 정렬을 하기위한 g_class와 align을 가지고 있는데요 지역이 없으면 풀스캔을 하더라구요 그래서 중복이되더라고 전철역지역과 sido를 맞춰서 row수를  줄여주었구요.
초기 속도를 더욱 빠르게 검색을 하려면 어떻게 쿼리문을 작성하고 인덱스는 어떻게 잡아야 하는걸가요? 도움 부탁드립니다.

mysql> select * from g_info where sido='서울' and code in(select code from t_test where sido='서울/수도권' and line='1호선') order by g_class desc,align desc limit 10;
+------+------+----------+-----------+---------+---------+---------+---------+
| code | sido | gugun    | dong      | min_pay | max_pay | g_class | align  |
+------+------+----------+-----------+---------+---------+---------+---------+
|  33 | 서울 | 강남구  | 포이동    |      19 |      49 |      3 | 9999996 |
|  259 | 서울 | 강남구  | 대치동    |      23 |      56 |      3 | 9999919 |
|  300 | 서울 | 광진구  | 구의2동  |      20 |      44 |      3 | 9999904 |
|  321 | 서울 | 마포구  | 노고산동  |      17 |      50 |      3 | 9999893 |
|  346 | 서울 | 강동구  | 고덕2동  |      16 |      48 |      3 | 9999886 |
|  362 | 서울 | 서대문구 | 창천동    |      18 |      58 |      3 | 9999882 |
|  386 | 서울 | 중구    | 수하동    |      21 |      40 |      3 | 9999870 |
|  406 | 서울 | 서대문구 | 영천동    |      17 |      36 |      3 | 9999865 |
|  414 | 서울 | 서초구  | 방배3동  |      24 |      49 |      3 | 9999864 |
|  499 | 서울 | 중구    | 충무로3가 |      16 |      44 |      3 | 9999842 |
+------+------+----------+-----------+---------+---------+---------+---------+
10 rows in set (11.04 sec)

아래는 explain 결과입니다.
') order by g_class desc,align desc limit 10;
+----+--------------------+--------+----------------+---------------+------+---------+-------+------+-----------------------------
+
| id | select_type        | table  | type          | possible_keys | key  | key_len | ref  | rows | Extra
|
+----+--------------------+--------+----------------+---------------+------+---------+-------+------+-----------------------------
+
|  1 | PRIMARY            | g_info | ref            | sido          | sido | 33      | const | 3212 | Using where; Using filesort
|
|  2 | DEPENDENT SUBQUERY | t_test | index_subquery | code,sido    | code | 4      | func  |    3 | Using where
|
+----+--------------------+--------+----------------+---------------+------+---------+-------+------+-----------------------------
+

g_info 테이블에는 현재 18000개 정도가 있구요 구조는
+---------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| code    | int(11)    | NO  | PRI | NULL    | auto_increment |
| sido    | varchar(10) | YES  | MUL | NULL    |                |
| gugun  | varchar(50) | YES  | MUL | NULL    |                |
| dong    | varchar(50) | YES  | MUL | NULL    |                |
| min_pay | int(2)      | YES  | MUL | NULL    |                |
| max_pay | int(2)      | YES  | MUL | NULL    |                |
| g_class | int(1)      | YES  |    | NULL    |                |
| align  | int(11)    | YES  |    | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
이렇게 되어있습니다. 인덱스는 (sido,gugun,dong) 하고 (min_pay) 그리고 (max_pay)로 나뒤어져있습니다. align의 데이타는 g_class를 기준으로 9999999부터 역순으로 입력이 됩니다. align의 데이타는 1,2,3중에 하나만 들어가구요 인덱스는 걸어놨었는데.. g_class만 걸어놨었습니다.

Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-
--------+
| g_info |          0 | PRIMARY  |            1 | code        | A        |      18405 |    NULL | NULL  |      | BTREE      |
        |
| g_info |          1 | min_pay  |            1 | min_pay    | A        |          11 |    NULL | NULL  | YES  | BTREE      |
        |
| g_info |          1 | max_pay  |            1 | max_pay    | A        |          30 |    NULL | NULL  | YES  | BTREE      |
        |
| g_info |          1 | sido    |            1 | sido        | A        |          16 |    NULL | NULL  | YES  | BTREE      |
        |
| g_info |          1 | sido    |            2 | gugun      | A        |        248 |    NULL | NULL  | YES  | BTREE      |
        |
| g_info |          1 | sido    |            3 | dong        | A        |        6135 |    NULL | NULL  | YES  | BTREE      |
        |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+-


t_test 테이블에는 55000건 정도의 데이타가 있습니다.
g_info테이블의 회원코드로 t_test의 지하철 정보를 조회하는것인데요

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| seq  | int(11)    | NO  | PRI | NULL    | auto_increment |
| code  | int(11)    | NO  | MUL |        |                |
| sido  | varchar(30) | YES  | MUL | NULL    |                |
| line  | varchar(50) | YES  |    | NULL    |                |
| name  | varchar(50) | YES  |    | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

인덱스는 (code)하고 (sido,line,name)로 되어있습니다.
--------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type |
Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-
--------+
| t_test |          0 | PRIMARY  |            1 | seq        | A        |      55215 |    NULL | NULL  |      | BTREE      |
        |
| t_test |          1 | code    |            1 | code        | A        |      18405 |    NULL | NULL  |      | BTREE      |
        |
| t_test |          1 | sido    |            1 | sido        | A        |          5 |    NULL | NULL  | YES  | BTREE      |
        |
| t_test |          1 | sido    |            2 | line        | A        |          16 |    NULL | NULL  | YES  | BTREE      |
        |
| t_test |          1 | sido    |            3 | name        | A        |        600 |    NULL | NULL  | YES  | BTREE      |
        |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-
--------+

옵션검색도 추가해야할텐데.. 너무느리네요.. 어떻게 해야 속도가 빨라질까요 ㅠㅠ문제가 뭘까요 ㅠㅠ

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

얇은 지식으로 댓글달아 죄송합니다
하나의 TABLE로 정확한 자료를 만들어낸다기보담은
뷰나 특정 검색을 위한 테이블을 만든후
최적화 검색을 위해 해당 테이블에 자료를 넣어두어서 사용하면 어떨까요

시도검색용테이블, 지하철정보테이블, 기타 검색옵션별 테이블...

이동안(leeda153)님이 2008-03-09 13:38에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
27450MySQL 과 C 연동 문제입니다
양경모
2008-03-08
3008
27449제발 알려주세요....데이터가 테이블에 안들어갑니다..... [3]
유재훈
2008-03-07
5386
27447안녕하세요. [1]
레진
2008-03-07
2688
27446도와주세요 ㅠㅠ 쿼리문과 인덱스 [1]
머신
2008-03-06
3336
27445[질문] 씨퀀스는 얼마까지 가나요? [1]
새벽소리
2008-03-06
2659
27444pgsql의 함수 split_part [2]
성정환
2008-03-06
3549
27442도와주세요. 셀렉트박스에서 [1]
궁금이
2008-03-05
5427
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다