select_set
SELECT Set
SELECT로 Set 데이터를 조회
SELECT로 Set 데이터를 조회합니다.
테스트 데이터 입력: Redis 명령으로 입력
Example
명령> | sadd myset1 mem10 mem20 mem30 mem40 mem50 |
결과> | 5 |
명령> | sadd myset2 10 20 30 40 50 |
결과> | 5 |
명령> | sadd myset3 45.6 12.3 34.5 23.4 56.7 |
결과> | 5 |
SQL Insert 문으로 입력
Example
명령> | insert into set values('myset1', 'mem10', 'mem20', 'mem30', 'mem40', 'mem50'); |
결과> | 1 inserted |
명령> | insert into set values('myset2', 10, 20, 30, 40, 50); |
결과> | 1 inserted |
명령> | insert into set values('myset3', 45.6, 12.3, 34.5, 23.4, 56.7); |
결과> | 1 inserted |
SELECT
SELECT *
SELECT key, value
SELECT key
SELECT value
SELECT key key_name or key AS key_name --> alias(별명) 사용 가능
FROM
FROM set.*
FROM set.myset*
FROM set.myset1
SELECT * FROM SET.MYSET*
Set의 키와 값(value)를 조회한다.
Example
명령> | select * from set.myset*; |
결과> |
0) key|value 1) myset1|mem30 2) myset1|mem20 3) myset1|mem40 4) myset1|mem10 5) myset1|mem50 6) myset2|10 7) myset2|20 8) myset2|30 9) myset2|40 10) myset2|50 11) myset3|23.4 12) myset3|34.5 13) myset3|12.3 14) myset3|45.6 15) myset3|56.7 |
명령> | select * from set.myset1; |
결과> |
0) key|value 1) myset1|mem30 2) myset1|mem20 3) myset1|mem40 4) myset1|mem10 5) myset1|mem50 |
명령> | select key from set.myset*; |
결과> |
0) key 1) myset1 2) myset2 3) myset3 |
ORDER BY
정렬(sort)해서 보여준다.
Example
명령> | select value from set.myset1 order by value; |
결과> |
0) value 1) mem10 2) mem20 3) mem30 4) mem40 5) mem50 |
명령> | select value from set.myset1 order by value desc; |
결과> |
0) value 1) mem50 2) mem40 3) mem30 4) mem20 5) mem10 |
정렬(sort) 순서: 숫자 < 문자
레디스에서는 숫자와 문자를 같이 소트할 수 있습니다. 숫자는 문자보다 작은 것으로 취급합니다.
Example
명령> | select * from set.myset* order by value; |
결과> |
0) key|value 1) myset2|10 2) myset3|12.3 3) myset2|20 4) myset3|23.4 5) myset2|30 6) myset3|34.5 7) myset2|40 8) myset3|45.6 9) myset2|50 10) myset3|56.7 11) myset1|mem10 12) myset1|mem20 13) myset1|mem30 14) myset1|mem40 15) myset1|mem50 |
LIMIT
출력 행 수를 제한한다.
Example
명령> | select * from set.myset* order by value limit 5; |
결과> |
0) key|value 1) myset2|10 2) myset3|12.3 3) myset2|20 4) myset3|23.4 5) myset2|30 |
명령> | select * from set.myset* order by value desc limit 5; |
결과> |
0) key|value 1) myset1|mem50 2) myset1|mem40 3) myset1|mem30 4) myset1|mem20 5) myset1|mem10 |
LIMIT OFFSET
- offset을 사용하면 지정한 숫자만큼 건너뛰고 출력합니다. 3을 지정하면 3행을 건너뛰고 4행부터 출력합니다.
- offset을 생략하고 컴마(,)를 사용할 경우 offset 숫자를 앞에 위치시킵니다.
Example
명령> | select * from set.myset* order by value limit 5 offset 3; --> 3행 건너 5행 출력 |
결과> |
0) key|value 1) myset3|23.4 2) myset2|30 3) myset3|34.5 4) myset2|40 5) myset3|45.6 |
명령> | select * from set.myset* order by value limit 3, 5; --> 3행 건너 5행 출력 |
결과> |
0) key|value 1) myset3|23.4 2) myset2|30 3) myset3|34.5 4) myset2|40 5) myset3|45.6 |
FUNCTIONS
COUNT(), CARD()
개수를 조회한다.
card()는 list, set, zset, hash, stream에서 값(value)의 개수를 조회하는데 사용된다.
아래 세 번째 예처럼 card()를 사용하는 것이 네 번째 예처럼 group by key를 사용하는 것보다 훨씬 속도가 빠르다.
Example
명령> | select count(*) from set.myset*; |
결과> |
0) count(*) 1) 15 |
명령> | select count(key) from set.myset*; |
결과> |
0) count(key) 1) 3 |
명령> | select key, card(key) from set.myset*; |
결과> |
0) key|card(key) 1) myset1|5 2) myset2|5 3) myset3|5 |
명령> | select key, count(*) from set.myset* group by key; |
결과> |
0) key|count(*) 1) myset1|5 2) myset2|5 3) myset3|5 |
MAX(), MIN()
최댓값, 최솟값을 조회한다.
레디스에서는 문자와 숫자를 같은 선상에 놓고 비교할 수 있습니다.
숫자는 문자보다 작은 것으로 취급해서 min, max를 계산합니다.
Example
명령> | select min(value),max(value) from set.myset1; |
결과> |
0) min(value)|max(value) 1) mem10|mem50 |
명령> | select min(value),max(value) from set.myset*; |
결과> |
0) min(value)|max(value) 1) 10|mem50 |
명령> | select key,min(value),max(value) from set.myset* group by key; |
결과> |
0) key|min(value)|max(value) 1) myset1|mem10|mem50 2) myset2|10|50 3) myset3|12.3|56.7 |
MAX(value1, value2): 둘 중 큰 값 출력
MIN(value1, value2): 둘 중 작은 값 출력
Example
명령> | select max('A','B') |
결과> |
0) max('A','B') 1) B |
명령> | select max(30,value) from set.myset2; |
결과> |
0) max(30,value) 1) 30 2) 30 3) 30 4) 40 5) 50 |
명령> | select min('mem30',value) from set.myset1; |
결과> |
0) min('mem30',value) 1) mem30 2) mem20 3) mem30 4) mem10 5) mem30 |
숫자 함수
SUM(), AVG()
합계, 평균을 구한다.
Example
명령> | select sum(value) from set.myset2; |
결과> |
0) sum(value) 1) 150 |
명령> | select avg(value) from set.myset2; |
결과> |
0) avg(value) 1) 30.0 |
문자, 숫자가 섞여 있을 경우에는 숫자만 계산한다.
Example
명령> | select sum(value) from set.myset* |
결과> |
0) sum(value) 1) 322.5 |
기타 함수
group_concat
Example
명령> | select key,group_concat(value) from set.myset1; |
결과> |
0) key|group_concat(value) 1) myset1|mem10,mem40,mem30,mem20,mem50 |
명령> | select key,group_concat(value,'') from set.myset1; |
결과> |
0) key|group_concat(value) 1) myset1|mem10mem40mem30mem20mem50 |
명령> | select key,group_concat(value,' and ') from set.myset1; |
결과> |
0) key|group_concat(value) 1) myset1|mem10 and mem40 and mem30 and mem20 and mem50 |
WHERE 조건
비교: =, <, <=, >, >=, !=, <>
값(value) 비교: 숫자
Example
명령> | select * from set.myset2 where value = 30; |
결과> |
0) key|value 1) myset2|30 |
명령> | select * from set.myset2 where value > 30; |
결과> |
0) key|value 1) myset2|40 2) myset2|50 |
명령> | select * from set.myset2 where value < 30; |
결과> |
0) key|value 1) myset2|10 2) myset2|20 |
명령> | select * from set.myset2 where value != 30; |
결과> |
0) key|value 1) myset2|10 2) myset2|20 3) myset2|40 4) myset2|50 |
값(value) 비교: 문자
Example
명령> | select * from set.myset1 where value > 'mem30'; |
결과> |
0) key|value 1) myset1|mem40 2) myset1|mem50 |
명령> | select * from set.myset1 where value >= 'mem30'; |
결과> |
0) key|value 1) myset1|mem40 2) myset1|mem30 3) myset1|mem50 |
명령> | select * from set.myset1 where value != 'mem30'; |
결과> |
0) key|value 1) myset1|mem10 2) myset1|mem40 3) myset1|mem20 4) myset1|mem50 |
AND, OR
Example
명령> | select * from set.myset2 where value >= 20 and value < 40; |
결과> |
0) key|value 1) myset2|20 2) myset2|30 |
명령> | select * from set.myset2 where value <= 20 or value > 40; |
결과> |
0) key|value 1) myset2|10 2) myset2|20 3) myset2|50 |
BETWEEN
Example
명령> | select * from set.myset2 where value between 20 and 40; |
결과> |
0) key|value 1) myset2|20 2) myset2|30 3) myset2|40 |
명령> | select * from set.myset2 where value not between 20 and 40; |
결과> |
0) key|value 1) myset2|10 2) myset2|50 |
GLOB
*(별표), ?(물음표)
대소문자를 구분한다.
- [AB]: A, B 문자가 들어간 문자열를 검색할 경우
- [A-C]: A에서 C까지(A,B,C) 문자가 들어간 문자열을 검색할 경우
- [A-Z]: 알파벳 대문자가 들어가 문자열을 검색할 경우
- [a-z]: 알파벳 소문자가 들어가 문자열을 검색할 경우
- [A-Za-z]: 알파벳이 들어가 문자열을 검색할 경우
- [A-z]: 이렇게 지정하면 Z와 a 사이에 [,\,],^,_,' 가 있어서 이런 특수문자가 포함됩니다.
Example
명령> | insert into set values('myset4','USER-A01','USER-A02','USER-B01','USER-B02','USER-C01'); |
결과> | 1 inserted |
명령> | select * from set.myset4 where value glob 'USER-A*'; |
결과> |
0) key|value 1) myset4|USER-A02 2) myset4|USER-A01 |
명령> | select * from set.myset4 where value glob '*01*'; |
결과> |
0) key|value 1) myset4|USER-A01 2) myset4|USER-B01 3) myset4|USER-C01 |
명령> | select * from set.myset4 where value glob 'USER-[AC]*'; |
결과> |
0) key|value 1) myset4|USER-A02 2) myset4|USER-A01 3) myset4|USER-C01 |
NOT GLOB
Example
명령> | select * from set.myset4 where value not glob 'USER-A*'; |
결과> |
0) key|value 1) myset4|USER-B02 2) myset4|USER-B01 3) myset4|USER-C01 |
명령> | select * from set.myset4 where value not glob '*01*'; |
결과> |
0) key|value 1) myset4|USER-A02 2) myset4|USER-B02 |
명령> | select * from set.myset4 where value not glob 'USER-[AC]*'; |
결과> |
0) key|value 1) myset4|USER-B02 2) myset4|USER-B01 |
LIKE
%(퍼센트), _(밑줄)
대소문자를 구분하지 않는다.
가능하면 LIKE를 사용하지 말고 GLOB를 사용하세요.
LIKE는 대소문자를 구분하지 않기 때문에 검색 범위가 넓어서 GLOB보다 속도가 느립니다.
Example
명령> | select * from set.myset4 where value like 'user-a%'; |
결과> |
0) key|value 1) myset4|USER-A02 2) myset4|USER-A01 |
명령> | select * from set.myset4 where value like '%01%'; |
결과> |
0) key|value 1) myset4|USER-A01 2) myset4|USER-B01 3) myset4|USER-C01 |
NOT LIKE
Example
명령> | select * from set.myset4 where value not like 'user-a%'; |
결과> |
0) key|value 1) myset4|USER-B02 2) myset4|USER-B01 3) myset4|USER-C01 |
명령> | select * from set.myset4 where value not like '%01%'; |
결과> |
0) key|value 1) myset4|USER-A02 2) myset4|USER-B02 |
IN
Example
명령> | select key from set.myset* where key in ('myset1','myset2'); |
결과> |
0) key 1) myset1 2) myset2 |
명령> | select * from set.myset1 where value in ('mem10','mem30'); |
결과> |
0) key|value 1) myset1|mem10 2) myset1|mem30 |
명령> | select * from set.myset2 where value in (20,40); |
결과> |
0) key|value 1) myset1|20 2) myset1|40 |
NOT IN
Example
명령> | select key from set.myset* where key not in ('myset1','myset2'); |
결과> |
0) key 1) myset3 2) myset4 |
명령> | select * from set.myset1 where value not in ('mem10','mem30'); |
결과> |
0) key|value 1) myset1|mem40 2) myset1|mem20 3) myset1|mem50 |
명령> | select * from set.myset2 where value not in (20,40); |
결과> |
0) key|value 1) mylist2|10 2) mylist2|30 3) mylist2|50 |
GROUP BY
Example
명령> |
select key,count(*) from set.myset* group by key; --> 이것 보다는 select key, card(key) from set.myset*; 를 사용하세요. 속도가 훨씩 빠릅니다. |
결과> |
0) key|count(*) 1) myset1|5 2) myset2|5 3) myset3|5 4) myset4|5 |
명령> | select key,min(value),max(value) from set.myset* group by key; |
결과> |
0) key|min(value)|max(value) 1) myset1|mem10|mem50 2) myset2|10|50 3) myset3|12.3|56.7 4) myset4|USER-A01|USER-C01 |
성능 Performance
테스트 데이터 입력
redis-benchmark를 이용해서 총 30만개 키를 입력합니다.
setA 10만개, setB 10만개, setC 10만개.
src/redis-benchmark -c 5 -n 100100 -r 1000000000 sadd setA ele___rand_int__
src/redis-benchmark -c 5 -n 100100 -r 1000000000 sadd setB ele___rand_int__
src/redis-benchmark -c 5 -n 100100 -r 1000000000 sadd setC ele___rand_int__
쿼리 성능
- select * from set.myset1; -> (270us) full value scan opcode
- select value from set.myset1 order by value; -> (297us) full value scan, sort opcode
- select count(*) from set.set*; -> count: 300286 (201us) key scan, get count opcode
- select key, card(key) from set.set*; -> (232us) key scan, get count opcode
- select key, count(*) from set.set* group by key; -> (28ms) full value scan opcode
- --> group by count는 속도가 느립니다. card(key)를 사용하세요.
- select value from set.setA order by value limit 50000, 10; -> (87ms) full value scan, sort opcode
- select * from set.setA where value = 'ele_000463064363'; -> (276us) direct search opcode
- select * from set.setA where value in ('ele_000463064363'); -> (280us) direct search opcode
- --> Set에서 value에 equal(=)는 direct search로 속도가 빠릅니다.
OPCODE
select * from set.myset1;
select value from set.myset1 order by value;
select count(*) from set.set*;
select key, card(key) from set.set*;
select key, count(*) from set.set* group by key;
select value from set.setA order by value limit 50000, 10;
select * from set.setA where value = 'ele_000463064363';
select * from set.setA where value in ('ele_000463064363');
<< Select List | Select Set | Select ZSet >> |
---|