๐ ์ฐ์ ๋ฉ์ธ ํค์ ์ธ๋ฑ์ค๋ฅผ ๊ณ ๋ คํฉ๋๋ค๐
59187 ๋จ์ด sqldatabasepostgresyugabytedb
๋์ฝ๋ผ ์ฌ๋ชจํ๋ฐ๋กํ--๋ฐ์ฌํ ํ๋ฅญ
์ด ์ ์ ์ฌ๋์ ๋๋ผ๊ฒ ํ๋ค.1100๋ง ์ค, 3์ด ๋์ ์คํ๋๋ ํ ์ด๋ธ์ ๋ํ ๊ฐ๋จํ ๊ฒ์์ ์ต์ ํํ๋ 1001๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค. ํด๋ฆญํ์ฐ์ค๋ก ์ด๋ํ๋ ๊ฒ๋ถํฐ ์ ๋ถ์ ์ด๋ฅด๊ธฐ๊น์ง ์์์ ์ฌ๋๋ค๋ง์ด btree๊ฐ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ณ ์๋ค.๐คท๐ปโโ๏ธ twitter.com/jlongster/statโฆ
2021๋ 11์ 6์ผ ์คํ 22:57
์ ์์ค ๋
์กด์คํฐ
PostgreSQL์ ์ ์ถ์ฑ ๋ฌธ์ .๋ง์์!๊ฐ์ฅ ์ข์ ๋ฌธ์ !
์ง๊ธ ๋๋ ์ด๋ป๊ฒ 3์ด๋ ์ ๋๋ ์๊ฐ ์์ 11644420์ค์ ์กฐํํ๋์ง ํ์คํ ์์์ผ ํ๋ค.
์ค๋ ํ๋ธ๋ก๋ ์ฌ๋๋ค์ด ์ ํํ ์์ธ์ ์ดํดํ์ง ๋ชปํ๋ ์ํฉ์์ ๋ง์ ๊ทผ๋ณธ์ ์ธ ๋ณํ๋ฅผ ์ ๊ธฐํ๋ค๊ณ ์ง์ ํ๋ค.
์ค๋ ํ๋ธ๋ก
# ์ค๋ ํ๋ธ๋ก
์ด ๋จ์๋ ์ ์๊ฐ ์คํ ๋งคํฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ตฌํ๋ ๋๊ธฐ๋ค.James๋ ์ฟผ๋ฆฌ ์ต์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ๋นํ ์ธ๋ฑ์ค๋ง ํ์ํ์ง๋ง, ๋ถํฌ์์ด๋ NosQL DBMS๋ก ์ ํํ๊ณ , MatView๋ฅผ ์ถ๊ฐํ๊ณ , ์ ํ์ UUID๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. H/T twitter.com/jlongster/statโฆ
2021๋ 11์ 7์ผ ์คํ 13:58
์ ์์ค ๋
์กด์คํฐ
PostgreSQL์ ์ ์ถ์ฑ ๋ฌธ์ .๋ง์์!๊ฐ์ฅ ์ข์ ๋ฌธ์ !
์ง๊ธ ๋๋ ์ด๋ป๊ฒ 3์ด๋ ์ ๋๋ ์๊ฐ ์์ 11644420์ค์ ์กฐํํ๋์ง ํ์คํ ์์์ผ ํ๋ค.
์ด ๊ธ์์ ๋๋ ์ด ์๋ก ์์ธ์ ์๊ฐํ๋ ๊ฒ์ด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ค๋ช ํ ๊ฒ์ด๋ค.์ด์จ๋ , ์ด ์์ ์ ๋ถํฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํ์ฅ๋๊ธฐ ์ ์ ๋๋ด์ผ ํ๋ค.์ด ๋ฌธ์ ๋ PostgreSQL์์ ๋ง๋ฌ์ต๋๋ค.๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์์ ๊ฐ๋ ์ด ๋๊ฐ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด YugabyteDB์์ ์ ํ๋ ์ ํ ์ด์ ์ ์คํํ ๊ฒ์ ๋๋ค.SQL๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
James Long ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ปค๋ฎค๋ํฐ์ ๋ฌธ์ํ์ฌ ํ์ํ ๋ชจ๋ ์ ๋ณด, ์คํ ๊ณํ ๋ฐ ์์ธ ์ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. https://gist.github.com/jlongster/4b31299dcb622aa7e29b59d889db2b2c#file-gistfile1-txt
์ด๋ฌํ ์ ๋ณด๊ฐ ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์ฌํ๋๊ธฐ ์ฝ๋ค.
yugabyte=# \c yugabyte yugabyte
psql (15devel, server 11.2-YB-2.9.1.0-b0)
You are now connected to database "yugabyte" as user "yugabyte".
yugabyte=# create table messages_binary (
"timestamp" text,
"group_id" uuid,
"other_column" int,
primary key("timestamp","group_id")
);
CREATE TABLE
yugabyte=# EXPLAIN SELECT * FROM messages_binary
WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
------------------
Seq Scan on messages_binary (cost=0.00..105.00 rows=1000 width=52)
Filter: (("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'::text) AND (group_id = '983d5259-97ff-49e3-8829-101a
b8dead92'::uuid))
(2 rows)
์ด๊ฒ์ ์ ์ฒด ํ
์ด๋ธ ์ค์บ์ด๋ค.์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ์๋ํ๋ฉด ์ฝ๋ ๋ชจ๋ ์ค์ '๊ทธ๋ฃน id' ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.์ฐ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ ๋ฒ์ ์ค์บ๋์ด๋ค.๋ช ํ(3 ๊ทธ๋ฃน 3 ํ์ ์คํฌํ)์ ์ฝ์ ํฉ๋๋ค.
yugabyte=# create extension pgcrypto;
CREATE EXTENSION
yugabyte=# insert into messages_binary
with groups as (
select gen_random_uuid() group_id from generate_series(1,3)
)
select
to_char(now()+(generate_series(1,3)*interval'1 second')
,'yyyy-mm-ddThh24:mi:ss.000Z-')
||substr(gen_random_uuid()::text,25) "timestamp"
,group_id, 42 as "value"
from groups;
INSERT 0 9
yugabyte=# select * from messages_binary;
timestamp | group_id | other_column
--------------------------------------------+--------------------------------------+--------------
2021-11-07T20:00:23.000Z-c533a5e5623e | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:24.000Z-b879daca6cb7 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
2021-11-07T20:00:23.000Z-ca98dd4de397 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
2021-11-07T20:00:22.000Z-c440295c4500 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:24.000Z-631b45e66aba | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:22.000Z-ad01842bb691 | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:24.000Z-90342717a0c8 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:22.000Z-933f552d0159 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
2021-11-07T20:00:23.000Z-1dcde16fc472 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
(9 rows)
YugabyteDB์์ ์ค์ ๋ถ๋ฆฌ๋์ด ์ฃผ ์ธ๋ฑ์ค์ ์ ์ฅ๋ฉ๋๋ค.PostgreSQL์์, ๊ทธ๊ฒ๋ค์ ํ๋์ ๋ฌด๋๊ธฐ์ ์ถ๊ฐ๋๊ณ , ๋ฉ์ธ ํค์ ์ถ๊ฐ ์ธ๋ฑ์ค๊ฐ ์์ต๋๋ค.์ด ๋ ๊ฐ์ง ์ํฉ์์ ๋ฒ์ ์ค์บ ์ ๊ทผ์ ๋ฉ์ธ ํค์ ๋ฌ๋ ค ์์ผ๋ฉฐ, ์ฌ๊ธฐ๋ ("timestamp","group_id")
์ผ๋ก ์ ์๋ฉ๋๋ค.์ฐ๋ฆฌ๋ ๋ด๊ฐ ํ์๋ก ํ๋ group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e
์ค์ด ์ด Seq ์ค์บ ๊ฒฐ๊ณผ์์ ๋ถ์ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.๋ฉ์ธ ํค์ ์์, ์ ํ์ ์์๋ณด์...๊ฐ์ ์ด์ ์์๋๋ก ์ ๋ ฌํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ญ์์ค.
yugabyte=# select * from messages_binary
order by "timestamp","group_id";
timestamp | group_id | other_column
--------------------------------------------+--------------------------------------+--------------
2021-11-07T20:00:22.000Z-933f552d0159 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
2021-11-07T20:00:22.000Z-ad01842bb691 | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:22.000Z-c440295c4500 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:23.000Z-1dcde16fc472 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:23.000Z-c533a5e5623e | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:23.000Z-ca98dd4de397 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
2021-11-07T20:00:24.000Z-631b45e66aba | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:24.000Z-90342717a0c8 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:24.000Z-b879daca6cb7 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
(9 rows)
ํ์ฌ, ๋น์ ์ WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e' AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'
์ ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํจ์จ์ด ์ผ๋ง๋ ๋ฎ์์ง ์ดํดํ ์ ์์ต๋๋ค.์ฐ๋ฆฌ๋ ์ฒซ ์ค๋ถํฐ ์์ํฉ๋๋ค. timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'
์ ๊ฒ์ฆํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ค์ ์ค์บํด์ ํํฐํด์ผ ํฉ๋๋ค.๋จ๋
์ผ๋ก ์ฝ์ ์ ์๋ ์์ ๋ฒ์ ๋ด์์ ๊ด์ฌ ์๋ ์ค์ ์ฐพ์ ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์๋ค.์ด๊ฒ์ด ๋ฐ๋ก Seq ์ค์บ์ ์ค๋ช
ํฉ๋๋ค.๋จผ์ ๊ทธ๋ฃน id๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค.
yugabyte=# select * from messages_binary
order by "group_id","timestamp";
timestamp | group_id | other_column
--------------------------------------------+--------------------------------------+--------------
2021-11-07T20:00:22.000Z-c440295c4500 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:23.000Z-1dcde16fc472 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:24.000Z-90342717a0c8 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 | 42
2021-11-07T20:00:22.000Z-ad01842bb691 | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:23.000Z-c533a5e5623e | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:24.000Z-631b45e66aba | e7e46753-2e99-4ee4-b77f-17136b01790e | 42
2021-11-07T20:00:22.000Z-933f552d0159 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
2021-11-07T20:00:23.000Z-ca98dd4de397 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
2021-11-07T20:00:24.000Z-b879daca6cb7 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 | 42
(9 rows)
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ด ๊ตฌ์กฐ(ํ ์์๋ฅผ ๋ณผ ๋ ์ด ์์๋ฅผ ๋ณ๊ฒฝํ์ง ์์)์์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.์ฒซ ๋ฒ์งธ
group_id='e7e46753-2e99-4ee4-b77f-17136b01790e'
10 ์ฐพ๊ธฐtimestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'
, group_id='e7e46753-2e99-4ee4-b77f-17136b01790e'
์ ๋ฉ์ท๋ค.yugabyte=# create index messages_binary_key2
on messages_binary ("group_id","timestamp");
CREATE INDEX
๋ค์์ ์คํ ๊ณํ์
๋๋ค.yugabyte=# EXPLAIN SELECT * FROM messages_binary
WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
---------------------------
Index Scan using messages_binary_key2 on messages_binary (cost=0.00..5.25 rows=10 width=52)
Index Cond: ((group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26
b84edae7349e'::text))
(2 rows)
์ด๊ฒ์ ๋งค์ฐ ํจ๊ณผ๊ฐ ์๋ค.INCLUDE ์๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ ๋ชจ๋ ์ด์ ์์ธ์ ์ถ๊ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.yugabyte=# create index messages_binary_key2
on messages_binary ("group_id","timestamp")
include ("other_column");
CREATE INDEX
yugabyte=# EXPLAIN SELECT * FROM messages_binary
WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
---------------------------
Index Only Scan using messages_binary_key2 on messages_binary (cost=0.00..5.15 rows=10 width=52)
Index Cond: ((group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26
b84edae7349e'::text))
(2 rows)
๋ค์ ๋จ์์์๋ ์ด๋ฌํ ์์ธ ์ ์ฉ ๊ฒ์ ๊ธฐ์ ์ ๋ํด ์์ธํ ์ค๋ช
ํฉ๋๋ค.https://blog.yugabyte.com/how-a-distributed-sql-database-boosts-secondary-index-queries-with-index-only-scan/
์ง์ผ๋ณดํ ๋ถ์์ ํตํด'์๊ฐ ์คํฌํ','๊ทธ๋ฃน id'์ ์ธ๋ฑ์ค๋ ์ ํ ์ธ๋ชจ๊ฐ ์์ ์ ์๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋
timestamp
๋ง ์กฐํํ๊ณ group_id
์ ์กฐํํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ธฐ ๋๋ฌธ์ด๋ค.๊ทธ๋ฌ๋ฉด ์ด ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
yugabyte=# create table messages_binary (
"timestamp" text,
"group_id" uuid,
"other_column" int,
primary key("group_id","timestamp")
);
CREATE TABLE
์ถ๊ฐ ํ์ ์ฝ์
ํ๊ณ ์คํ ๊ณํ์ ๋ณด๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ญ์์ค.yugabyte=# insert into messages_binary
with groups as (
select gen_random_uuid() group_id from generate_series(1,1e3)
)
select
to_char(now()+(generate_series(1,1e4)*interval'1 second')
,'yyyy-mm-ddThh24:mi:ss.000Z-')
||substr(gen_random_uuid()::text,25) "timestamp"
,group_id, 42 as "value"
from groups;
yugabyte=# analyze messages_binary;
ANALYZE
yugabyte=# EXPLAIN (analyze)
SELECT * FROM messages_binary
WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
---------------------------
Index Scan using messages_binary_pkey on messages_binary (cost=0.00..1214.95 rows=10530 width=52) (actual time=10.588..100.838
rows=10000 loops=1)
Index Cond: ((group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26
b84edae7349e'::text))
Planning Time: 0.067 ms
Execution Time: 101.711 ms
(4 rows)
๋์ ์ํ 8VCPU ์คํ์ค์์ 1000๋ง ์ค์ ์๊ณ์์ 100๋ฐ๋ฆฌ์ด ์์ 10000์ค์ ๊ฒ์ํ์์ผ๋, ์ด๊ฒ์ ์๊ณ์ ํฌ๊ธฐ์ ๋ฌ๋ ค ์์ง ์๋ค๋ ๊ฒ์ ๋ง์๋๋ฆด ์ ์์ต๋๋ค.์ด๊ฒ์ ์ ๊ทผ ํจํด์ ์ดํดํ๋ ๋ ๋ค๋ฅธ ์ฅ์ ์ด๋ค. ์ด๋ป๊ฒ ํ์ฅ๋๋์ง ์๊ณ ์๋ค.์ด ์์ธ ์ค์บ์ ํ
์ด๋ธ ํฌ๊ธฐ์์ O (1) ์ ๊ฐ๊น๋ค.์ด๊ฒ์ ์ค์ ๋ก๋'logn'์ด์ง๋ง, ํฐ ๋ฒ์์ ์ค์บ์ ๋ํด์๋ B ํธ๋ฆฌ์์ ์์ผ๋ก ๊ฐ๋ผ์ง๊ฑฐ๋ LSM ํธ๋ฆฌ์ SST ํ์ผ์seek์ ๋ฌด์ํ ์ ์์ต๋๋ค.๊ฒฐ๊ณผ ํฌ๊ธฐ๋ O(n)์
๋๋ค.๋์ฝ๋ผ์ด ์ฌ๋ชจํ๋ฐ๋กํ(postgres.ai)์ ๋ ผ์ํ ๋ค ์ฌ์ฒด๋ก ์ ๋ฐ์ดํธํ๋ค.YugabyteDB์ PostgreSQL์ ๊ฒฐ๊ณผ๋ ๋น๊ตํ๋ค.๋ด ์กฐํ๊ฐ ์์ฑํ ์ค์ '๊ทธ๋ฃน id' ์์๋ก ์ฝ์ ๋ฉ๋๋ค. ์ด๊ฒ์ YugabyteDB์ ์ด๋ค ๋ด์ฉ๋ ๋ฐ๊พธ์ง ์์ต๋๋ค. ์ค์ ๋ฉ์ธ ํค๋ก ๊ตฌ์ฑ๋์ด ์์ง๋ง, PostgreSQL ์ปฌ๋ ์ ์ ์ฑ๋ฅ์ ์์ธ/ํ ์ด๋ธ์ ๊ด๋ จ์ฑ์ ๋ฌ๋ ค ์์ต๋๋ค.๋ค์์ PostgreSQL์์ ํ์ ์คํฌํ์ ๋ ์ง์คํ ์ํฉ์ด ์๋ ์์ ๋๋ค.
postgres=# truncate table messages_binary;
TRUNCATE TABLE
postgres=# insert into messages_binary
with groups as (
select gen_random_uuid() group_id from generate_series(1,1e3)
), timestamps as (
select to_char(now()+(generate_series(1,1e4)*interval'1 second')
,'yyyy-mm-ddThh24:mi:ss.000Z-')
||substr(gen_random_uuid()::text,25) "timestamp"
)
select
"timestamp",group_id, 42 as "value"
from timestamps,groups;
INSERT 0 10000000
postgres=# select * from messages_binary limit 1;
timestamp | group_id | other_column
--------------------------------------------+--------------------------------------+--------------
2021-11-08T08:34:14.000Z-6bb27dbe2723 | 91ee7381-eb92-48cd-bb82-9ed939dc3a13 | 42
(1 row)
postgres=# EXPLAIN (analyze,buffers)
SELECT * FROM messages_binary
WHERE group_id = '91ee7381-eb92-48cd-bb82-9ed939dc3a13'
AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on messages_binary (cost=778.61..30792.78 rows=9956 width=58) (actual time=3.021..43.141 rows=10000 loops=1)
Recheck Cond: ((group_id = '91ee7381-eb92-48cd-bb82-9ed939dc3a13'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'::text))
Heap Blocks: exact=10000
Buffers: shared hit=2006 read=8167 written=2249
-> Bitmap Index Scan on messages_binary_pkey (cost=0.00..776.12 rows=9956 width=0) (actual time=1.897..1.897 rows=10000 loops=1)
Index Cond: ((group_id = '91ee7381-eb92-48cd-bb82-9ed939dc3a13'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'::text))
Buffers: shared hit=11 read=162
Planning Time: 0.086 ms
Execution Time: 43.832 ms
๋ฉ๋ชจ๋ฆฌ ์ง์ฐ๊ณผ ๋ฒํผ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ซ์๋ฅผ ๋ฐ๊ฟ๋๋ค.YugabyteDB์ LSM ํธ๋ฆฌ ์๋ ์์ถ, PostgreSQL์ ์๋ pg ์ฌํฌ์ฅ์ด ๋์์ด ๋ฉ๋๋ค.๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๊ฐ์ ๊ตฌ์ฅ์ ์๋ค.์๋ต ์๊ฐ์ด ์์๋ณด๋ค ๋ช ๋ฑ๊ธ ๋์ ๋, ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ค๊ณ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.๊ทธ๋ฆฌ๊ณ ์์ง๋ง๋ค ์ฝ๊ฐ์ ์ถ๊ฐ ์ต์ ํ๊ฐ ์์ ์ ์๋ค.์ด๊ฒ์ ์ด ๊ฒ์์ด ํ ์ ์๋ ๊ฐ์ฅ ์ข์ ์ผ์ด๋ค. ์ถ๊ฐ ์ธ๋ฑ์ค๊ฐ ํ์ํ์ง ์๊ณ , ํค์ ์ ํํ ์ด ์์๋ง ์ ์ํ ์ ์๋ค.PostgreSQL์์, ์ด๊ฒ์ ํ ์ด๋ธ์์ ๋ฌด์์๋ก ์ฝ์ด์ผ ํ์ง๋ง, ์ ์ด๋ ๋ชจ๋ ๋ด์ฉ์ ๋ฉ์ธ ํค ์ธ๋ฑ์ค์ ๋ฒ์ ์ค์บ์์ ํํฐ๋ฉ๋๋ค.YugabyteDB์ ๋ชจ๋ ํ์ ์์ฐจ์ ์ฝ๊ธฐ๋ฅผ ํตํด ๊ฒ์๋ฉ๋๋ค.
์๋ฐ๋ก ์๋๋ฐ์ค(Alvaro Hernรกndez)์ ๋ ๋ค๋ฅธ ๋ง์ ์ด ๊ฒ์์ด ๊ฒ์ํ ์ค์ ์๋ฅผ ์์ฌํ๋ค.
์๋ฐ๋ก ์๋๋ฐ์ค
์ด๊ฑฐ ๋๋ฌด ๋ง์ ๊ฑฐ์ผ.์ ์ด๋ ๊ฒ ๋ง์ ์ค์ ๋๋๋ ค์ผ ํฉ๋๊น?์์ธ์ด ์๋ ์๋ ๊ฐ์ ์ด๊ฒ์ ํ์ฅํ๊ธฐ ์ฝ์ง ์๋ค.
2021๋ 11์ 6์ผ ์คํ 23:18
๊ทธ๋ฆฌ๊ณ ํ๋ ๋, ์ ์์ค ๋กฑ์ ์คํ ๊ณํ์ ์์ธ ์กฐ๊ฑด์์
(group_id = '983d5259-97ff-49e3-8829-101ab8dead92'::text)
์ผ๋ก ํ์๋ฉ๋๋ค.UUID๋ฅผ TXT๋ก ์ ์ฅํ๋ ๊ฒ์ ํจ์จ์ ์ด์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ UUID ๋ฐ์ดํฐ ํ์์ ์ฌ์ฉํ์ต๋๋ค.yugabyte=# select pg_column_size(
'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid);
pg_column_size
---------------------
16
(1 row)
yugabyte=# select pg_column_size(
'e7e46753-2e99-4ee4-b77f-17136b01790e'::text);
pg_column_size
---------------------
40
(1 row)
ํ ๋ง๋๋ก ํ๋ฉด '๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ถ ๋ถ๊ฐ' ๋ฅผ ์ค๋ช
ํ๊ธฐ ์ ์ ์ฌ์ฉ์์ ์ ๊ทผ ํจํด์ ์ดํดํ ์ ์๋ ์ง๋ฆ๊ธธ์ด ์์ต๋๋ค. ์์ ๊ฒฐ๊ณผ์ ํฌ๊ธฐ์ ์ ํจํ ์ ๊ทผ ๊ตฌ์กฐ์
๋๋ค.์ ์์ค ๋์ฒ๋ผ: ์งํ ๊ณํ์ ์ฝ๊ณ ์ง์ญ ์ฌํ์ ๋ฌผ์ด๋ณด๊ธฐ๐
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ์ฐ์ ๋ฉ์ธ ํค์ ์ธ๋ฑ์ค๋ฅผ ๊ณ ๋ คํฉ๋๋ค๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/yugabyte/think-about-primary-key-indexes-before-anything-else-o5mํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค