Tõhususe vaatenurgast, milliseid üldtunnustatud reegleid tuleks sellisele andmebaasi skeemile rakendada?
Golang
Miks Go arendajate ei garanteeri kaardi läbimise järjekorda range ajal?
Mida teha, kui oleme lisanud kõik vajalikud indeksid, kuid andmebaas ei suuda endiselt toime tulla koormusega ja aeglustub?
// GetUsersList tagastab kasutajate nimekirja. (andmebaasis hoiame umbes 1 miljonit kasutajat) // Kasutatakse kasutajate nimekirja kuvamiseks admin paneelil. Kui isActive = true, tagastatakse ainult aktiivsed kasutajad. func (u *UsersRepo) GetUsersList(ctx context.Context, isActive bool) ([]User, error) { rows, err := u.DB.Query("SELECT id, name, phone FROM users WHERE is_active = ?", isActive) if err != nil { return nil, errors.New("kasutajate nimekirja saamise viga") } var users []User // Täidame kasutajate teabe. for rows.Next() { var user User err := rows.Scan(&user.ID, &user.Name, &user.Phone) if err != nil { return nil, err } // Saame kasutaja e-posti nimekirja err, err := u.DB.QueryContext(ctx, "SELECT email FROM user_emails WHERE user_id = ?", user.ID) if err != nil { return nil, errors.New("kasutajate nimekirja saamise viga") } var emails []string for er.Next() { var email string err := rows.Scan(&email) if err != nil { return nil, err } emails = append(emails, email) } if len(emails) != 0 { for i, e := range emails { emails[i] = strings.ToLower(e) } } user.Emails = emails // Saame profiili info VK API-st profile, err := getUserProfileFromVkApiByUserPhone(user.Phone) if err != nil { return nil, errors.New("kasutajate nimekirja saamise viga") } user.Profile = profile users = append(users, user) } if err = rows.Err(); err != nil { return nil, errors.New("kasutajate nimekirja saamise viga") } }
-- väljige välja raamatute nimekiri, sorteeritud id järgi, -- kuid väljundis vahetage kohtadega 2. ja 3. rida: -- 1 Meistr ja Margarita 100 -- 3 Kuldne Telenok 50 -- 2 Kaksteist tooli 200 -- 4 Eugène Onegin 250 -- 5 Belkini jutud 90 -- 6 Kolm musketäri 60