쿼리 질문이요~ 정보
쿼리 질문이요~
본문
$sql = " select mb_id from $g4[member_table] where mb_id = '그누보드' ";
$row = sql_fetch($sql);
if ($member[mb_id]) {
echo "{$row[mb_id]}";
}else{
echo "{$row[mb_id]}";
}
$row = sql_fetch($sql);
if ($member[mb_id]) {
echo "{$row[mb_id]}";
}else{
echo "{$row[mb_id]}";
}
이렇게 하면~
mb_id 필드에 그누보드 값만 불러오죵~
근데 제가 하고자 하는 것은~
위처럼 했을 때~
mb_id 필드에 그누보드, 그누보드2, 그누보드3, 그누보드4
이렇게 포함된 것까지 뽑으려면~
어떻게 해야할까요? ^ ^
댓글 전체
mb_id like '그누보드%'
$sql = " select mb_id from $g4[member_table] where mb_id in ( '그누보드', '그누보드2', '그누보드3', '그누보드4' ";
$ress = sql_query($sql);
while( $row= mysql_fetch_row( $ress)) echo $row[0];
$ress = sql_query($sql);
while( $row= mysql_fetch_row( $ress)) echo $row[0];
그누보드4') ";
뒤에 괄호하나 빠졌습니다 ^^
뒤에 괄호하나 빠졌습니다 ^^
예리하시군요 ^^
감사합니다! ^ ^
정규표현식을 사용해도 됩니다.
where mb_id REGEXP '^그누보드(2|3|4)?$'
어제 만들어놓은 420만건 데이타로 테스트 해보니
정규표현식으로 했을 경우
인덱스를 타지 않는 군요
인덱스 설정된 필드에 대해 검색할 경우 in 으로 하는 경우가 제일 빠르네요
where mb_id REGEXP '^그누보드(2|3|4)?$'
어제 만들어놓은 420만건 데이타로 테스트 해보니
정규표현식으로 했을 경우
인덱스를 타지 않는 군요
인덱스 설정된 필드에 대해 검색할 경우 in 으로 하는 경우가 제일 빠르네요
테스트 리포트 입니다.
그냥 한번씩만 테스트 했습니다.
mysql> select count(*) from dbckdghk;
+----------+
| count(*) |
+----------+
| 4198990 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW COLUMNS FROM `dbckdghk`;
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| uid | int(10) unsigned | | PRI | NULL | auto_increment |
| gr_id | varchar(40) | | | | |
| bo_table | varchar(40) | | | | |
| mb_id | varchar(40) | | MUL | | |
| mb_name | varchar(40) | | | | |
| title | varchar(255) | | | | |
| link | varchar(255) | | | | |
| contents | text | | | | |
+----------+------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
[mb_id에만 인덱스가 잡혀 있는 상태에서 쿼리 실행]
SELECT *
FROM `dbckdghk`
WHERE `gr_id` LIKE 'g4_qa%'
LIMIT 0 , 30
Empty set (19.89 sec)
SELECT *
FROM `dbckdghk`
WHERE `gr_id` in ('g4_qa', 'g4_qa2', 'g4_qa3', 'g4_qa4')
LIMIT 0 , 30
Empty set (21.45 sec)
SELECT *
FROM `dbckdghk`
WHERE `gr_id` REGEXP '^g4_qa(2|3|4)?$'
LIMIT 0 , 30
Empty set (22.13 sec)
SELECT *
FROM `dbckdghk`
WHERE `mb_id` LIKE 'dbckdghk%'
LIMIT 0 , 30
30 rows in set (0.20 sec)
SELECT *
FROM `dbckdghk`
WHERE `mb_id` in ('dbckdghk', 'dbckdghk2', 'dbckdghk3', 'dbckdghk4')
LIMIT 0 , 30
30 rows in set (0.19 sec)
SELECT *
FROM `dbckdghk`
WHERE `mb_id` REGEXP '^dbckdghk(2|3|4)?$'
LIMIT 0 , 30
30 rows in set (2.68 sec)
[sql 해석]
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `gr_id` LIKE 'g4_qa%'
-> LIMIT 0 , 30;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `gr_id` in ('g4_qa', 'g4_qa2', 'g4_qa3', 'g4_qa4')
-> LIMIT 0 , 30 ;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `gr_id` REGEXP '^g4_qa(2|3|4)?$'
-> LIMIT 0 , 30 ;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `mb_id` LIKE 'dbckdghk%'
-> LIMIT 0 , 30;
+----------+-------+---------------+-------+---------+------+-------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+-------+---------------+-------+---------+------+-------+-------------+
| dbckdghk | range | mb_id | mb_id | 40 | NULL | 25661 | Using where |
+----------+-------+---------------+-------+---------+------+-------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `mb_id` in ('dbckdghk', 'dbckdghk2', 'dbckdghk3', 'dbckdghk4')
-> LIMIT 0 , 30 ;
+----------+-------+---------------+-------+---------+------+-------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+-------+---------------+-------+---------+------+-------+-------------+
| dbckdghk | range | mb_id | mb_id | 40 | NULL | 25664 | Using where |
+----------+-------+---------------+-------+---------+------+-------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `mb_id` REGEXP '^dbckdghk(2|3|4)?$'
-> LIMIT 0 , 30 ;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
그냥 한번씩만 테스트 했습니다.
mysql> select count(*) from dbckdghk;
+----------+
| count(*) |
+----------+
| 4198990 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW COLUMNS FROM `dbckdghk`;
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| uid | int(10) unsigned | | PRI | NULL | auto_increment |
| gr_id | varchar(40) | | | | |
| bo_table | varchar(40) | | | | |
| mb_id | varchar(40) | | MUL | | |
| mb_name | varchar(40) | | | | |
| title | varchar(255) | | | | |
| link | varchar(255) | | | | |
| contents | text | | | | |
+----------+------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
[mb_id에만 인덱스가 잡혀 있는 상태에서 쿼리 실행]
SELECT *
FROM `dbckdghk`
WHERE `gr_id` LIKE 'g4_qa%'
LIMIT 0 , 30
Empty set (19.89 sec)
SELECT *
FROM `dbckdghk`
WHERE `gr_id` in ('g4_qa', 'g4_qa2', 'g4_qa3', 'g4_qa4')
LIMIT 0 , 30
Empty set (21.45 sec)
SELECT *
FROM `dbckdghk`
WHERE `gr_id` REGEXP '^g4_qa(2|3|4)?$'
LIMIT 0 , 30
Empty set (22.13 sec)
SELECT *
FROM `dbckdghk`
WHERE `mb_id` LIKE 'dbckdghk%'
LIMIT 0 , 30
30 rows in set (0.20 sec)
SELECT *
FROM `dbckdghk`
WHERE `mb_id` in ('dbckdghk', 'dbckdghk2', 'dbckdghk3', 'dbckdghk4')
LIMIT 0 , 30
30 rows in set (0.19 sec)
SELECT *
FROM `dbckdghk`
WHERE `mb_id` REGEXP '^dbckdghk(2|3|4)?$'
LIMIT 0 , 30
30 rows in set (2.68 sec)
[sql 해석]
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `gr_id` LIKE 'g4_qa%'
-> LIMIT 0 , 30;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `gr_id` in ('g4_qa', 'g4_qa2', 'g4_qa3', 'g4_qa4')
-> LIMIT 0 , 30 ;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `gr_id` REGEXP '^g4_qa(2|3|4)?$'
-> LIMIT 0 , 30 ;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `mb_id` LIKE 'dbckdghk%'
-> LIMIT 0 , 30;
+----------+-------+---------------+-------+---------+------+-------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+-------+---------------+-------+---------+------+-------+-------------+
| dbckdghk | range | mb_id | mb_id | 40 | NULL | 25661 | Using where |
+----------+-------+---------------+-------+---------+------+-------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `mb_id` in ('dbckdghk', 'dbckdghk2', 'dbckdghk3', 'dbckdghk4')
-> LIMIT 0 , 30 ;
+----------+-------+---------------+-------+---------+------+-------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+-------+---------------+-------+---------+------+-------+-------------+
| dbckdghk | range | mb_id | mb_id | 40 | NULL | 25664 | Using where |
+----------+-------+---------------+-------+---------+------+-------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `dbckdghk`
-> WHERE `mb_id` REGEXP '^dbckdghk(2|3|4)?$'
-> LIMIT 0 , 30 ;
+----------+------+---------------+------+---------+------+---------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+------+---------------+------+---------+------+---------+-------------+
| dbckdghk | ALL | NULL | NULL | NULL | NULL | 4198990 | Using where |
+----------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
멋진 자료 감사합니다.
넘 어려워요. ㅋㅋ
넘 어려워요. ㅋㅋ
중요한 것은 인덱스를 잘 잡아주고
쿼리를 잘 선택해주기만 하면
420만건 데이터도 0.대의 실행결과를 나타낸다는 것입니다.
저도 대용량 데이터베이스 사용에 대해
아는 바가 없어서
노가다 수준의 테스트 결과 밖에 올릴수가 없네요
쿼리를 잘 선택해주기만 하면
420만건 데이터도 0.대의 실행결과를 나타낸다는 것입니다.
저도 대용량 데이터베이스 사용에 대해
아는 바가 없어서
노가다 수준의 테스트 결과 밖에 올릴수가 없네요
인덱스를 잘 만들어서 인덱스를 잘 태우는 것이 힘들죠.
그나마 인덱스 잡는것은 신경을 많이 쓰면서도 태우는것을 잘못해서 꽝인것이 많죠.
복수개의 필드가 인덱스일때 조건절을 잘못해서.... ㅋㅋㅋ
튜닝쪽은 너무 힘든것 같아요.
볼때는 그나마 좀 보이는데... 일들이 바빠서 다른것에 신경쓰다보면....
문제가 생기지 않거나... 시간이 진짜루 널널하지 않으면 보기가 힘드니 ....
시간좀 내서 이쪽을 보고있으면 다 놀고있는줄 알죠.ㅋㅋㅋ
그나마 인덱스 잡는것은 신경을 많이 쓰면서도 태우는것을 잘못해서 꽝인것이 많죠.
복수개의 필드가 인덱스일때 조건절을 잘못해서.... ㅋㅋㅋ
튜닝쪽은 너무 힘든것 같아요.
볼때는 그나마 좀 보이는데... 일들이 바빠서 다른것에 신경쓰다보면....
문제가 생기지 않거나... 시간이 진짜루 널널하지 않으면 보기가 힘드니 ....
시간좀 내서 이쪽을 보고있으면 다 놀고있는줄 알죠.ㅋㅋㅋ
복합 인덱스 일경우
where 절 이후의 순서가 중요하더군요
where 절 이후의 순서가 중요하더군요
REGEXP도 LIKE 만큼 빠르군요.
전 이때까지 regexp가 젤 빠른줄 알았는데
테스트 해보니까 아니더군요
테스트 해보니까 아니더군요
in
like 'a%'
REGEXP ^a
순 아닐까요?
like 'a%'
REGEXP ^a
순 아닐까요?
LIKE 'a%'는 인덱스 탑니다. %가 앞에 오면 안되겠지만...
REGEXP 는 어떻게 처리하는지 잘모르겠군요. ^^
REGEXP 는 어떻게 처리하는지 잘모르겠군요. ^^
위 단순 테스트 결과론
인덱스가 걸려있지않은 필드에 대한 검색일 경우에는
like 'a%'
in ('a')
REGEXP '^a'
순이구요
인덱스가 걸려있는 필드에 대한 검색일경우에는
in ('a')
like 'a%'
REGEXP '^a'
순 이군요
REGEXP 는 인덱스가 걸려있는 필드나 그렇지 않은 필드나 모두 전체 검색을 하네요
인덱스가 걸려있지않은 필드에 대한 검색일 경우에는
like 'a%'
in ('a')
REGEXP '^a'
순이구요
인덱스가 걸려있는 필드에 대한 검색일경우에는
in ('a')
like 'a%'
REGEXP '^a'
순 이군요
REGEXP 는 인덱스가 걸려있는 필드나 그렇지 않은 필드나 모두 전체 검색을 하네요
시간은 데이터 파일을 검색하느냐, 인덱스 파일을 검색하느냐, 인덱스를 타느냐 순으로 짧아 집니다.
인덱스를 타려면 %a같은 형태는 안 되는 걸 다 아시겠죠.
explain해 보시면
Like a%나 regexp ^a는 레인지 스캔을 합니다. 단순 문자열 성능은(아래 참조) like가 빠르고요.
하지만 in은 바로 꼭 집어 옵니다.
인덱스를 타려면 %a같은 형태는 안 되는 걸 다 아시겠죠.
explain해 보시면
Like a%나 regexp ^a는 레인지 스캔을 합니다. 단순 문자열 성능은(아래 참조) like가 빠르고요.
하지만 in은 바로 꼭 집어 옵니다.
아래는 단순히 문자열 비교 성능을 보여 줍니다.
<pre>
mysql> select benchmark( 10000000, 'aaa' regexp '^aaa');
+-------------------------------------------+
| benchmark( 10000000, 'aaa' regexp '^aaa') |
+-------------------------------------------+
| 0 |
+-------------------------------------------+
1 row in set (5.91 sec)
mysql> select benchmark( 10000000, 'aaa' like 'a%');
+---------------------------------------+
| benchmark( 10000000, 'aaa' like 'a%') |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.64 sec)
mysql> select benchmark( 10000000, 'aaa' ='aaa');
+------------------------------------+
| benchmark( 10000000, 'aaa' ='aaa') |
+------------------------------------+
| 0 |
+------------------------------------+
1 row in set (0.91 sec)
mysql> select benchmark( 10000000, 'aaa' like 'aaa%');
+-----------------------------------------+
| benchmark( 10000000, 'aaa' like 'aaa%') |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
1 row in set (1.06 sec)
</pre>
<pre>
mysql> select benchmark( 10000000, 'aaa' regexp '^aaa');
+-------------------------------------------+
| benchmark( 10000000, 'aaa' regexp '^aaa') |
+-------------------------------------------+
| 0 |
+-------------------------------------------+
1 row in set (5.91 sec)
mysql> select benchmark( 10000000, 'aaa' like 'a%');
+---------------------------------------+
| benchmark( 10000000, 'aaa' like 'a%') |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.64 sec)
mysql> select benchmark( 10000000, 'aaa' ='aaa');
+------------------------------------+
| benchmark( 10000000, 'aaa' ='aaa') |
+------------------------------------+
| 0 |
+------------------------------------+
1 row in set (0.91 sec)
mysql> select benchmark( 10000000, 'aaa' like 'aaa%');
+-----------------------------------------+
| benchmark( 10000000, 'aaa' like 'aaa%') |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
1 row in set (1.06 sec)
</pre>
좋은 테스트 결과입니다.
사실 이런 저런 테스트 해본다는 것 자체가
많은 관심과 노력이 필요합니다.
사실 이런 저런 테스트 해본다는 것 자체가
많은 관심과 노력이 필요합니다.