검색코드입니다. 초기검색이 너무 느려요 ㅠㅠ 아래와 같은 진행을 했는데요
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 |
|
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-
--------+
옵션검색도 추가해야할텐데.. 너무느리네요.. 어떻게 해야 속도가 빨라질까요 ㅠㅠ문제가 뭘까요 ㅠㅠ |