又一个号称兼容SQLite,速度快几百倍的数据库引擎,不太相信。
存储库地址:https://github.com/samyfodil/musql
第一个版本是10月发布的。作者没说用了AI编程。
一开始下载了二进制包,但是里面只有服务端和转换文件,以及一个doom游戏,而没有客户端,放弃。
改用go语言
C:\d>wget https://go.dev/dl/go1.27.3.windows-amd64.zip
--2026-10-24 18:31:25-- https://go.dev/dl/go1.27.3.windows-amd64.zip
Resolving go.dev (go.dev)... 2001:4860:4802:34::15, 2001:4860:4802:36::15, 2001:4860:4802:38::15, ...
Connecting to go.dev (go.dev)|2001:4860:4802:34::15|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://dl.google.com/go/go1.27.3.windows-amd64.zip [following]
--2026-10-24 18:31:26-- https://dl.google.com/go/go1.27.3.windows-amd64.zip
Resolving dl.google.com (dl.google.com)... 220.181.174.33
Connecting to dl.google.com (dl.google.com)|220.181.174.33|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 79010309 (75M) [application/zip]
Saving to: 'go1.27.3.windows-amd64.zip'
go1.27.3.windows-amd64.zip 100%[=================================================>] 75.35M 39.9MB/s in 1.9s
2026-10-24 18:31:28 (39.9 MB/s) - 'go1.27.3.windows-amd64.zip' saved [79010309/79010309]
解压缩到目录gowin
C:\d>cd gowin
C:\d\gowin>dir
驱动器 C 中的卷没有标签。
卷的序列号是 D0F9-C561
C:\d\gowin 的目录
2026/10/24 18:32 <DIR> .
2026/10/24 18:32 <DIR> ..
2026/10/24 18:32 <DIR> go
0 个文件 0 字节
3 个目录 179,812,171,776 可用字节
C:\d\gowin>cd go\bin
C:\d\gowin\go\bin>go version
go version go1.27.3 windows/amd64
C:\d\gowin\go\bin>cd \d
C:\d>set GOROOT=C:\d\gowin\go
C:\d>mkdir goprj
C:\d>set GOPATH=c:\d\goprj
C:\d>set path=%GOROOT%\bin;%GOPATH%\bin;%PATH%
C:\d>go version
go version go1.27.3 windows/amd64
然后用一个hello world程序测试。
go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
测试成功。
C:\d>go run test.go
Hello, World!
test.go:7:5: no required module provides package github.com/samyfodil/musql/driver; to add it:
go get github.com/samyfodil/musql/driver
C:\d>move test.go goprj
移动了 1 个文件。
C:\d>cd goprj
下载驱动失败,按照网上的办法添加国内代理,可以下载了,也比较慢。
C:\d\goprj>go get github.com/samyfodil/musql/driver
go: module github.com/samyfodil/musql/driver: Get "https://proxy.golang.org/github.com/samyfodil/musql/driver/@v/list": dial tcp [2607:f8b0:400a:80c::2011]:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
C:\d\goprj>go get github.com/samyfodil/musql/driver
go: module github.com/samyfodil/musql/driver: Get "https://proxy.golang.org/github.com/samyfodil/musql/driver/@v/list": dial tcp 142.250.73.113:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
C:\d\goprj>go env -w GOPROXY=https://goproxy.cn,direct
C:\d\goprj>go get github.com/samyfodil/musql/driver
go: downloading github.com/samyfodil/musql v0.4.0
go: downloading golang.org/x/sys v0.46.0
go: upgraded go 1.25rc2 => 1.27.0
go: added github.com/samyfodil/musql v0.4.0
go: added golang.org/x/sys v0.46.0
只有如下的例子代码片段,对不会go语言的人,比如我就很困难。
In a Go program
go
go get github.com/samyfodil/musql/driver
import (
"database/sql"
_ "github.com/samyfodil/musql/driver"
)
db, err := sql.Open("sqlite", "app.musq") // created if missing
// ...then use db exactly like any database/sql database.
Pure Go, no CGo; needs Go 1.27 or newer. The driver registers as sqlite (and musql), so code written for another SQLite driver usually only changes its import. Use one SQL statement per Exec or Query call.
参考duckdb的go程序例子和代码片段改写。
go
package main
import (
"database/sql"
"errors"
"fmt"
"log"
_ "github.com/samyfodil/musql/driver"
)
func main() {
db, err := sql.Open("sqlite", "app.musq")
if err != nil {
log.Fatal(err)
}
defer db.Close()
_, err = db.Exec(`CREATE TABLE people (id INTEGER, name VARCHAR)`)
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(`INSERT INTO people VALUES (42, 'John')`)
if err != nil {
log.Fatal(err)
}
var (
id int
name string
)
row := db.QueryRow(`SELECT id, name FROM people`)
err = row.Scan(&id, &name)
if errors.Is(err, sql.ErrNoRows) {
log.Println("no rows")
} else if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %d, name: %s\n", id, name)
}
测试通过
C:\d\goprj>go run test2.go
id: 42, name: John
再把建表和插入部分删除,查询部分改为
row := db.QueryRow(`SELECT s id, 'sum' name from(select sum(value) s FROM generate_series(1, 10000000) )`)
执行时间如下。
C:\d\goprj>go run test3.go
执行查询前: 2026-10-24 19:39:23.9789199 +0800 CST m=+0.001547001
id: 50000005000000, name: sum
执行查询后: 2026-10-24 19:39:27.412829 +0800 CST m=+3.435456101
时间间隔: 3.4339091s
C:\d\goprj>go build test3.go
C:\d\goprj>test3
执行查询前: 2026-10-24 19:41:08.933372 +0800 CST m=+0.001756201
id: 50000005000000, name: sum
执行查询后: 2026-10-24 19:41:12.0184741 +0800 CST m=+3.086858301
时间间隔: 3.0851021s
go build默认就是release, 所以已经是优化后的结果。