Z pohledu výkonu by měly být na takový schéma databáze uplatněny obecně přijímaná pravidla?
Golang
Proč vývojáři jazyka Go nezaručují pořadí průchodu mapou při použití range?
Co dělat, pokud jsme přidali všechny potřebné indexy, ale databáze stále nezvládá zátěž a zpomaluje?
// GetUsersList vrací seznam uživatelů. (v databázi ukládáme přibližně 1 milion uživatelů) // Používá se k zobrazení seznamu uživatelů v administračním panelu. Pokud je isActive = true, vrací se pouze aktivní uživatelé. 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("chyba při získávání seznamu uživatelů") } var users []User // Vyplňte informace o uživatelích. for rows.Next() { var user User err := rows.Scan(&user.ID, &user.Name, &user.Phone) if err != nil { return nil, err } // Získejte seznam e-mailů uživatele err, err := u.DB.QueryContext(ctx, "SELECT email FROM user_emails WHERE user_id = ?", user.ID) if err != nil { return nil, errors.New("chyba při získávání seznamu uživatelů") } 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 { e = strings.ToLower(e) emails[i] = e } } user.Emails = emails // Získejte profilové informace z API VKontakte profile, err := getUserProfileFromVkApiByUserPhone(user.Phone) if err != nil { return nil, errors.New("chyba při získávání seznamu uživatelů") } user.Profile = profile users = append(users, user) } if err = rows.Err(); err != nil { return nil, errors.New("chyba při získávání seznamu uživatelů") } }
-- vypiš seznam knih seřazený podle id, -- ale v výstupu vyměň řádky 2 a 3: -- 1 Mistr a Markétka 100 -- 3 Zlatý teleenok 50 -- 2 Dvanáct židlí 200 -- 4 Eugen Onegin 250 -- 5 Belkinovy povídky 90 -- 6 Tři mušketýři 60