Je ne peux pas dire à quel point cela sera plus rapide, mais il existe des optimisations simples à votre requête
Dim queryInsert As String = "INSERT INTO tbl_shipdetails (ship_date, " & _
"item_type, item_code, imei1, imei2)" & _
"VALUES(@p1,'@p2,@p3,@p4,@p5)"
Dim cmd = New MySqlCommand(queryInsert, Myconnect)
cmd.Parameters.Add("@p1", MySqlDbType.VarChar)
cmd.Parameters.Add("@p2", MySqlDbType.VarChar)
cmd.Parameters.Add("@p3", MySqlDbType.VarChar)
cmd.Parameters.Add("@p4", MySqlDbType.VarChar)
cmd.Parameters.Add("@p5", MySqlDbType.VarChar)
For i As Integer = 0 To DataGridView1.Rows.Count - 1
cmd.Parameters("@p1").Value = DataGridView1.Rows(i).Cells(1).Value
cmd.Parameters("@p2").Value = DataGridView1.Rows(i).Cells(2).Value
cmd.Parameters("@p3").Value = DataGridView1.Rows(i).Cells(3).Value
cmd.Parameters("@p4").Value = DataGridView1.Rows(i).Cells(4).Value
cmd.Parameters("@p5").Value = DataGridView1.Rows(i).Cells(5).Value
cmd.ExecuteNonQuery()
Next
L'utilisation de paramètres vous permet de construire MySqlCommand une seule fois en dehors de la boucle et évite également le travail nécessaire pour concaténer les chaînes. (Sans parler du problème d'injection Sql)
Notez que j'ai suivi votre indice dans le texte sql où tous vos champs semblent être de type string (VarChar). Si vos champs sont de types de données différents, vous devez ajuster l'énumération MySqlDbType à votre type de données correct (et convertir les valeurs d'entrée=