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.

Reply via email to