Can you connect to that DB any faster from the same machine not using Go? -- Marcin
On Wed, Oct 21, 2020 at 3:43 AM Bill <billyp...@gmail.com> wrote: > Hello, > I created the sql to fetch all info in one call instead of multiple calls > per each row. > > One thing I noticed about golang is that when I ping my Remote DB from > localhost (running in vscode) I get ping -> 1.573826274s. So I think this > is the reason that all my calls to db are delayed. > Have you any idea what can be the issue? Maybe a clean install of Golang > in MacOSX could fix this issue? If I test the code in server (upload the > binary) the response time is normal (200ms - 300ms). > > My Code to ping: > > begin := time.Now() > err := Config.DB.Ping() > log.Printf("Ping in %s (%v)", time.Since(begin), err) > Στις Τρίτη, 20 Οκτωβρίου 2020 στις 8:19:16 μ.μ. UTC+3, ο χρήστης > mar...@gmail.com έγραψε: > >> Go's database layer is generally pretty quick, I use it a lot, but your >> code immediately sets off my DB alarms, because you are doing queries >> within the body of another query loop, which means you're opening up lots >> of connections, which could be slow. >> >> I'd reorganize as followd. >> >> - Cache the results of your first query into an array, it's only 6 >> results. >> - Create two prepared statements, one for each query inside the loop. >> - Loop over your array of 6 results, and execute each prepared statement >> instead of parsing the query each time. >> >> By doing it this way, you should use 1 connection for the entire loop, >> and you'll only be parsing statements once each. >> >> If this is still slow, I'd start looking at your database performance, >> maybe. >> >> also, "defer rows.Close()" after you've checked if the query didn't >> result an error. There are no rows to close if err != nil >> >> -- Marcin >> >> >> >> On Tue, Oct 20, 2020 at 9:52 AM <bill...@gmail.com> wrote: >> >>> I use Go with github.com/go-sql-driver/mysql to connect to MySQL. The >>> performance in Go vs other languages is terrible or I'm missing something. >>> >>> I use Go for my REST API, an example is below: >>> >>> We have a table with posts. We fetch the posts, on each post we search >>> favorites table (if user has favorited this post and if he likes it). >>> >>> posts := make([]*MembersModel.Post, 0, 6) >>> >>> postsResults, err := Config.DB.Query("SELECT id, b64, title, >>> description, total_likes, total_favorites, published_date FROM posts >>> ORDER BY id DESC LIMIT 6") >>> >>> defer postsResults.Close() >>> >>> if err != nil { >>> fmt.Println(err) >>> panic(err.Error()) >>> } >>> >>> for postsResults.Next() { >>> var postID int >>> var b64 string >>> var title string >>> var description string >>> var total_likes int >>> var total_favorites int >>> var published_date string >>> >>> postsResults.Scan(&id, &b64, &title, &description, &total_likes, >>> &total_favorites, &published_date) >>> >>> var count int >>> var favorited string >>> >>> fetchBookmarks := Config.DB.QueryRow("SELECT COUNT(*) FROM >>> favorites where userID = ? and postID = ? and status = ?", userID, postID, >>> "added").Scan(&count) >>> >>> if fetchBookmarks != nil { >>> fmt.Println("error") >>> } >>> >>> if count == 0 { >>> favorited = "no" >>> } else { >>> favorited = "yes" >>> } >>> >>> var countSubmitted int >>> var likedPost string >>> >>> fetchLikes := Config.DB.QueryRow("SELECT COUNT(*) FROM likes >>> where userID = ? and postID = ? and status=?", userID, postID, >>> "liked").Scan(&countSubmitted) >>> >>> if fetchLikes != nil { >>> fmt.Println("error") >>> } >>> >>> if countSubmitted == 0 { >>> likedPost = "no" >>> } else { >>> likedPost = "yes" >>> } >>> >>> post := &MembersModel.JobList{ >>> PostID: b64, >>> Title: title, >>> Description: description, >>> Likes: total_likes, >>> PubDate: published_date, >>> Bookmarked: favorited, >>> Liked: likedPost, >>> } >>> >>> posts = append(posts, post) >>> } >>> >>> Average time to fetch these results -> 10 seconds! >>> >>> If I exclude the MYSQL calls inside the loop, the time to fetch these >>> results is 300ms. >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/e3f758d8-595f-4f0d-9aa6-d0b87899007fo%40googlegroups.com >>> . >>> >> -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/c8aa0609-fccb-4cac-83d4-309375d480c5n%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/c8aa0609-fccb-4cac-83d4-309375d480c5n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CA%2Bv29LubmahXEjVb8JqbNfUOnfhts82DS362Q_%3DFpWcUzC%2B2Kw%40mail.gmail.com.