select_list
SELECT List
SELECT로 List 데이터를 조회
SELECT로 List 데이터를 조회합니다.
테스트 데이터 입력
Example
명령> | rpush mylist1 value10 value30 value50 value20 value40 |
결과> | 5 |
명령> | rpush mylist2 110 120 130 140 150 |
결과> | 5 |
명령> | rpush mylist3 AAA BBB CCC DDD EEE |
결과> | 5 |
SQL Insert 문으로 입력
Example
명령> | insert into list values('mylist1', 'value40', 'value20', 'value50', 'value30', 'value10'); |
결과> | 1 inserted |
명령> | insert into list values('mylist2', '150', '140', '130', '120', '110'); |
결과> | 1 inserted |
명령> | insert into list values('mylist3', 'EEE', 'DDD', 'CCC', 'BBB', 'AAA'); |
결과> | 1 inserted |
SELECT
SELECT *
SELECT key,value
SELECT key
SELECT value
FROM
FROM list.*
FROM list.mylist*
FROM list.mylist1
SELECT * FROM LIST.MYLIST*
List의 키와 값(value)를 조회한다.
Example
명령> | select * from list.mylist*; |
결과> |
0) key|value 1) mylist1|value10 2) mylist1|value30 3) mylist1|value50 4) mylist1|value20 5) mylist1|value40 6) mylist2|110 7) mylist2|120 8) mylist2|130 9) mylist2|140 10) mylist2|150 11) mylist3|AAA 12) mylist3|BBB 13) mylist3|CCC 14) mylist3|DDD 15) mylist3|EEE |
명령> | select * from list.mylist1; |
결과> |
0) key|value 1) mylist1|value10 2) mylist1|value30 3) mylist1|value50 4) mylist1|value20 5) mylist1|value40 |
명령> | select key from list.mylist*; |
결과> |
0) key 1) mylist1 2) mylist2 3) mylist3 |
ORDER BY
정렬(sort)해서 보여준다.
Example
명령> | select value from list.mylist1 order by value; |
결과> |
0) value 1) value10 2) value20 3) value30 4) value40 5) value50 |
명령> | select value from list.mylist1 order by value desc; |
결과> |
0) value 1) value50 2) value40 3) value30 4) value20 5) value10 |
정렬(sort) 순서: 숫자 < 문자
레디스에서는 숫자와 문자를 같이 소트할 수 있습니다. 숫자는 문자보다 작은 것으로 취급합니다.
Example
명령> | select * from list.mylist* order by value; |
결과> |
0) key|value 1) mylist2|110 2) mylist2|120 3) mylist2|130 4) mylist2|140 5) mylist2|150 6) mylist3|AAA 7) mylist3|BBB 8) mylist3|CCC 9) mylist3|DDD 10) mylist3|EEE 11) mylist1|value10 12) mylist1|value20 13) mylist1|value30 14) mylist1|value40 15) mylist1|value50 |
LIMIT
출력 행 수를 제한한다.
Example
명령> | select * from list.mylist* order by value limit 5; |
결과> |
0) key|value 1) mylist2|110 2) mylist2|120 3) mylist2|130 4) mylist2|140 5) mylist2|150 |
명령> | select * from list.mylist* order by value desc limit 5; |
결과> |
0) key|value 1) mylist1|value50 2) mylist1|value40 3) mylist1|value30 4) mylist1|value20 5) mylist1|value10 |
LIMIT OFFSET
- offset을 사용하면 지정한 숫자만큼 건너뛰고 출력합니다. 3을 지정하면 3행을 건너뛰고 4행부터 출력합니다.
- offset을 생략하고 컴마(,)를 사용할 경우 offset 숫자를 앞에 위치시킵니다.
Example
명령> | select * from list.mylist* order by value limit 5 offset 3; --> 3행 건너 5행 출력 |
결과> |
0) key|value 1) mylist2|140 2) mylist2|150 3) mylist3|AAA 4) mylist3|BBB 5) mylist3|CCC |
명령> | select * from list.mylist* order by value limit 3, 5; --> 3행 건너 5행 출력 |
결과> |
0) key|value 1) mylist2|140 2) mylist2|150 3) mylist3|AAA 4) mylist3|BBB 5) mylist3|CCC |
FUNCTIONS
COUNT(), LEN()
개수를 조회한다.
len()는 list, set, zset, hash, stream에서 값(value)의 개수를 조회하는데 사용된다.
아래 세 번째 예처럼 len()를 사용하는 것이 네 번째 예처럼 group by key를 사용하는 것보다 훨씬 속도가 빠르다.
Example
명령> | select count(*) from list.mylist*; --> 이 경우 값(value)의 개수를 일일이 세는 것이 아니고 각 키에서 값의 개수를 가져와서 더한다. 즉, 각 키에서 llen 명령을 실행해서 개수를 가져오는 것과 같다. 그러므로 속도가 빠르다. |
결과> |
0) count(*) 1) 15 |
명령> | select count(key) from list.mylist*; |
결과> |
0) count(key) 1) 3 |
명령> | select key, len(key) from list.mylist*; |
결과> |
0) key|len(key) 1) mylist1|5 2) mylist2|5 3) mylist3|5 |
명령> | select key, count(*) from list.mylist* group by key; |
결과> |
0) key|count(*) 1) mylist1|5 2) mylist2|5 3) mylist3|5 |
MAX(), MIN()
최댓값, 최솟값을 조회한다.
레디스에서는 문자와 숫자를 같은 선상에 놓고 비교할 수 있습니다.
숫자는 문자보다 작은 것으로 취급해서 min, max를 계산합니다.
Example
명령> | select min(value),max(value) from list.mylist1; |
결과> |
0) min(value)|max(value) 1) value10|value50 |
명령> | select min(value),max(value) from list.mylist*; |
결과> |
0) min(value)|max(value) 1) 110|value50 |
명령> | select key,min(value),max(value) from list.mylist* group by key; |
결과> |
0) key|min(value)|max(value) 1) mylist1|value10|value50 2) mylist2|110|150 3) mylist3|AAA|EEE |
MAX(value1, value2): 둘 중 큰 값 출력
MIN(value1, value2): 둘 중 작은 값 출력
Example
명령> | select max('A','B'); --> from 절 없이도 사용 가능합니다. |
결과> |
0) max('A','B') 1) B |
명령> | select max(135,value) from list.mylist2; |
결과> |
0) max(135,value) 1) 135 2) 135 3) 135 4) 140 5) 150 |
명령> | select min('CCC',value) from list.mylist3; |
결과> |
0) min('CCC',value) 1) AAA 2) BBB 3) CCC 4) CCC 5) CCC |
숫자 함수
SUM(), AVG()
합계, 평균을 구한다.
Example
명령> | select sum(value) from list.mylist2; |
결과> |
0) sum(value) 1) 650 |
명령> | select avg(value) from list.mylist2; |
결과> |
0) avg(value) 1) 130.0 |
문자, 숫자가 섞여 있을 경우에는 숫자만 계산합니다.
Example
명령> | select sum(value) from list.mylist* |
결과> |
0) sum(value) 1) 650 |
기타 함수
group_concat
값(value)를 묶어서 출력합니다. 구분자를 사용할 수 있습니다.
Example
명령> | select key,group_concat(value) from list.mylist1; |
결과> |
0) key|group_concat(value) 1) mylist1|value10,value30,value50,value20,value40 |
명령> | select key,group_concat(value,'') from list.mylist1; |
결과> |
0) key|group_concat(value) 1) mylist1|value10value30value50value20value40 |
명령> | select key,group_concat(value,' and ') from list.mylist1; |
결과> |
0) key|group_concat(value) 1) mylist1|value10 and value30 and value50 and value20 and value40 |
WHERE 조건
비교: =, <, <=, >, >=, !=, <>
값(value) 비교: 숫자
Example
명령> | select * from list.mylist2 where value = 130; |
결과> |
0) key|value 1) mylist2|130 |
명령> | select * from list.mylist2 where value > 130; |
결과> |
0) key|value 1) mylist2|140 2) mylist2|150 |
명령> | select * from list.mylist2 where value < 130; |
결과> |
0) key|value 1) mylist2|110 2) mylist2|120 |
명령> | select * from list.mylist2 where value != 130; |
결과> |
0) key|value 1) mylist2|110 2) mylist2|120 3) mylist2|140 4) mylist2|150 |
값(value) 비교: 문자
Example
명령> | select * from list.mylist1 where value > 'value30'; |
결과> |
0) key|value 1) mylist1|value50 2) mylist1|value40 |
명령> | select * from list.mylist1 where value >= 'value30'; |
결과> |
0) key|value 1) mylist1|value30 2) mylist1|value50 3) mylist1|value40 |
명령> | select * from list.mylist1 where value != 'value30'; |
결과> |
0) key|value 1) mylist1|value10 2) mylist1|value50 3) mylist1|value20 4) mylist1|value40 |
AND, OR
Example
명령> | select * from list.mylist2 where value >= 120 and value < 140; |
결과> |
0) key|value 1) mylist2|120 2) mylist2|130 |
명령> | select * from list.mylist2 where value <= 120 or value > 140; |
결과> |
0) key|value 1) mylist2|110 2) mylist2|120 3) mylist2|150 |
BETWEEN
Example
명령> | select * from list.mylist2 where value between 120 and 140; |
결과> |
0) key|value 1) mylist2|120 2) mylist2|130 3) mylist2|140 |
명령> | select * from list.mylist2 where value not between 120 and 140; |
결과> |
0) key|value 1) mylist2|110 2) mylist2|150 |
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 list values('mylist4', 'USER-C01', 'USER-B02', 'USER-B01', 'USER-A02', 'USER-A01'); |
결과> | 1 inserted |
명령> | select * from list.mylist4 where value glob 'USER-A*'; |
결과> |
0) key|value 1) mylist4|USER-A01 2) mylist4|USER-A02 |
명령> | select * from list.mylist4 where value glob '*01*'; |
결과> |
0) key|value 1) mylist4|USER-A01 2) mylist4|USER-B01 3) mylist4|USER-C01 |
명령> | select * from list.mylist4 where value glob 'USER-[AC]*'; |
결과> |
0) key|value 1) mylist4|USER-A01 2) mylist4|USER-A02 3) mylist4|USER-C01 |
NOT GLOB
Example
명령> | select * from list.mylist4 where value not glob 'USER-A*'; |
결과> |
0) key|value 1) mylist4|USER-B01 2) mylist4|USER-B02 3) mylist4|USER-C01 |
명령> | select * from list.mylist4 where value not glob '*01*'; |
결과> |
0) key|value 1) mylist4|USER-A02 2) mylist4|USER-B02 |
명령> | select * from list.mylist4 where value not glob 'USER-[AC]*'; |
결과> |
0) key|value 1) mylist4|USER-B01 2) mylist4|USER-B02 |
LIKE
%(퍼센트), _(밑줄)
대소문자를 구분하지 않는다.
가능하면 LIKE를 사용하지 말고 GLOB를 사용하세요.
LIKE는 대소문자를 구분하지 않기 때문에 검색 범위가 넓어서 GLOB보다 속도가 느립니다.
Example
명령> | select * from list.mylist4 where value like 'user-a%'; |
결과> |
0) key|value 1) mylist4|USER-A01 2) mylist4|USER-A02 |
명령> | select * from list.mylist4 where value like '%01%'; |
결과> |
0) key|value 1) mylist4|USER-A01 2) mylist4|USER-B01 3) mylist4|USER-C01 |
NOT LIKE
Example
명령> | select * from list.mylist4 where value not like 'user-a%'; |
결과> |
0) key|value 1) mylist4|USER-B01 2) mylist4|USER-B02 3) mylist4|USER-C01 |
명령> | select * from list.mylist4 where value not like '%01%'; |
결과> |
0) key|value 1) mylist4|USER-A02 2) mylist4|USER-B02 |
IN
Example
명령> | select key from list.mylist* where key in ('mylist1','mylist2') |
결과> |
0) key 1) mylist1 2) mylist2 |
명령> | select * from list.mylist3 where value in ('AAA','CCC'); |
결과> |
0) key|value 1) mylist3|AAA 2) mylist3|CCC |
명령> | select * from list.mylist2 where value in (120,140); |
결과> |
0) key|value 1) mylist2|120 2) mylist2|140 |
NOT IN
Example
명령> | select key from list.mylist* where key not in ('mylist1','mylist2'); |
결과> |
0) key|value 1) mylist3 2) mylist4 |
명령> | select * from list.mylist3 where value not in ('AAA','CCC'); |
결과> |
0) key|value 1) mylist3|BBB 2) mylist3|DDD 3) mylist3|EEE |
명령> | select * from list.mylist2 where value not in (120,140); |
결과> |
0) key|value 1) mylist2|110 2) mylist2|130 3) mylist2|150 |
GROUP BY
Example
명령> |
select key,count(*) from list.mylist* group by key; --> 이것 보다는 select key, len(key) from list.mylist*; 를 사용하세요. 속도가 훨씩 빠릅니다. |
결과> |
0) key|count(*) 1) mylist1|5 2) mylist2|5 3) mylist3|5 4) mylist4|5 |
명령> | select key,min(value),max(value) from list.mylist* group by key; |
결과> |
0) key|min(value)|max(value) 1) mylist1|value10|value50 2) mylist2|110|150 3) mylist3|AAA|EEE 4) mylist4|USER-A01|USER-C01 |
성능 Performance
테스트 데이터 입력
redis-benchmark를 이용해서 총 30만개 키를 입력합니다.
listA 10만개, listB 10만개, listC 10만개.
src/redis-benchmark -c 5 -n 100000 -r 1000000000 lpush listA ele___rand_int__
src/redis-benchmark -c 5 -n 100000 -r 1000000000 lpush listB ele___rand_int__
src/redis-benchmark -c 5 -n 100000 -r 1000000000 lpush listC ele___rand_int__
쿼리 성능
- --> List에서 쿼리는 list의 왼쪽에서 오른쪽으로 값을 조회합니다.
- select * from list.mylist1; -> (253us) full value scan opcode
- select value from list.mylist1 order by value; -> (289us) full value scan, sort opcode
- select count(*) from list.list*; -> count: 300000 (261us) key scan, get count opcode
- select key, len(key) from list.list*; -> (277us) key scan, get count opcode
- select key, count(*) from list.list* group by key; -> (18ms) full value scan opcode
- --> group by count는 속도가 느립니다. len(key)를 사용하세요.
- select value from list.listA order by value limit 50000, 10; -> (83ms) full value scan, sort opcode
- select * from list.listA where value = 'ele_000460668562'; -> (12ms) full value scan opcode
- select * from list.listA where value in ('ele_000460668562'); -> (11ms) full value scan opcode
- --> Value에 대한 비교는 full value scan하기 때문에 속도가 느리다.
OPCODE
select * from list.mylist1; -> full value scan
select value from list.mylist1 order by value; -> full value scan, sort
select count(*) from list.list*; -> key scan, get count
select key, len(key) from list.list*; -> key scan, get count
select key, count(*) from list.list* group by key; -> full value scan
select value from list.listA order by value limit 50000, 10; -> full value scan, sort
select * from list.listA where value = 'ele_000460668562'; -> full value scan
select * from list.listA where value in ('ele_000460668562'); -> full value scan
<< Select String | Select List | Select Set >> |
---|