按照规矩,这里应该介绍一下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求余