原创文章,转载请注明出处
https://qiedd.com/
写入
package main import ( "fmt" "github.com/glebarez/sqlite" "gorm.io/gorm" "math/rand" "time" ) func main() { db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) db.AutoMigrate(&Person{}) //初始化数据 names := []string{"Alice", "Bob", "Charlie", "Dave", "Eve"} addresses := []string{"NY", "CA", "FL", "TX", "IL"} now := time.Now() //随机生成 200w 个 person for i := 1; i <= 2000000; i++ { rand.Seed(time.Now().UnixNano()) p := Person{ ID: i, Name: names[rand.Intn(len(names))], Age: rand.Intn(100), Address: addresses[rand.Intn(len(addresses))], CreatedAt: time.Now(), } db.Create(&p) } fmt.Println("数据插入成功!") fmt.Println(time.Since(now)) } type Person struct { ID int `gorm:"primary_key"` Name string Age int Address string CreatedAt time.Time }
结果
数据插入成功! 2h30m34.942239009s # db 大小 189M ./test.db
(这写入真是慢死了)
查询
稍微改下代码
查询名称和地址
func main() { db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) db.Logger = logger.Default.LogMode(logger.Silent) db.AutoMigrate(&Person{}) names := []string{"Alice", "Bob", "Charlie", "Dave", "Eve"} addresses := []string{"NY", "CA", "FL", "TX", "IL"} for _, name := range names { for _, address := range addresses { now := time.Now() result := db.Where(Person{Name: name, Address: address}).Find(&[]Person{}) fmt.Println("名称:", name, "地址:", address, "结果数:", result.RowsAffected, "耗时:", time.Since(now)) } } }
结果输出
名称: Alice 地址: NY 结果数: 79792 耗时: 459.764813ms 名称: Alice 地址: CA 结果数: 79897 耗时: 444.433424ms 名称: Alice 地址: FL 结果数: 80087 耗时: 516.538781ms 名称: Alice 地址: TX 结果数: 80012 耗时: 507.886965ms 名称: Alice 地址: IL 结果数: 79985 耗时: 449.608702ms 名称: Bob 地址: NY 结果数: 79978 耗时: 433.474074ms 名称: Bob 地址: CA 结果数: 79472 耗时: 493.309782ms 名称: Bob 地址: FL 结果数: 79702 耗时: 462.505369ms 名称: Bob 地址: TX 结果数: 80112 耗时: 480.409148ms 名称: Bob 地址: IL 结果数: 79477 耗时: 472.618268ms 名称: Charlie 地址: NY 结果数: 80270 耗时: 490.878917ms 名称: Charlie 地址: CA 结果数: 80255 耗时: 470.156505ms 名称: Charlie 地址: FL 结果数: 80337 耗时: 486.317942ms 名称: Charlie 地址: TX 结果数: 79849 耗时: 475.793811ms 名称: Charlie 地址: IL 结果数: 80125 耗时: 502.044823ms 名称: Dave 地址: NY 结果数: 79962 耗时: 450.434872ms 名称: Dave 地址: CA 结果数: 80389 耗时: 433.8821ms 名称: Dave 地址: FL 结果数: 80025 耗时: 460.588026ms 名称: Dave 地址: TX 结果数: 79895 耗时: 439.51688ms 名称: Dave 地址: IL 结果数: 79707 耗时: 427.046484ms 名称: Eve 地址: NY 结果数: 79814 耗时: 400.381533ms 名称: Eve 地址: CA 结果数: 80144 耗时: 428.600051ms 名称: Eve 地址: FL 结果数: 80566 耗时: 425.292591ms 名称: Eve 地址: TX 结果数: 79914 耗时: 424.515291ms 名称: Eve 地址: IL 结果数: 80234 耗时: 444.311963ms
修改 SQLite 驱动
但是在你的机器上需要 C 语言的编译器
# 修改 import import ( "gorm.io/driver/sqlite" // 基于 GGO 的 Sqlite 驱动 // "github.com/glebarez/sqlite" // 纯 Go 实现的 SQLite 驱动, 详情参考: https://github.com/glebarez/sqlite "gorm.io/gorm" )
输出结果
名称: Alice 地址: NY 结果数: 79792 耗时: 331.691255ms 名称: Alice 地址: CA 结果数: 79897 耗时: 342.582386ms 名称: Alice 地址: FL 结果数: 80087 耗时: 338.694837ms 名称: Alice 地址: TX 结果数: 80012 耗时: 359.97211ms 名称: Alice 地址: IL 结果数: 79985 耗时: 332.919592ms 名称: Bob 地址: NY 结果数: 79978 耗时: 347.770107ms 名称: Bob 地址: CA 结果数: 79472 耗时: 362.896942ms 名称: Bob 地址: FL 结果数: 79702 耗时: 349.578253ms 名称: Bob 地址: TX 结果数: 80112 耗时: 355.780891ms 名称: Bob 地址: IL 结果数: 79477 耗时: 361.505399ms 名称: Charlie 地址: NY 结果数: 80270 耗时: 361.762ms 名称: Charlie 地址: CA 结果数: 80255 耗时: 368.023681ms 名称: Charlie 地址: FL 结果数: 80337 耗时: 355.806076ms 名称: Charlie 地址: TX 结果数: 79849 耗时: 360.012495ms 名称: Charlie 地址: IL 结果数: 80125 耗时: 375.368893ms 名称: Dave 地址: NY 结果数: 79962 耗时: 341.963363ms 名称: Dave 地址: CA 结果数: 80389 耗时: 350.752487ms 名称: Dave 地址: FL 结果数: 80025 耗时: 378.649261ms 名称: Dave 地址: TX 结果数: 79895 耗时: 327.951161ms 名称: Dave 地址: IL 结果数: 79707 耗时: 375.770875ms 名称: Eve 地址: NY 结果数: 79814 耗时: 315.339861ms 名称: Eve 地址: CA 结果数: 80144 耗时: 357.380703ms 名称: Eve 地址: FL 结果数: 80566 耗时: 345.420916ms 名称: Eve 地址: TX 结果数: 79914 耗时: 327.417359ms 名称: Eve 地址: IL 结果数: 80234 耗时: 338.473719ms
添加更多的条件限制
换回纯 Go 驱动
如果在 Where 中加入对时间戳的条件限制, 或者添加 Limit, 可以显著的提升搜索速度
ts := int64(1673373600) t := time.Unix(ts, 0) for _, name := range names { for _, address := range addresses { now := time.Now() result := db.Where("created_at > ?", t). Where(Person{Name: name, Address: address}). Find(&[]Person{}) fmt.Println("名称:", name, "地址:", address, "结果数:", result.RowsAffected, "耗时:", time.Since(now)) } }
输出结果
名称: Alice 地址: NY 结果数: 33799 耗时: 247.815601ms 名称: Alice 地址: CA 结果数: 33791 耗时: 255.018477ms 名称: Alice 地址: FL 结果数: 33779 耗时: 253.800418ms 名称: Alice 地址: TX 结果数: 33665 耗时: 248.986081ms 名称: Alice 地址: IL 结果数: 33597 耗时: 266.132193ms 名称: Bob 地址: NY 结果数: 33982 耗时: 266.475719ms 名称: Bob 地址: CA 结果数: 33811 耗时: 265.876483ms 名称: Bob 地址: FL 结果数: 33646 耗时: 254.016065ms 名称: Bob 地址: TX 结果数: 33877 耗时: 262.474465ms 名称: Bob 地址: IL 结果数: 33581 耗时: 239.474733ms 名称: Charlie 地址: NY 结果数: 34079 耗时: 239.520908ms 名称: Charlie 地址: CA 结果数: 34061 耗时: 246.924159ms 名称: Charlie 地址: FL 结果数: 34018 耗时: 256.355706ms 名称: Charlie 地址: TX 结果数: 33713 耗时: 261.122728ms 名称: Charlie 地址: IL 结果数: 34278 耗时: 257.259343ms 名称: Dave 地址: NY 结果数: 34111 耗时: 249.959789ms 名称: Dave 地址: CA 结果数: 34265 耗时: 250.490755ms 名称: Dave 地址: FL 结果数: 33854 耗时: 236.711312ms 名称: Dave 地址: TX 结果数: 33899 耗时: 248.901693ms 名称: Dave 地址: IL 结果数: 33715 耗时: 252.780905ms 名称: Eve 地址: NY 结果数: 33771 耗时: 247.077266ms 名称: Eve 地址: CA 结果数: 33840 耗时: 239.175751ms 名称: Eve 地址: FL 结果数: 34090 耗时: 270.914291ms 名称: Eve 地址: TX 结果数: 33911 耗时: 259.585643ms 名称: Eve 地址: IL 结果数: 33835 耗时: 238.703724ms
添加结果限制
for _, name := range names { for _, address := range addresses { now := time.Now() result := db.Where("created_at > ?", t). Where(Person{Name: name, Address: address}). Limit(100). Find(&[]Person{}) fmt.Println("名称:", name, "地址:", address, "结果数:", result.RowsAffected, "耗时:", time.Since(now)) } }
输出
名称: Alice 地址: NY 结果数: 100 耗时: 862.319µs 名称: Alice 地址: CA 结果数: 100 耗时: 604.225µs 名称: Alice 地址: FL 结果数: 100 耗时: 707.268µs 名称: Alice 地址: TX 结果数: 100 耗时: 661.432µs 名称: Alice 地址: IL 结果数: 100 耗时: 1.017571ms 名称: Bob 地址: NY 结果数: 100 耗时: 1.031757ms 名称: Bob 地址: CA 结果数: 100 耗时: 909.838µs 名称: Bob 地址: FL 结果数: 100 耗时: 916.511µs 名称: Bob 地址: TX 结果数: 100 耗时: 674.346µs 名称: Bob 地址: IL 结果数: 100 耗时: 647.606µs 名称: Charlie 地址: NY 结果数: 100 耗时: 686.229µs 名称: Charlie 地址: CA 结果数: 100 耗时: 613.362µs 名称: Charlie 地址: FL 结果数: 100 耗时: 724.731µs 名称: Charlie 地址: TX 结果数: 100 耗时: 913.355µs 名称: Charlie 地址: IL 结果数: 100 耗时: 651.934µs 名称: Dave 地址: NY 结果数: 100 耗时: 666.762µs 名称: Dave 地址: CA 结果数: 100 耗时: 631.135µs 名称: Dave 地址: FL 结果数: 100 耗时: 734.82µs 名称: Dave 地址: TX 结果数: 100 耗时: 569.469µs 名称: Dave 地址: IL 结果数: 100 耗时: 695.105µs 名称: Eve 地址: NY 结果数: 100 耗时: 632.047µs 名称: Eve 地址: CA 结果数: 100 耗时: 624.733µs 名称: Eve 地址: FL 结果数: 100 耗时: 670.388µs 名称: Eve 地址: TX 结果数: 100 耗时: 620.124µs 名称: Eve 地址: IL 结果数: 100 耗时: 654.709µs
3 条评论
pekingmy · 2023年2月4日 下午2:28
你好博主,TNTgo的内测apk你那里有么,就是你们谈的可以投屏哪个版本不限制,冒昧的问,打搅了。谢谢!
Lordpenguindd · 2023年2月4日 下午3:08
忘记放哪了
pekingmy · 2023年2月4日 下午4:55
谢谢回复,之前那个网盘我看失效了