Rumah  >  Artikel  >  pangkalan data  >  Cara menggunakan bahasa Go untuk operasi pemecahan data MySQL

Cara menggunakan bahasa Go untuk operasi pemecahan data MySQL

王林
王林asal
2023-06-17 10:54:101282semak imbas

Dengan perkembangan pesat Internet, bilangan pengguna aplikasi Web terus meningkat, dan jumlah data terus berkembang. Untuk menghadapi situasi ini, menggunakan teknologi perkongsian data untuk mencapai pembahagian data mendatar telah menjadi penyelesaian pengembangan pangkalan data yang biasa. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk melaksanakan operasi pemecahan data MySQL.

1. Apakah pemecahan data yang besar? Apabila jumlah data adalah besar, pembahagian data mendatar boleh dicapai dengan menguraikan set data, dengan itu mengurangkan tekanan pada nod individu dan meningkatkan kestabilan prestasi aplikasi web.

2. Bahasa Go melaksanakan akses sharded kepada MySQL

Go ialah bahasa pengaturcaraan moden yang menyokong keselarasan tinggi Kerana kecekapan pelaksanaannya yang sangat tinggi dan ciri keselarasan yang sangat baik, ia digunakan dalam program pangkalan data semakin mendapat perhatian dalam perkembangannya. Berikut ialah contoh penggunaan bahasa Go untuk mengakses MySQL untuk operasi perkongsian data.

Mewujudkan sambungan pangkalan data
  1. Untuk menyambung ke pangkalan data MySQL dalam program Go, anda perlu menggunakan pemacu dan maklumat sambungan yang sepadan. Untuk membuka sambungan pangkalan data, anda perlu melaksanakan kaedah Buka, dan untuk menutup sambungan, anda perlu melaksanakan kaedah Tutup. Berikut ialah contoh kod untuk mewujudkan sambungan pangkalan data:
import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

// 数据库信息
const (
    USERNAME = "root"
    PASSWORD = "password"
    NETWORK  = "tcp"
    SERVER   = "127.0.0.1"
    PORT     = 3306
    DATABASE = "test"
)

func main() {
    // 数据库连接
    db, err := sql.Open("mysql", USERNAME+":"+PASSWORD+"@"+NETWORK+"("+SERVER+":"+strconv.Itoa(PORT)+")/"+DATABASE+"?charset=utf8")
    if err != nil {
        fmt.Println("Connection Failed:", err.Error())
        return
    }

    // 初始化数据库
    defer db.Close()
}

Buat jadual yang dipecahkan
  1. Jadual yang dipecahkan biasanya termasuk kekunci sharding dan nama jadual setiap data maklumat serpihan, dsb. Antaranya, kunci serpihan boleh menjadi mana-mana medan dan digunakan terutamanya untuk menentukan serpihan mana data disimpan. Berikut ialah contoh kod untuk mencipta jadual berpecah:
// 分片表信息
const TABLE_NAME = "user_info"
const SHARD_KEY = "user_id"

// 根据分片信息生成的各个分片表名称的列表
var shardTableList []string

func main() {
    // 创建分片表
    tableSql := fmt.Sprintf("CREATE TABLE `%s` (`id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `username` varchar(20) DEFAULT '', `password` varchar(50) DEFAULT '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;", TABLE_NAME)
    _, err := db.Exec(tableSql)
    if err != nil {
        fmt.Println("Database initialization failed:", err.Error())
        return
    }

    // 生成分片表
    for i := 0; i < 4; i++ {
        shardTableName := fmt.Sprintf("%s_%d", TABLE_NAME, i)
        shardTableSql := fmt.Sprintf("CREATE TABLE `%s` (`id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `username` varchar(20) DEFAULT '', `password` varchar(50) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;", shardTableName)
        shardTableList = append(shardTableList, shardTableName)
        _, err := db.Exec(shardTableSql)
        if err != nil {
            fmt.Println("Database initialization failed:", err.Error())
            return
        }
    }
}

Sisipkan data
  1. Selepas melaksanakan pembahagian data, ditentukan bahawa data harus dimasukkan berdasarkan penghakiman kunci serpihan ke dalam jadual serpihan. Berikut ialah kod sampel untuk memasukkan data ke dalam jadual berpecah:
// 插入数据操作
func insertData(userId int, userName string, passWord string) error {
    shardIndex := userId % 4
    sqlStr := fmt.Sprintf("insert into %s (`user_id`,`username`,`password`) values (?,?,?)", shardTableList[shardIndex])
    _, err = db.Exec(sqlStr, userId, userName, passWord)
    if err != nil {
        fmt.Printf("Insert data failed. Error: %v
", err.Error())
        return err
    }

    fmt.Printf("Insert data success. userId=%d, userName=%s, passWord=%s
", userId, userName, passWord)
    return nil
}

func main() {
    // 插入数据
    insertData(1, "user1", "pass1")
    insertData(2, "user2", "pass2")
    insertData(3, "user3", "pass3")
    insertData(4, "user4", "pass4")
}

Mencari data
  1. Apabila menanyakan data, anda perlu menentukan sama ada data itu sepadan dengan kunci serpihan dalam jadual berpecah-belah. Jika data tiada dalam jadual sharded, anda perlu meneruskan carian dalam jadual sharded lain yang berkaitan. Berikut ialah contoh kod untuk menanyakan data jadual sharded:
// 查询数据操作
func queryData(userId int) (string, error) {
    shardIndex := userId % 4
    sqlStr := fmt.Sprintf("select `username`,`password` from %s where `user_id`=?", shardTableList[shardIndex])
    rows, err := db.Query(sqlStr, userId)
    if err != nil {
        fmt.Printf("Query data failed. Error: %v
", err.Error())
        return "", err
    }

    var userName, passWord string
    rows.Next()
    err = rows.Scan(&userName, &passWord)
    if err != nil {
        fmt.Printf("Query data failed. Error: %v
", err.Error())
        return "", err
    }

    fmt.Printf("Query data success. userId=%d, userName=%s, passWord=%s
", userId, userName, passWord)
    return userName, nil
}

func main() {
    // 查询数据
    queryData(1)
}

3. Ringkasan

Artikel ini memperkenalkan cara menggunakan bahasa Go untuk melaksanakan operasi pemecahan data MySQL, terutamanya termasuk mewujudkan sambungan pangkalan data, mencipta Perkara seperti sharding jadual, memasukkan data dan pertanyaan data. Dalam pembangunan sebenar, strategi dan kaedah sharding akan berbeza untuk senario aplikasi dan volum data yang berbeza, dan perlu diselaraskan dengan sewajarnya mengikut situasi sebenar.

Atas ialah kandungan terperinci Cara menggunakan bahasa Go untuk operasi pemecahan data MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn