Share
Embed
Transcript
30 slides
-
͘͡ • ܭࢉྔʹ͍ͭͯ - ܭࢉྔͱ - σʔλαΠζ͔ΒݟੵΓ • MySQL(InnoDB)ͷΫΤϦվળ -
group by / distinct ͷ໎͍ • RedisͷઃఆΛݟͯࢥͬͨ͜ͱ(খωλ) - ϝϞϦѹॖͷ͍ٙ -
ܭࢉྔͱ • ֶੜ࣌ʹڝٕϓϩάϥϛϯάΛগ͠(ICPCͱ͔) ܭࢉྔ, σʔλߏ/ΞϧΰϦζϜʹ͖߹͏ػձ͕ଟ͔ͬͨ • ܭࢉྔͱ࣌ؒʹج४/ײ֮Έ͍ͨͳͷ͕͋Δ • ྫ͑ CPU
2.4 GHz, 1ίΞ ͩͱ ~ ͙Β͍Ͱ1ඵ͔͔Δ(ࡶ) -
GROUP BY / DISTINCT ͷ໎͍ ͓ͱͳΔςʔϒϧఆٛ $3&"5&5"#-&AVTFS@GSJFOEA AJEACJHJOU
VOTJHOFE/05/6-- AVTFS@JEACJHJOU VOTJHOFE/05/6-- AGSJFOE@JEACJHJOU VOTJHOFE/05/6-- 13*."3:,&: AJEA 6/*26&,&:AVTFS@JEA AVTFS@JEA AGSJFOE@JEA ,&:AGSJFOE@JEA AGSJFOE@JEA &/(*/&*OOP%#%&'"6-5$)"34&5VUGNC SELECT friend_id FROM user_friend WHERE (user_id = '785595' OR user_id = '3291611' OR.....) GROUP BY friend_id LIMIT 1000; Γ͍ͨ͜ͱ ͋Δuserͷ෦ू߹͔Βॏෳͳ͠Ͱfriend_id͕1000݅΄͍͠ GROUP BYDISTINCT࣮ݱͰ͖Δ͜ͱಉ͡ -
A b c d B a c f user_id friend_id
ΠϝʔδͷΑ͏ͳͷ C a e icon: http://www.flaticon.com/packs/multimedia-collection -
A b c d B a c f C a
e user_id friend_id userͷ෦ू߹(A,B,C)ͷfriend_idΛॏෳͳ͠Ͱ5݅ Γ͍ͨ͜ͱ ͜Ε͚ͩ icon: http://www.flaticon.com/packs/multimedia-collection -
SELECT friend_id FROM user_friend WHERE (user_id = '785595' OR user_id
= '3291611' OR.....) GROUP BY friend_id LIMIT 1000; OR۟ͷuser_id͕ଟ͘ͳͬͯ͘Δͱ ٸʹҟৗʹ͘ͳͬͨ(50ඵͱ͔͔͔Δ) ͳΜͰʂ ฏͳ͋Δͷ͜ͱ.... -
MySQL(InnoDB)ͷΠϯσοΫεߏ ΠϯσοΫεͷσʔλߏB+tree ओΩʔͷΠϯσοΫεΛClustered Index ͦΕҎ֎ͷΠϯσοΫεΛSecondary Index ؆୯ͳB+treeͷྫͷਤ*1 ਤ: 1͔Β7ͷΩʔͱσʔλd1-d7ͷߏ Ͱࣔ͞ΕͯΔͷ࿈݁Ϧετ
Clusteredʹ࣮σʔλ(Ϩίʔυ)ɺ SecondaryʹPK͕σʔλͱͯ֨͠ೲ XJLJQFEJBΑΓIUUQTDPNNPOTXJLJNFEJBPSHXJLJ'JMF#USFFTWH -
user_friendͷ(؆қ)Clustered Index SPPU
Clustered Index (id) " C # B " D $ B # D # G " E $ F SecondaryIndex (user_id, friend_id) SecondaryIndex (friend_id) icon: https://www.iconfinder.com/icons/174603/deciduous_tree_icon#size=256 -
SecondaryIndex(user_id,friend_id)ͷ؆қ൛ SPPU " C " D " E # B
# D # G $ B $ F SecondaryIndex (user_id, friend_id) Clustered Index (id) SecondaryIndex (friend_id) icon: https://www.iconfinder.com/icons/174603/deciduous_tree_icon#size=256 -
SPPU B B C D D E F G SecondaryIndex
(friend_id) Clustered Index (id) SecondaryIndex (user_id, friend_id) icon: https://www.iconfinder.com/icons/174603/deciduous_tree_icon#size=256 SecondaryIndex(friend_id)ͷ؆қ൛ -
SPPU " C " D " E # B SecondaryIndex
(user_id, friend_id) Clustered Index (id) SPPU " C # B " D $ B SecondaryIndex(user_id,friend_id)Λར༻ͯ͠ݕࡧ ྫ: WHERE user_id = 'A' AND friend_id = 'c' -
Λͦ͏ SELECT friend_id FROM user_friend WHERE (user_id = '785595' OR
user_id = '3291611' OR.....) GROUP BY friend_id LIMIT 1000; (user_id, friend_id)ʹΑΔݕࡧ͕࠷దͷͣͰɺ ܭࢉྔతʹٸܹʹ͘ͳΔͷ͓͔͍͠ͷͰʁ ͔ͯ͠͠ friend_id ͷΠϯσοΫεͰݕࡧͯ͠Δʁ -
SPPU " C " D " E # B #
D # G $ B $ F d d d d d d d d SecondaryIndex(user_id,friend_id)Λͬͨݕࡧ(1/2) WHERE (user_id = 'A' OR user_id = 'C') -
SPPU " C " D " E # B #
D # G $ B $ F d d d d d d d d SecondaryIndex(user_id,friend_id)Λͬͨݕࡧ(2/2) WHERE (user_id = 'A' OR user_id = 'C') -
σʔλ͕૿͑ͨͱ͖ͷSecondaryIndex(friend_id) SPPU B B B B B B C C
d d d d d d d d user_idΛݕࡧ݅ʹfriend_idͷΠϯσοΫεͰ ݕࡧ͢Δͷ໌Β͔ʹແବ -
Redisͱ ΩʔόϦϡʔΛجຊͱ͢ΔσʔλߏܕNoSQL List, Set, Sorted Sets,etcͷσʔλߏ͕͋ͬͯେมศར SFEJTDPOG [TFUNBY[JQMJTUFOUSJFT [TFUNBY[JQMJTUWBMVF ઃఆͷҰ෦
Redis 2.2͔ΒϝϞϦ࠷దԽͷΈ͕ग़དྷͨ ύϥϝʔλʔΛݟͨॠؒʹ |'-')oO( CPUͱtrade-offͰѹॖͷͨΊʹಛघͳΤϯίʔσΟϯάͯ͠Δ ͱσʔλߏ͔Βͯ͠ҧ͍ͦ͏ͩ͠ɺΦʔμʔ͕શ͘ҧ͏ͷͰʁ) -
ո͍͠ͷͰ࣮ࡍʹࢼ͢(1/2) Sorted Setsܕ scoreͰιʔτࡁΈͷσʔλू߹ ෦࣮SkipList&HashͷΈ߹Θͤ ͲͪΒͷ݅ຬͨ͢ݶΓϝϞϦѹॖͯ͘͠ΕΔ SFEJTDPOG [TFUNBY[JQMJTUFOUSJFTEFGBVMU [TFUNBY[JQMJTUWBMVF ֬ೝ͍ͨ͜͠ͱ:
ΦʔμʔίϚϯυͷυΩϡϝϯτ௨Γʁ ಛఆͷίϚϯυΛదʹ܁Γฦ࣮͠ߦ͢ΕΘ͔Γͦ͏ -
ո͍͠ͷͰ࣮ࡍʹࢼ͢(2/2) UJNFDBSUPOFYFDQFSMSSQMD DBSUPOFYFDQFSMSSQMDTVTFSTTZTUFNDQVUPUBM UJNFDBSUPOFYFDQFSMSSQMD DBSUPOFYFDQFSMSSQMDTVTFSTTZTUFNDQVUPUBM ͳΒ10^4Ͱ1ඵΛ͑ͳ͍ؾ͕͢Δʁ zset-max-ziplist-entries = 128 (default
ZADDίϚϯυΛ10000ճൃߦ͢Δ ίϚϯυͷ࣌ؒܭࢉྔ: , nSortedSetsͷཁૉ zset-max-ziplist-entries = 10000 ྲྀੴʹ͓͔͍͠ͷͰͳ͍͔ʁͱؾ͘͜ͱ͕Ͱ͖Δ rr.pl: https://gist.github.com/ichirin2501/21e9ef8540086650fec85c3e0ccf7da5