如题,
sqlite 依赖于 cgo,不太方便交叉编译。
sqlite+dll 的方式只适合 windows,不适合 linux 。
kv 数据库有不少,但是功能上不如 sql 数据库齐全。
除此之外还有其他的选择吗?
储存少量数据需求,几千行数据。
1
janxin 2020-03-25 20:56:38 +08:00 1
搜索 sqlite pure golang
|
2
lniwn 2020-03-25 21:09:08 +08:00 1
前些天从 sqlite 换到了 kv 数据库 bolt,目前没有发现不适。
https://github.com/etcd-io/bbolt |
3
Trim21 2020-03-25 21:11:44 +08:00 1
https://github.com/go-sqlite/sqlite3 “pure-Go sqlite3 file reader”
|
4
wsy2220 2020-03-25 21:22:42 +08:00 via Android 1
sqlite 是交叉编译最容易的 c 库了……
|
5
loading 2020-03-25 22:05:21 +08:00 via Android 1
golang 的交叉编译太简单了,除非还有别的库。
sqlite 真的香。 |
6
gamexg OP |
7
gamexg OP @lniwn #2
我原来测试过 github.com/boltdb/bolt 。 批量写入时,如果 key 不是顺序而是随机值,第一次写入速度会非常慢,100000 条需要 19s 。 刚刚试了下,etcd 也存在这个问题。 |
8
yrj 2020-03-26 07:31:12 +08:00 via iPad
楼主找到了也告诉我一声,我只找到了 sqlite
|
9
lniwn 2020-03-26 09:40:33 +08:00
@gamexg #7 方便把测试代码发出来看下吗?这种单文件数据库,每次 update 操作都是存盘的,用 batch 方式,或者手动事务应该不至于这么低的性能。
|
10
gamexg OP @lniwn #9
``` package main import ( "encoding/binary" "fmt" "log" "math/rand" "os" "time" "go.etcd.io/bbolt" ) func itob(v int) []byte { b := make([]byte, 8) binary.BigEndian.PutUint64(b, uint64(v)) return b } func main() { test2() } // 测试随机批量连续 func test2() { os.Remove("test2.db") db, err := bbolt.Open("test2.db", 0600, nil) if err != nil { log.Fatal(err) } defer db.Close() err = db.Update(func(tx *bbolt.Tx) error { _, err := tx.CreateBucketIfNotExists([]byte("MyBucket")) return err }) if err != nil { panic(err) } buf := []byte("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") data := make([]int, 100000) for i, _ := range data { data[i] = rand.Int() } for i := 0; i < 20; i++ { sTime := time.Now() err = db.Update(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte("MyBucket")) for _, v := range data { err := b.Put(itob(v), buf) if err != nil { return err } } return nil }) /* 乱序批量写 100000:15.2067849s 乱序批量写 100000:409.6209ms 乱序批量写 100000:421.3134ms 乱序批量写 100000:381.5371ms 乱序批量写 100000:381.5839ms 乱序批量写 100000:361.8394ms 乱序批量写 100000:362.8142ms 乱序批量写 100000:364.7673ms 乱序批量写 100000:359.8283ms 乱序批量写 100000:376.0383ms 乱序批量写 100000:361.9876ms 乱序批量写 100000:362.0323ms 乱序批量写 100000:374.0311ms 乱序批量写 100000:365.0348ms 乱序批量写 100000:360.0383ms 乱序批量写 100000:361.022ms 乱序批量写 100000:364.0195ms 乱序批量写 100000:354.024ms 乱序批量写 100000:370.0098ms 乱序批量写 100000:379.9845ms */ fmt.Println("乱序批量写 100000:", time.Now().Sub(sTime)) } } ``` |
11
ysmood 2020-03-26 13:34:23 +08:00
|
13
bwangel 2020-03-30 14:36:46 +08:00
楼主是否考虑带服务端的嵌入式数据库?
https://github.com/taosdata/TDengine https://github.com/rqlite/rqlite 这两个的客户端都是纯 Go,就是需要额外启动一个服务端,但服务端的存储都是单文件,看起来没那么复杂。 |
14
bwangel 2020-03-30 14:52:30 +08:00
|
15
monkeyWie 2020-04-01 16:05:16 +08:00
推荐两个 K/V 库
https://github.com/xujiajun/nutsdb https://github.com/prologic/bitcask 如果习惯写 sql 的话还是建议 sqlite,用 xgo 交叉编译就行了,参考: https://monkeywie.github.io/2019/10/10/go-cross-compile |
16
wzw 2020-05-11 09:30:17 +08:00
@monkeyWie #15 刚接触 Go. 所以想问问 为啥是推荐这 2 个数据库
而不是 badger - Fast key-value store in Go. bbolt - An embedded key/value database for Go. |
17
monkeyWie 2020-05-12 16:46:04 +08:00
|