insert_intro
INSERT Introduction
동영상 설명은 아래에 있습니다.
형식: INSERT INTO DATATYPE VALUES('KEY','VALUE')
예 : INSERT INTO STRING VALUES('KEY','VALUE')
STRING 입력
- String key, value를 입력합니다. insert into string values('key','value')
- 컬럼 명은 지정하지 않습니다. insert into string
(key,value)values('key','value')
이하 다른 datatype에도 동일하게 적용됩니다. - 1 row(key, value) 입력: insert into string values('key','value')
- 여러 row 입력: insert into string values('key2','value2'), ('key3','value3'), ('key04','value4')
- 기존 키가 있으면 덮어씁니다(overwrite). 이것은 SET 명령의 작동과 동일합니다.
- Multi-row(여러 개 key, value 쌍 입력)은 1000까지 가능합니다. 이것은 MSET 명령의 작동과 동일합니다. multi-row 1000개까지는 이하 다른 datatype에도 동일하게 적용됩니다.
Example
컬럼 개수 오류
Example
명령> | insert into string values('key04'); |
결과> | ERR table string has 2 columns but 1 values were supplied |
명령> | insert into string values('key04','value1','value2'); |
결과> | ERR table string has 2 columns but 3 values were supplied |
LIST 입력
- List key, value를 입력합니다. insert into list values('mylist1','value1' [,'value2'])
- 1 row(key, value) 입력: insert into list values('mylist1','value1','value2')
이것은 LPUSH 명령의 작동과 동일합니다.
Column(컬럼)은 key를 포함해서 32,676개까지 가능합니다.
이하 다른 datatype에도 동일하게 적용됩니다. - 여러 row 입력: insert into list values('mylist2','value1','value2'), ('mylist3','value1','value2')
여러 row 입력 시 컬럼 갯수는 동일해야 합니다. 이하 다른 datatype에도 동일하게 적용됩니다.
Example
SET 입력
- Set key, value를 입력합니다. insert into set values('myset1','value1' [,'value2'])
- 1 row(key, value) 입력: insert into set values('myset1','value1','value2')
이것은 SADD 명령의 작동과 동일합니다. - 여러 row 입력: insert into set values('myset2','value1','value2'), ('myset3','value1','value2')
Example
ZSET 입력
- ZSet key, score, value를 입력합니다. insert into zset values('zset1', 23.5, 'value1' [, 25.7, 'value2'])
- 1 row(key, score, value) 입력: insert into zset values('zset1', 23.5, 'value1', 36.7, 'value2')
이것은 ZADD 명령의 작동과 동일합니다. - 여러 row 입력: insert into zset values('zset2', 23.5, 'value1'), ('zset3', 36.7, 'value2')
Example
Score(스코어) 오류
Example
명령> | insert into zset values('zset4','AAA','value1'); |
결과> | ERR value(score) is not a valid float |
HASH 입력
- Hash key, field, value를 입력합니다.
insert into hash values('myhash1', 'field1', 'value1' [,'field1', 'value1']) - 1 row(key, field, value) 입력: insert into hash values('myhash1', 'field1', 'value1', 'field2', 'value2')
이것은 HSET 명령의 작동과 동일합니다. - 여러 row 입력: insert into hash values('myhash2', 'field1', 'value1'),('myhash3', 'field1', 'value1')
Example
STREAM 입력
- Stream key, id, field, value를 입력합니다.
insert into stream values('sensor-1', '*', 'field1', 'value1')
id는 *만 가능합니다.
value에 숫자 입력 가능합니다. - 1 row(key, id, field, value) 입력: insert into stream values('sensor_1', '*', 'field1', 'value1' [,'field2', 'value2'])
이것은 XADD 명령의 작동과 동일합니다. - 여러 row 입력: insert into stream values('sensor_2', '*', 'field1', 'value1'), ('sensor-3', '*', 'field1', 50.7)
Example
Value에 입력 가능한 것들
숫자 계산 결과: 10+20, 10*20
- insert into string values('key05',10+20); -> 30 opcode
- insert into string values('key06',10*20); -> 200 opcode
Function 사용
- insert into string values('key07', min(10,20)); -> 10 opcode
- insert into string values('key08', max(10,20)); -> 20 opcode
- insert into string values('key09', round(12.675,1)); -> 12.7 opcode
- insert into string values('key10', upper('value')); -> 'VALUE' opcode
- insert into string values('key11', trim(' value ')); -> 'value' opcode
- insert into string values('key12', left('redisgate',5)); -> 'redis' opcode
- insert into string values('key13', 'AAA'||'BBB'); -> 'AAABBB' opcode
- insert into string values('key14', date('now','localtime')); -> '2022-02-18' opcode
- insert into string values('key15', datetime('now','localtime')); -> '2022-02-18 13:41:18' opcode
- insert into string values('key16', strftime('%Y-%m-%d %H:%M:%S','now','localtime')); opcode
-> '2022-02-18 13:41:22'
동영상 설명
Redis SQL Insert
Performance 성능
Redis-benchmark 성능
Datatype | 명령 | Cmds per sec | SQL INSERT (Cmds per sec) | 비교 |
---|---|---|---|---|
STRING | SET | 106,315 | 42,394 | 40% |
LIST | LPUSH | 121,595 | 51,106 | 42% |
SET | SADD | 121,094 | 52,731 | 44% |
ZSET | ZADD | 119,374 | 42,981 | 36% |
HASH | HSET | 119,274 | 50,836 | 43% |
합계 | 587,652 | 240,048 | 41% |
- Redis-benchmark로 redis 원래 명령과 insert를 각각 10만회 입력, 실행 시간 비교
- Redis 원래 명령에 비해 insert가 평균 41% 성능이 나온다.
STRING
- SET: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 set keyA___rand_int__ value___rand_int__
1000000 requests completed in 9.41 seconds, 106315.12 requests per second - INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into string values ('keyB___rand_int__','value___rand_int__')"
1,000,000 requests completed in 23.59 seconds, 42394.44 requests per second
LIST
- LPUSH: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 lpush mylist1 value___rand_int__
1000000 requests completed in 8.22 seconds, 121595.33 requests per second - INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into list values ('mylist2','value___rand_int__')"
1000000 requests completed in 19.57 seconds, 51106.46 requests per second
SET
- SADD: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 sadd myset1 value___rand_int__
1000000 requests completed in 8.26 seconds, 121094.69 requests per second - INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into set values ('myset2','value___rand_int__')"
1000000 requests completed in 18.96 seconds, 52731.49 requests per second
ZSET
- ZADD: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 zadd zset1 __rand_int__ value___rand_int__
1000000 requests completed in 8.38 seconds, 119374.48 per second - INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into zset values ('zset2', __rand_int__, 'value___rand_int__')"
1000000 requests completed in 23.27 seconds, 42981.17 requests per second
HASH
- HSET: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 hset myhash1 field___rand_int__ value___rand_int__
1000000 requests completed in 8.38 seconds, 119274.81 per second - INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into hash values ('myhash2', 'field___rand_int__', 'value___rand_int__')"
1000000 requests completed in 19.67 seconds, 50836.26 per second
Redis 내부 처리 시간 성능
Datatype | 구분 | 개수 | 성능 |
---|---|---|---|
String | SET | 1 | 3.58us |
INSERT | 1 | 26.19us | |
MSET | 10 | 20.01us | |
INSERT | 10 | 52.39us | |
List | LPUSH | 1 | 2.12us |
INSERT | 1 | 25.15us | |
Set | SADD | 1 | 1.17us |
INSERT | 1 | 24.29us | |
SADD | 20 | 10.94us | |
INSERT | 20 | 39.71us | |
ZSet | ZADD | 1 | 3.58us |
INSERT | 1 | 27.23us | |
ZADD | 20 | 19.61us | |
INSERT | 20 | 55.37us | |
Hash | HSET | 1 | 2.14us |
INSERT | 1 | 25.43us | |
Stream | XADD | 1 | 4.40us |
INSERT | 1 | 27.75us |
각각 1만회 실행 평균 소요 시간(단위: us(microsecond))
- 1개 key, value 입력 시 레디스 원래 명령 평균 시간 2.8us, insert 평균 시간 26.0us -> 약 9.2배 차이
- 10 or 20개 value 입력 시 레디스 원래 명령 평균 시간 16.9us, insert 평균 시간 49.2us -> 약 2.9배 차이
String
- for i in {1..10000}; do src/redis-ecli -p 7000 set key$i value$i; done -> 3.53us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into string values('key$i','value$i')"; done -> 26.19us
- 10개 key, value 입력
- for i in {1..10000}; do src/redis-ecli -p 7000 mset keyA$i valueA$i keyB$i valueB$i keyC$i valueC$i keyD$i valueD$i keyE$i valueE$i keyF$i valueF$i keyG$i valueG$i keyH$i valueH$i keyI$i valueI$i keyJ$i valueJ$i; done -> 20.01us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into string values('keyA$i','valueA$i'),('keyB$i','valueB$i'),('keyC$i','valueC$i'),('keyD$i','valueD$i'),('keyE$i','valueE$i'),('keyF$i','valueF$i'),('keyG$i','valueG$i'),('keyH$i','valueH$i'),('keyI$i','valueI$i'),('keyJ$i','valueJ$i')"; done -> 52.39us
List
- for i in {1..10000}; do src/redis-ecli -p 7000 lpush mylist1 value$i; done -> 2.12us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into list values('mylist2','value$i')"; done -> 25.15us
Set
- for i in {1..10000}; do src/redis-ecli -p 7000 sadd myset1 value$i; done -> 1.17us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into set values('myset2','value$i')"; done -> 24.29us
- 20개 value 입력
- for i in {1..10000}; do src/redis-ecli -p 7000 sadd myset1 AAA$i BBB$i CCC$i DDD$i EEE$i FFF$i GGG$i HHH$i III$i JJJ$i AAX$i BBX$i CCX$i DDX$i EEX$i FFX$i GGX$i HHX$i IIX$i JJX$i; done; -> 10.94us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into set values('myset2','AAA$i','BBB$i','CCC$i','DDD$i','EEE$i','FFF$i','GGG$i','HHH$i','III$i','JJJ$i', 'AAX$i','BBX$i','CCX$i','DDX$i','EEX$i','FFX$i','GGX$i','HHX$i','IIX$i','JJX$i')"; done; -> 39.71us
ZSet
- for i in {1..10000}; do src/redis-ecli -p 7000 zadd zset1 $i value$i; done -> 3.58us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into zset values('zset2',$i,'value$i')"; done -> 27.23us
- 20개 score, value 입력
- for i in {1..10000}; do src/redis-ecli -p 7000 zadd zset1 $i AAA$i $i BBB$i $i CCC$i $i DDD$i $i EEE$i $i FFF$i $i GGG$i $i HHH$i $i III$i $i JJJ$i $i AAX$i $i BBX$i $i CCX$i $i DDX$i $i EEX$i $i FFX$i $i GGX$i $i HHX$i $i IIX$i $i JJX$i; done; -> 19.61us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into zset values('zset2',$i,'AAA$i',$i,'BBB$i',$i,'CCC$i',$i,'DDD$i',$i,'EEE$i',$i,'FFF$i',$i,'GGG$i',$i,'HHH$i',$i,'III$i',$i,'JJJ$i', $i,'AAX$i',$i,'BBX$i',$i,'CCX$i',$i,'DDX$i',$i,'EEX$i',$i,'FFX$i',$i,'GGX$i',$i,'HHX$i',$i,'IIX$i',$i,'JJX$i')"; done; -> 55.37us
Hash
- for i in {1..10000}; do src/redis-ecli -p 7000 hset myhash1 field$i value$i; done -> 2.14us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into hash values('myhash2','field$i','value$i')"; done -> 25.43us
Stream
- for i in {1..10000}; do src/redis-ecli -p 7000 xadd stream1 '*' field$i $i; done -> 4.40us
- for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into stream values('stream2','*','field$i',$i)"; done -> 27.75us
OPCODE
insert into string values('key01','value');
insert into string values('key02','value2'), ('key03','value3'), ('key04','value4');
insert into list values('mylist1','value1','value2');
insert into list values('mylist2','value1','value2'), ('mylist3','value1','value2');
insert into set values('myset1','value1','value2');
insert into set values('myset2','value1','value2'), ('myset3','value1','value2');
insert into zset values('zset1', 23.5, 'value1', 36.7, 'value2');
insert into zset values('zset2', 23.5, 'value1'), ('zset3', 36.7, 'value2');
insert into hash values('myhash1', 'field1', 'value1', 'field2', 'value2');
insert into hash values('myhash2', 'field1', 'value1'),('myhash3', 'field1', 'value1');
insert into stream values('sensor_1', '*', 'field1', 'value1', 'field2', 'value2');
insert into stream values('sensor_2', '*', 'field1', 'value1'), ('sensor_3', '*', 'field1', 50.7);
Value에 입력 가능한 것들 OPCODE
insert into string values('key05',10+20);
insert into string values('key06',10*20);
insert into string values('key07', min(10,20));
insert into string values('key08', max(10,20));
insert into string values('key09', round(12.675,1));
insert into string values('key10', upper('value'));
insert into string values('key11', trim(' value '));
insert into string values('key12', left('redisgate',5));
insert into string values('key13', 'AAA'||'BBB');
insert into string values('key14', date('now','localtime'));
insert into string values('key15', datetime('now','localtime'));
insert into string values('key16', strftime('%Y-%m-%d %H:%M:%S','now','localtime'));
<< Info Query | Insert Intro | Insert String >> |
---|
Email
返事がかかってなれば、メールでお知らせします。