Hasuraред SQL рд╕рд░реНрд╡рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд░реЗрдЦрд╛рдВрдХрди

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓реЗрдЦ "рдПрд╕рдХреНрдпреВрдПрд▓ рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд░реЗрдЦрд╛рдВрдХрди рдХрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред

рдпрд╣ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИ рдФрд░ рдХреНрдпрд╛ рдЕрдиреБрдХреВрд▓рди рдФрд░ рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рди рд╣рд╕реБрд░рд╛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╣рд▓реНрдХреЗ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░, рдЬреЛ рдЖрдкрдХреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕реНрдХреАрдорд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдпрд╛ рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдЯреНрд░рд┐рдЧрд░реНрд╕, рдбрд╛рдпрдиреЗрдорд┐рдХ рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓, рдЬреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдСрдЯреЛрдореИрдЯрд┐рдХ рдЬреЗрдирд░реЗрд╢рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдмреЙрдХреНрд╕ рд╕реЗ рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдПрди + 1 рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ (рдмреИрдЪрд┐рдВрдЧ) рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред


рдЖрдк рдПрдХ рд╣реА рдХреНрд╡реЗрд░реА рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PostgreSQL рдореЗрдВ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рдПрд▓реНрдмрдо рдФрд░ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЯреНрд░реИрдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ "рдПрд▓реНрдмрдо" рддрд╛рд▓рд┐рдХрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП "рдЯреНрд░реИрдХ" рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдмрдирд╛рдИ рдЧрдИ рд╣реИ)

{ album (where: {year: {_eq: 2018}}) { title tracks { id title } } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХрд┐рд╕реА рднреА рдЧрд╣рд░рд╛рдИ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреАрдЖрдИ, рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ PostgreSQL рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдордп рдФрд░ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХреЛ рдмрдЪрд╛рддреЗ рд╣реБрдП, рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред

рдЬреАрд╡рди рдЪрдХреНрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ


рд╣рд╕реБрд░рд╛ рдХреЛ рднреЗрдЬрд╛ рдЧрдпрд╛ рдПрдХ рдЕрдиреБрд░реЛрдз рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ:

  1. рд╕рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ : рдЕрдиреБрд░реЛрдз рдЧреЗрдЯрд╡реЗ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬреЛ рдХреБрдВрдЬреА (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╣реЗрдбрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ред
  2. рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрдиреБрд░реЛрдз : рд╣рд╕реБрд░рд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз рдмреЙрдбреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧреНрд░рд╛рдлрд▓рд╛рдЗрди рдПрдПрд╕рдЯреА рдмрдирд╛рддрд╛ рд╣реИред
  3. рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╡реИрдзрддрд╛ : рдПрдХ рдЪреЗрдХ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рд╕рд╣реА рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдкрд╣реБрдБрдЪ рдЕрдзрд┐рдХрд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред
  4. рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди : рдХреНрд╡реЗрд░реА SQL рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИред
  5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреАрдврд╝реА : SQL рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЧреЗрдЯрд╡реЗ gzip рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ )ред

рд▓рдХреНрд╖реНрдпреЛрдВ


рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд▓рдЧрднрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

  1. HTTP рд╕реНрдЯреИрдХ рдХреЛ рдиреНрдпреВрдирддрдо рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдЪреНрдЪ рдереНрд░реВрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рд╕реЗ рдлрд╛рд╕реНрдЯ SQL рдкреАрдврд╝реАред
  3. рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди SQL рдХреНрд╡реЗрд░реА рдХреБрд╢рд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
  4. SQL рдХреНрд╡реЗрд░реА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ Postgres рд╕реЗ рд╡рд╛рдкрд╕ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

GraphQL рдХреНрд╡реЗрд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ:

рдкрд░рдореНрдкрд░рд╛рдЧрдд рд░рд┐рд╕реЛрд▓реНрд╡рд░


рд░реЗрдЦрд╛рдВрдХрди рдХреНрд╡реИрд╢реНрдЪрди рдХреНрд╡реЗрд╢реНрдЪрди рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд╛рд▓реНрд╡рд░ рдмреБрд▓рд╛рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рдореЗрдВ, рд╣рдореЗрдВ 2018 рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝ рдХрд┐рдП рдЧрдП рдПрд▓реНрдмрдо рдорд┐рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рдкрдЯрд░рд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ - рдПрди + 1 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдорд╕реНрдпрд╛ред рдХреНрд╡реЗрд░реА рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рддреА рдХреНрд╡реЗрд░реА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддреА рд╣реИред

Postgres рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рд╣реЛрдВрдЧреЗ:

 SELECT id,title FROM album WHERE year = 2018; 

рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕рднреА рдПрд▓реНрдмрдореЛрдВ рдХреЛ рд╣рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрдЧрд╛ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдПрд▓реНрдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ N рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдПрд▓реНрдмрдо рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдкрд░ рдЕрдорд▓ рдХрд░реЗрдВрдЧреЗ:

 SELECT id,title FROM tracks WHERE album_id = <album-id> 

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдЖрдкрдХреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрди + 1 рдХреНрд╡реЗрд░реА рдорд┐рд▓рддреА рд╣реИред

рдмреИрдЪрд┐рдВрдЧ рдЕрдиреБрд░реЛрдз


Dataloader рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдмреИрдЪрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ N + 1 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдПрдореНрдмреЗрдбреЗрдб рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП SQL рдХреНрд╡реЗрд░реА рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдм рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирдореВрдиреЗ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ GraphQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Postgres рдХреЗ 2 рдЕрдиреБрд░реЛрдз рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ:

рд╣рдореЗрдВ рдПрд▓реНрдмрдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

 SELECT id,title FROM album WHERE year = 2018 

рд╣рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдПрд▓реНрдмрдореЛрдВ рдХреЗ рдЯреНрд░реИрдХ рдорд┐рд▓рддреЗ рд╣реИрдВ:

 SELECT id, title FROM tracks WHERE album_id IN {the list of album ids} 

рдХреБрд▓ рдореЗрдВ, 2 рдкреНрд░рд╢реНрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдПрд▓реНрдмрдо рдХреЗ рд▓рд┐рдП рдкрдЯрд░рд┐рдпреЛрдВ рдкрд░ SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд░рд╣реЗрдЬ рдХрд┐рдпрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдордиреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЯреНрд░реИрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WHERE рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдореЗрдВ рд╢рд╛рдорд┐рд▓


Dataloader рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рджреЛрд╣рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, Postgres рдПрдХрдорд╛рддреНрд░ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реИ рдФрд░ рд╕рднреА рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рддрд░рд╣, рдпрд╣ JOIN рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рдХрдИ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JOINs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдХрд▓ SQL рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХрд┐рд╕реА рдПрдХрд▓ SQL рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕рд╛ рдирд┐рд╡реЗрджрди:

 SELECT album.id as album_id, album.title as album_title, track.id as track_id, track.title as track_title FROM album LEFT OUTER JOIN track ON (album.id = track.album_id) WHERE album.year = 2018 

рд╣рдореЗрдВ рдРрд╕реЗ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛:

 album_id, album_title, track_id, track_title 1, Album1, 1, track1 1, Album1, 2, track2 2, Album2, NULL, NULL 

рдлрд┐рд░ рдЗрд╕реЗ JSON рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛:

 [ { "title" : "Album1", "tracks": [ {"id" : 1, "title": "track1"}, {"id" : 2, "title": "track2"} ] }, { "title" : "Album2", "tracks" : [] } ] 

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреАрдврд╝реА рдХрд╛ рдЕрдиреБрдХреВрд▓рди


рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХреНрд╡реЗрд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп SQL рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ JSON рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдЗрд╕реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред 9.4 рдкреЛрд╕реНрдЯ ( рд╣рд╕реБрд░рд╛ рдХреА рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рдордп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рд░реА ) рдиреЗ JSON рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реА, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рдж, SQL рдкреНрд░рд╢реНрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд▓рдЧреЗ:

 SELECT json_agg(r.*) FROM ( SELECT album.title as title, json_agg(track.*) as tracks FROM album LEFT OUTER JOIN track ON (album.id = track.album_id) WHERE album.year = 2018 GROUP BY album.id ) r 

рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдПрдХ рдХреЙрд▓рдо рдФрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрдЧреА, рдФрд░ рдпрд╣ рдорд╛рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рд╛рд╕реНрдХреЗрд▓ рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 3-6 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред

рддреИрдпрд╛рд░ рдмрдпрд╛рди


рдХреНрд╡реЗрд░реА рдХреЗ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕реНрддрд░ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрддреНрдкрдиреНрди SQL рдХреНрд╡реЗрд░реА рдХрд╛рдлреА рдмрдбрд╝реА рдФрд░ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдорддреМрд░ рдкрд░, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреНрд╡реЗрд░реАрдЬрд╝ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реА рдХреНрд╡реЗрд░реА рдХреЛ 2018 рдХреЗ рдмрдЬрд╛рдп 2017 рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдмрдпрд╛рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓реА рдЬрдЯрд┐рд▓ SQL рдХреНрд╡реЗрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдХреНрд╡реЗрд░реА рдкрд╣рд▓реА рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЧрдИ рд╣реИ:

 { album (where: {year: {_eq: 2018}}) { title tracks { id title } } } 

рд╣рдо рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп SQL рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ:

 PREPARE prep_1 AS SELECT json_agg(r.*) FROM ( SELECT album.title as title, json_agg(track.*) as tracks FROM album LEFT OUTER JOIN track ON (album.id = track.album_id) WHERE album.year = $1 GROUP BY album. 

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рддреБрд░рдВрдд рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 EXECUTE prep_1('2018'); 

рдЬрдм рдЖрдкрдХреЛ 2017 рдХреЗ рд▓рд┐рдП GraphQL рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдПрдХ рд╣реА рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВ:

 EXECUTE prep_1('2017'); 

рдпрд╣ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреНрд╡реЗрд░реА рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрддрд┐ рдореЗрдВ рд▓рдЧрднрдЧ 10-20% рдХреА рд╡реГрджреНрдзрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рд╛рд╕реНрдХреЗрд▓


рд╣рд╛рд╕реНрдХреЗрд▓ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


рдЕрдВрдд рдореЗрдВ


рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЧрдВрднреАрд░ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдореЗрдВ рд╣реИрдВ:



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, PostgreSQL рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдФрд░ рдорд╣рддреНрд╡рд╣реАрди рджреЗрд░реА, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдУрдЖрд░рдПрдо рдХреЛ рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдорд╛рдирдХ:

рдЯреЗрд╕реНрдЯ рд╕реНрдЯреИрдВрдб:

  1. 8GB рд░реИрдо рдФрд░ i7 рдХреЗ рд╕рд╛рде рд▓реИрдкрдЯреЙрдк
  2. рдПрдХ рд╣реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЯреНрд╕
  3. wrk , рдПрдХ рддреБрд▓рдирд╛ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ "рдЕрдзрд┐рдХрддрдо" рдЖрд░рдкреАрдПрд╕ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА
  4. рд╣рд╕реБрд░рд╛ рдЧреНрд░реЗрдлреНрд▓рд┐рдХреНрд╕ рдЗрдВрдЬрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
  5. рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХрд╛ рдЖрдХрд╛рд░: 50
  6. рдбреЗрдЯрд╛рд╕рдЯ : рдЪрд┐рдиреВрдХ


рдЕрдиреБрд░реЛрдз 1: track_media_some

 query tracks_media_some { tracks (where: {composer: {_eq: "Kurt Cobain"}}){ id name album { id title } media_type { name } }} 

  • рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 1375 req / s
  • рд╡рд┐рд▓рдВрдм: 17.5 рдореА
  • CPU: ~ рейреж%
  • RAM: ~ рейреж рдПрдордмреА (рд╣рд╕реБрд░рд╛) + реп реж рдПрдордмреА (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ)

рдЕрдиреБрд░реЛрдз 2: track_media_all

 query tracks_media_all { tracks { id name media_type { name } }} 

  • рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб: 410 req / s
  • рд╡рд┐рд▓рдВрдм: 59 рдореА
  • CPU: ~ 100%
  • RAM: ~ 30MB (рд╣рд╕реБрд░рд╛) + 130MB (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ)

рдирд┐рд╡реЗрджрди 3: album_tracks_genre_some

 query albums_tracks_genre_some { albums (where: {artist_id: {_eq: 127}}) { id title tracks { id name genre { name } } }} 

  • рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 1029 req / s
  • рд╡рд┐рд▓рдВрдм: 24ms
  • CPU: ~ рейреж%
  • RAM: ~ рейреж рдПрдордмреА (рд╣рд╕реБрд░рд╛) + реп реж рдПрдордмреА (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ)

рдирд┐рд╡реЗрджрди рек: рдПрд▓реНрдмрдо_рдЯреНрд░реИрдХреНрд╕_рдЬреЗрдирд░реЗ_рд▓

 query albums_tracks_genre_all { albums { id title tracks { id name genre { name } } } 

  • рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 328 req / s
  • рд╡рд┐рд▓рдВрдм: 73 рдореА
  • CPU: 100%
  • RAM: ~ 30MB (рд╣рд╕реБрд░рд╛) + 130MB (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ)

Source: https://habr.com/ru/post/hi428133/


All Articles