À mesure que la quantité de données augmente, les opérations par lots sur les bases de données MySQL deviennent de plus en plus importantes. Afin d'améliorer l'efficacité des opérations par lots MySQL, de nombreuses personnes choisissent d'utiliser le langage Go pour créer des programmes hautes performances. Cet article explique comment utiliser le langage Go pour créer un programme de traitement par lots MySQL efficace.
1. Pourquoi utiliser le langage Go pour créer un programme de traitement par lots MySQL ?
La concurrence du langage Go est très bonne En tant que langage avec une implémentation complète de la concurrence, il peut facilement effectuer un traitement parallèle. En comparaison, le langage Java nécessite une surcharge supplémentaire pour implémenter le traitement parallèle, et bien que le langage C# ait des fonctionnalités de concurrence similaires à celles de Go, ses performances dans l'environnement Linux doivent encore être améliorées.
La gestion de la mémoire du langage Go est très rapide Par rapport au langage C et au langage C++, la gestion manuelle de la mémoire n'est pas requise. La gestion de la mémoire du langage Go peut allouer efficacement de la mémoire et récupérer de la mémoire.
Un autre avantage de l'utilisation du langage Go pour créer un programme de traitement par lots MySQL est qu'il est convivial pour les appels système. Dans les langages de programmation traditionnels, les appels système entraînent généralement une surcharge importante. Mais le langage Go fonctionne bien à cet égard, ce qui signifie que vous pouvez obtenir de meilleures performances lorsque vous utilisez MySQL par lots.
2. Créez un programme de traitement par lots MySQL
Utiliser Go pour faire fonctionner MySQL nécessite un pilote correspondant. Go prend en charge plusieurs pilotes MySQL et un traitement par lots efficace peut être effectué en utilisant n'importe lequel d'entre eux. Ici, nous choisissons le pilote github.com/go-sql-driver/mysql. Si (veuillez compléter cette partie)
Pour vous connecter à MySQL, vous devez saisir l'adresse de la base de données, le nom d'utilisateur, le mot de passe et d'autres informations, puis utiliser la fonction Ouvrir dans le SQL intégré paquet de langage Go pour se connecter.
var db *sql.DB
db, err = sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test")
if err != nil {
log.Fatal( err)
}
Remarque : le langage Go prend en charge le regroupement de connexions, qui peut être utilisé pour mieux prendre en charge plusieurs connexions et transactions.
Pour effectuer des insertions par lots, vous pouvez insérer tous les enregistrements dans MySQL en même temps en construisant une instruction SQL :
var valeursString []string
for _, record := range records {
valuesString = append (valuesString, fmt.Sprintf("('%s', '%s')", record.Field1, record.Field2))
}
var query = fmt.Sprintf("INSERT INTO table code> (<code>field1
, field2
) VALUES %s", strings.Join(valuesString, ","))table
(field1
, field2
) VALUES %s", strings.Join(valuesString, ","))
_, err = ts.db.Exec(query)
if err != nil {
return err
}
另一种批量插入的方法是使用MySQL自带的LOAD DATA INFILE语句,这个语句可以快速地载入并且插入数据。
var dataToLoad string
for _, record := range records {
dataToLoad += fmt.Sprintf("%s,%s
", record.Field1, record.Field2)
}
query := fmt.Sprintf("LOAD DATA LOCAL INFILE '%s' INTO TABLE table
FIELDS TERMINATED BY ','", "/tmp/data.csv")
_, err = ts.db.Exec(query)
if err != nil {
return err
}
4.节省内存
在批量处理的过程中,Go语言可以用Channel来减轻内存负担,避免卡死。可以把要传给MySQL的大量数据分配到多个channel上面,然后在一个协程里读取channel,写入MySQL。
在MySQL批量处理程序中,常用的一种模式是将所有插入操作包含在一个事务中。如果出现任何插入错误,可以回滚该事务并撤消所有以前的操作。在Go语言中,使用数据库驱动程序自带的事务管理程序即可轻松实现事务。
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
stmt, err := tx.Prepare("INSERT INTO table
(field1
, field2
_, err = ts.db.Exec(query)
if err != nil {
return err
}
var dataToLoad string
for _, record := range records {
", record.Field1, record.Field2)
}
query := fmt.Sprintf ("CHARGER LES DONNÉES LOCAL INFILE '%s' DANS LA TABLE table
CHAMPS TERMINÉS PAR ','", "/tmp/data.csv")
if err != nil {
return err}
4. Économisez de la mémoire
🎜Dans le processus de traitement par lots, le langage Go peut utiliser Channel pour réduire la charge de mémoire et éviter le blocage. Une grande quantité de données à transmettre à MySQL peut être distribuée sur plusieurs canaux, puis les canaux sont lus dans une coroutine et écrits sur MySQL. 🎜table
( field1
, field2
) VALUES(?,?)")🎜if err != nil {🎜 log.Fatal(err)🎜}🎜defer stmt.Close()🎜 🎜for _, record := range records {🎜 _, err := stmt.Exec(record.Field1, record.Field2)🎜 if err != nil {🎜tx.Rollback() return
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!