golang mysql集群_golang mysql分库分表性能实战

本文探讨了使用Golang处理MySQL集群的分库分表策略,包括hash和range方法。通过实例展示了如何根据业务需求选择合适的分表策略,如用户登录用昵称则使用hash分表,按ID则用range分表。实验结果显示,分表能显著提高查询性能,但业务逻辑匹配度对性能影响较大。同时,文中强调了并发查询在大规模数据库中的优势和数据库架构演进的重要性。
摘要由CSDN通过智能技术生成

按照规矩,这里应该介绍一下golang和分库表,懒得写,跳过。

本文主要介绍两种分表方式,hash和range,对应不同对业务特性,假设有这样一个user表,字段id,name,home,balance:user表

数量大概1000w条:

一个查询大概耗时是这样的:

加索引肯定快多了,但是今天咱们讨论的主题不是索引,而是分表,就不给加索引了。

接下来是分表了,先假定业务逻辑是用户用昵称登陆,获取用户信息,那么就要用到hash分表了,先创建10张表,名字用user0-user9,结构一样,多一行uid:

然后填充数据,代码如下:

func MakeHashTrans(db *sql.DB) {

rows,err := db.Query("select * from user")

cloumns, err := rows.Columns()

if err != nil {

fmt.Println(err)

}

for rows.Next() {

err := rows.Scan(&cloumns[0], &cloumns[1], &cloumns[2], &cloumns[3])

if err != nil {

fmt.Println(err)

}

fmt.Println(cloumns[0])

hashValue := crc32.ChecksumIEEE([]byte(cloumns[1]))

tableId := hashValue % 10

a := int(tableId)

qry := "insert into user_"+strconv.Itoa(a)+" (`uid`, `name`, `home`, `balance`) values ("+cloumns[0]+",'"+cloumns[1]+"','"+cloumns[2]+"',"+cloumns[3]+")"

_, err = db.Exec(qry)

if err != nil {

fmt.Println(err)

}

}

}

具体逻辑是先取出数据,然后对name字段进行hash--crc32运算,得到结果对10求余

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值