原创文章,转载请注明出处
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
分类: Go

3 条评论

pekingmy · 2023年2月4日 下午2:28

你好博主,TNTgo的内测apk你那里有么,就是你们谈的可以投屏哪个版本不限制,冒昧的问,打搅了。谢谢!

    Lordpenguindd · 2023年2月4日 下午3:08

    忘记放哪了

      pekingmy · 2023年2月4日 下午4:55

      谢谢回复,之前那个网盘我看失效了

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据