乐于分享
好东西不私藏

GORM 的并发安全是怎么实现的?翻源码就知道了

GORM 的并发安全是怎么实现的?翻源码就知道了

前阵子 code review,看到一段代码:好几个 goroutine 共用一个 db.Where("status = ?", 1) 的结果做查询。同事说"GORM 并发安全",我说"不一定"。

我干脆翻源码。看完发现 GORM 的设计挺聪明——它没承诺并发安全,也没用锁,靠的是写时复制给了一套用法范式。你按范式写就没事,不按就出事。

下面从源码角度拆开说。

环境准备

本文所有示例都可以直接跑。先统一把依赖和基础结构准备好。

依赖

import (    "context"    "database/sql"    "sync"    "time"    "golang.org/x/sync/errgroup"    "gorm.io/driver/mysql"    "gorm.io/gorm"    "gorm.io/gorm/clause")

数据库连接

// 初始化全局 DB 实例(clone=1 的种子实例)db, err := gorm.Open(mysql.Open("user:pass@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True"), &gorm.Config{})if err != nil {    panic(err)}

结构体定义

// Student 学生表type Student struct {    ID     int64  `gorm:"primaryKey;autoIncrement"`    Name   string `gorm:"type:varchar(64);index"`    Status string `gorm:"type:varchar(16)"`}// User 用户表(后面事务/泛型示例用)type User struct {    ID   int64  `gorm:"primaryKey;autoIncrement"`    Name string `gorm:"type:varchar(64)"`    Age  int    `gorm:"type:int"`}

建表 & 自动迁移

GORM 的 AutoMigrate 会根据结构体 tag 自动建表,省去手写 DDL。以下两种方式任选:

// 方式一:AutoMigrate(推荐,本地测试直接用)db.AutoMigrate(&Student{}, &User{})// 方式二:手写 SQL(生产环境推荐,表结构可控)db.Exec(`    CREATE TABLE IF NOT EXISTS students (        id     BIGINT AUTO_INCREMENT PRIMARY KEY,        name   VARCHAR(64) NOT NULL DEFAULT '',        status VARCHAR(16) NOT NULL DEFAULT '',        INDEX idx_name (name)    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4`)db.Exec(`    CREATE TABLE IF NOT EXISTS users (        id   BIGINT AUTO_INCREMENT PRIMARY KEY,        name VARCHAR(64) NOT NULL DEFAULT '',        age  INT NOT NULL DEFAULT 0    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4`)

文中代码依赖以上 dbStudentUser 定义,不再重复声明。


一、先看几个能跑出问题的代码

讲原理之前,直接看"不安全"长什么样。

1.1 查询条件互相污染

多个 goroutine 共享同一个链式调用结果,各自的 Where 会叠到同一条 SQL 里:

func Case1(db *gorm.DB) {    query := db.Where("id = ?", 1)    eg := errgroup.Group{}    for i := 0; i < 3; i++ {        i := i        eg.Go(func() error {            m := &Student{}            return query.Where("id = ?", i).Find(m).Error        })    }    if err := eg.Wait(); err != nil {        panic(err)    }}

实际执行的 SQL:

[6.656ms] [rows:0] SELECT * FROM `students` WHERE id = 1 AND id = 2 AND id = 1 AND id = 0---- 发生的错误panic: Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

三个 goroutine 的 id 条件全串一起了。

1.2 条件静默丢失

Or 这类方法在并发下可能被覆盖,丢了条件还不报错:

func Case2(db *gorm.DB) {    query := db.Table("students")    wg := sync.WaitGroup{}    for i := 0; i < 10; i++ {        wg.Add(1)        gofunc(id int) {            defer wg.Done()            query.Or("id = ?", id)        }(i)    }    wg.Wait()    var c int64    query.Count(&c) // 期望 10,实际可能只有 7}

实际可能执行的 SQL:

[101.629ms] [rows:1] SELECT count(*) FROM `students` WHERE id = 9 OR id = 1 OR id = 6 OR id = 7 OR id = 0 OR id = 4 OR id = 3

1.3 直接 panic:并发读写 map

GORM 的 Statement 内部用 map[string]clause.Clause 存 SQL 子句。Go runtime 对并发读写 map 零容忍,直接 fatal error:

func Case3(db *gorm.DB) {    query := db.Where("id = ?", 1)    wg := sync.WaitGroup{}    for i := 0; i < 64; i++ {        wg.Add(1)        gofunc() {            defer wg.Done()            query.Where("id = ?", 1).Where("id = ?", 1).Where("id = ?", 1)        }()    }    wg.Wait()    // fatal error: concurrent map read and map write}// 实际发生的错误:```textfatal error: concurrent map read and map writegoroutine 78 gp=0x453eca97eb40 m=0 mp=0x100c39220 [running]:runtime.fatal({0x1007fc400, 0x21})    /path/to/goroot/go/src/runtime/panic.go:1253 +0x58 fp=0x453eca816e10 sp=0x453eca816dd0 pc=0x1004d6e08internal/runtime/maps.fatal({0x1007fc400?, 0x60?})    /path/to/goroot/go/src/runtime/panic.go:1181 +0x20 fp=0x453eca816e30 sp=0x453eca816e10 pc=0x10050cba0runtime.mapaccess1_faststr(0x100c25400?, 0x100b8a7a0?, {0x1007ef081?, 0x1007617e8?})    /path/to/goroot/go/src/internal/runtime/maps/runtime_faststr.go:113 +0x104 fp=0x453eca816ec0 sp=0x453eca816e30 pc=0x10049bd24gorm.io/gorm.(*Statement).AddClause(0x453eca961860, {0x100bcca70, 0x453eca859da0})    /path/to/workspace/go/pkg/mod/gorm.io/gorm@v1.31.1/statement.go:277 +0xa0 fp=0x453eca816f10 sp=0x453eca816ec0 pc=0x10076fc30gorm.io/gorm.(*DB).Where(0x0?, {0x100b32640, 0x100bc7748}, {0x453eca956ee0, 0x1, 0x1})    /path/to/workspace/go/pkg/mod/gorm.io/gorm@v1.31.1/chainable_api.go:210 +0x74 fp=0x453eca816f60 sp=0x453eca816f10 pc=0x100761804main.Case3.func1()    /path/to/workspace/go/src/testj/main.go:79 +0x88 fp=0x453eca816fd0 sp=0x453eca816f60 pc=0x1007a7df8runtime.goexit({})    /path/to/goroot/go/src/runtime/asm_arm64.s:1447 +0x4 fp=0x453eca816fd0 sp=0x453eca816fd0 pc=0x100513994created by main.Case3 in goroutine 1    /path/to/workspace/go/src/testj/main.go:77 +0x84

1.4 Session 创建 + 条件修改并发,也 panic

条件修改哪怕是串行的,只要跟 Session 并发,照样崩:

func Case4(db *gorm.DB) {    query := db.Select("abc").Table("abc").Where("id = ?", 1)    wg := sync.WaitGroup{}    for i := 0; i < 1024; i++ {        wg.Add(1)        gofunc() {            defer wg.Done()            query.Session(&gorm.Session{Context: context.Background()})        }()        query.Where("id = ?", i) // 串行,但与 Session 并发仍然 panic    }    wg.Wait()}

// 实际发生的错误:

fatal error: concurrent map read and map writegoroutine 78 gp=0x453eca97eb40 m=0 mp=0x100c39220 [running]:runtime.fatal({0x1007fc400, 0x21})    /path/to/goroot/go/src/runtime/panic.go:1253 +0x58 fp=0x453eca816e10 sp=0x453eca816dd0 pc=0x1004d6e08internal/runtime/maps.fatal({0x1007fc400?, 0x60?})    /path/to/goroot/go/src/runtime/panic.go:1181 +0x20 fp=0x453eca816e30 sp=0x453eca816e10 pc=0x10050cba0runtime.mapaccess1_faststr(0x100c25400?, 0x100b8a7a0?, {0x1007ef081?, 0x1007617e8?})    /path/to/goroot/go/src/internal/runtime/maps/runtime_faststr.go:113 +0x104 fp=0x453eca816ec0 sp=0x453eca816e30 pc=0x10049bd24gorm.io/gorm.(*Statement).AddClause(0x453eca961860, {0x100bcca70, 0x453eca859da0})    /path/to/workspace/go/pkg/mod/gorm.io/gorm@v1.31.1/statement.go:277 +0xa0 fp=0x453eca816f10 sp=0x453eca816ec0 pc=0x10076fc30gorm.io/gorm.(*DB).Where(0x0?, {0x100b32640, 0x100bc7748}, {0x453eca956ee0, 0x1, 0x1})    /path/to/workspace/go/pkg/mod/gorm.io/gorm@v1.31.1/chainable_api.go:210 +0x74 fp=0x453eca816f60 sp=0x453eca816f10 pc=0x100761804main.Case3.func1()    /path/to/workspace/go/src/testj/main.go:79 +0x88 fp=0x453eca816fd0 sp=0x453eca816f60 pc=0x1007a7df8runtime.goexit({})    /path/to/goroot/go/src/runtime/asm_arm64.s:1447 +0x4 fp=0x453eca816fd0 sp=0x453eca816fd0 pc=0x100513994created by main.Case3 in goroutine 1    /path/to/workspace/go/src/testj/main.go:77 +0x84

四个 case 根因一样:多个 goroutine 操作了同一个 Statement 实例。


二、先搞清楚 GORM 的三类方法

理解并发模型之前,得先知道 GORM 的方法分三种:

类别
方法举例
作用
修改Statement?
Chain Method
Where
SelectLimitOrderGroupJoinsNotOr
构建查询条件
Finisher Method
Create
FirstFindSaveUpdateDeleteCount
执行 SQL
New Session Method
Session
WithContextDebug
创建新会话
不会

Chain/Finisher 方法调用后,返回值的 clone 字段会变成 0。New Session 方法创建全新实例,clone 重置为 1 或 2。这个区别是后面所有讨论的基础。


三、核心:clone 字段和 getInstance()

3.1 clone 的三个值

*gorm.DB 里有个没导出的 clone 字段(int),整个并发安全都靠它:

type DB struct {    *Config    Error        error    RowsAffected int64    Statement    *Statement    clone        int  // 并发安全的开关}
  • • clone = 1:种子实例。getInstance() 创建全新空白 Statement。安全。
  • • clone = 2:会话/事务分支。getInstance() 深拷贝 Statement。安全。
  • • clone = 0:已初始化实例。getInstance() 直接返回自身。不安全。

3.2 getInstance() 源码

每个 Chain Method 和 Finisher Method 内部都会先调它:

func (db *DB) getInstance() *DB {    if db.clone > 0 {        tx := &DB{Config: db.Config, Error: db.Error} // clone > 0 之后会先默认设置新的 tx clone=0        if db.clone == 1 {            // clone=1: 全新空白 Statement            tx.Statement = &Statement{                DB:       tx,                ConnPool: db.Statement.ConnPool,                Context:  db.Statement.Context,                Clauses:  map[string]clause.Clause{},                Vars:     make([]interface{}, 0, 8),            }        } else {            // clone=2: 深拷贝 Statement,继承已有条件            tx.Statement = db.Statement.clone()            tx.Statement.DB = tx        }        return tx    }    // clone=0: 直接返回自身    return db}

简化成 switch 就一目了然:

func (db *DB) getInstance() *DB {    switch db.clone {    case 0: return db                  // 复用,不安全    case 1: return newStatement()      // 全新空白,安全    case 2: return db.cloneStatement() // 深拷贝,安全    }}

3.3 clone 状态怎么流转

  • • gorm.Open() → clone = 1(种子)
func Open(dialector Dialector, opts ...Option) (db *DB, err error) {    // 前面代码省略....    db = &DB{Config: config, clone: 1}    // 后面代码省略....    return}
  • • Session(&Session{NewDB: true}) → clone = 1(全新)
  • • Session(&Session{}) / WithContext() / Debug() → clone = 2(深拷贝)
func (db *DB) WithContext(ctx context.Context) *DB {    return db.Session(&Session{Context: ctx})}// Session create new db sessionfunc (db *DB) Session(config *Session) *DB {    var (        txConfig = *db.Config        tx       = &DB{            Config:    &txConfig,            Statement: db.Statement,            Error:     db.Error,            clone:     1, // 这里设置为 1        }    )    //.......
  • • 任何 Chain/Finisher 方法调用后 → clone = 0(不可安全复用)
  • • Begin() / Transaction() → clone = 2(事务)

一句话:任何 Chain/Finisher 方法调用后,返回值的 clone 都是 0。


四、隔离过程(时序图)

4.1 安全场景:从全局 DB 并发查询

所有 goroutine 都从 gorm.Open() 的种子实例出发,各自拿到独立副本:

tx3 (clone=0)tx2 (clone=0)tx1 (clone=0)Goroutine 3Goroutine 2Goroutine 1全局DB (clone=1)tx3 (clone=0)tx2 (clone=0)tx1 (clone=0)Goroutine 3Goroutine 2Goroutine 1全局DB (clone=1)getInstance() clone=1 → 新建StatementStatement.Clauses = {WHERE: age > 18}SQL: SELECT * FROM users WHERE age > 18getInstance() clone=1 → 新建StatementStatement.Clauses = {WHERE: status = 1}getInstance() clone=1 → 新建StatementStatement.Clauses = {WHERE: name = 'jinzhu'}全局DB始终保持 clone=1db.Where("age > 18")返回新DB实例(clone=0).First(&user)db.Where("status = 1")返回新DB实例(clone=0).Find(&users)db.Where("name = 'jinzhu'")返回新DB实例(clone=0).First(&user)

每个 goroutine 拿到全新空白 Statement,互不干扰。

4.2 不安全场景:共享链式调用结果(clone=0)

共享StatementGoroutine 2Goroutine 1tx = db.Where(...) (clone=0)全局DB (clone=1)共享StatementGoroutine 2Goroutine 1tx = db.Where(...) (clone=0)全局DB (clone=1)clone=1 → 新DB,返回后 clone=0clone=0 → 直接返回自身clone=0 → 直接返回自身map并发读写 → 条件污染 / panicdb.Where("name = ?", "jinzhu")tx.Where("id = 1").Find(&user)修改共享Statement,加 id=1tx.Where("id = 2").Find(&user)修改共享Statement,加 id=2

4.3 事务场景:clone=2 的深拷贝

tx2 (clone=0)tx1 (clone=0)事务操作2事务操作1事务实例 (clone=2)全局DB (clone=1)tx2 (clone=0)tx1 (clone=0)事务操作2事务操作1事务实例 (clone=2)全局DB (clone=1)clone=2, 深拷贝Statementclone=2 → 深拷贝clone=2 → 深拷贝Statement独立,ConnPool共享 → 事务原子性db.Begin()tx.Where("id = ?", 1).Update(...)新实例(clone=0)执行UPDATEtx.Where("id = ?", 2).Delete(...)新实例(clone=0)执行DELETE


五、正确和错误的用法

5.1 安全用法

直接从全局 DB 出发,最省事也最安全:

// 依赖前面「环境准备」中的 db 和 Studentfor i := 0; i < 100; i++ {    i := i    gofunc() {        var s Student        db.Where("id = ?", i).First(&s) // ✅ 每次从 clone=1 种子派生    }()}

用 WithContext 创建新会话,适合需要超时控制的场景:

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)defer cancel()ctxDB := db.WithContext(ctx)for i := 0; i < 100; i++ {    i := i    gofunc() {        var s Student        ctxDB.Where("id = ?", i).First(&s) // ✅ clone 重置为 2    }()}

用 Session 继承基础条件后并发查询:

tx := db.Where("name = ?", "jinzhu").Session(&gorm.Session{})for i := 0; i < 100; i++ {    i := i    gofunc() {        var s Student        tx.Where("id = ?", i).First(&s) // ✅ 每次都带 name='jinzhu'    }()}

WithContext 同样可以继承条件:

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)defer cancel()ctxDB := db.Where("name = ?", "jinzhu").WithContext(ctx)for i := 0; i < 100; i++ {    i := i    gofunc() {        var s Student        ctxDB.Where("id = ?", i).First(&s) // ✅ 继承条件 + 超时 context    }()}

5.2 不安全用法

复用链式调用结果——最常见的坑:

tx := db.Where("name = ?", "jinzhu")for i := 0; i < 100; i++ {    i := i    gofunc() {        var s Student        tx.Where("id = ?", i).First(&s) // ❌ tx.clone=0,共享 Statement    }()}

忽略链式调用返回值——新手容易犯:

// ❌ 返回值被丢弃,条件白加了db.Where("name = ?", "jinzhu")var users []Studentdb.Find(&users) // 查出来的是全表,没带 WHERE 条件// ✅ 正确写法tx := db.Where("name = ?", "jinzhu")var users []Studenttx.Find(&users)

覆盖全局 DB 变量——后果最严重:

// ❌ 全局 DB 被污染,后续所有操作都带上了 WHEREdb = db.Where("name = ?", "jinzhu")// ✅ 用新变量tx := db.Where("name = ?", "jinzhu")

六、封装两个工具函数

日常开发可以封两个函数,放在 pkg/dbutil 之类的地方:

package dbutilimport (    "context"    "gorm.io/gorm")// CloneDB 继承已有条件,创建可安全并发使用的新实例// 等价于 db.WithContext(context.Background())func CloneDB(db *gorm.DB) *gorm.DB {    return db.WithContext(context.Background())}// NewDB 创建全新空白 DB,不继承任何条件// 等价于 db.Session(&gorm.Session{NewDB: true})func NewDB(db *gorm.DB) *gorm.DB {    return db.Session(&gorm.Session{NewDB: true, Context: db.Statement.Context})}

用法:

// 继承基础条件 + 并发查询baseQuery := db.Where("status = ?", "active")for i := 0; i < 100; i++ {    i := i    gofunc() {        tx := CloneDB(baseQuery) // clone=2,继承 status=active        var s Student        tx.Where("id = ?", i).First(&s)    }()}// 完全干净的并发查询for i := 0; i < 100; i++ {    i := i    gofunc() {        tx := NewDB(db) // clone=1,空白 Statement        var s Student        tx.Where("id = ?", i).First(&s)    }()}

七、事务中的并发安全

db.Begin() 和 db.Transaction() 内部通过 Session 创建实例,clone 设为 2:

// Begin 内部逻辑(以下为逻辑等价的简化版本,非真实源码,真实源码还包含驱动适配和错误处理)func (db *DB) Begin(opts ...*sql.TxOptions) *DB {    tx := db.Session(&gorm.Session{NewDB: true, Context: context.Background()})    tx.Statement.ConnPool = &sql.Tx{}    tx.clone = 2    return tx}

事务内并发使用是安全的:

// 依赖前面「环境准备」中的 db 和 Usererr := db.Transaction(func(tx *gorm.DB) error {    eg := errgroup.Group{}    eg.Go(func() error {        return tx.Where("id = ?", 1).Update("name", "updated_1").Error    })    eg.Go(func() error {        return tx.Where("id = ?", 2).Delete(&User{}).Error    })    return eg.Wait()})if err != nil {    panic(err)}

每次操作深拷贝 Statement,条件互不干扰;共享 ConnPool 保证事务原子性。


八、连接池层面也是安全的

Statement 隔离之外,底层连接池也天然并发安全。gorm.Open() 创建的 DB 维护了一个 database/sql 连接池,它本身就是并发安全的。Chain Method 不获取连接,只有 Finisher Method 才会从池里拿连接。

两层安全机制各管一段:Statement 层靠 clone 隔离查询条件,连接池层靠 database/sql 避免连接竞争。


九、为什么不直接用锁?

看完这套机制,一个自然的问题是:加个 sync.Mutex 不就行了?

GORM 选择写时复制而非加锁,我觉得两个原因。

避免锁竞争。 高并发下如果每次 WhereFind 都要抢锁,性能会急剧下降。写时复制让每个 goroutine 操作自己的副本,完全不需要互斥等待。我在本地跑过一个简单 benchmark:100 个 goroutine 各执行 1000 次 db.Where().Find(),复制开销占比不到 2%。具体比例取决于查询复杂度,但复制的代价远小于锁竞争,这个结论是稳的。

语义更清晰。 锁解决的是"互斥访问",但 GORM 要解决的是"隔离性"——不同 goroutine 构建的查询条件不应该互相看到。本质上就是 MVCC 的思路:每个操作拿到数据的快照,不是共享引用。

另外,GORM v1.30.0+ 的泛型 API 也从设计上减少了并发误用的可能。泛型版本移除了 FirstOrCreate(并发下容易重复创建)和 Save(会更新所有字段,并发时互相覆盖),用类型安全的接口收敛了危险操作:

// 泛型 API,类型更安全,接口更收敛gorm.G[User](db).Where("name = ?", "jinzhu").First(ctx)gorm.G[User](db).Where("age <= ?", 18).Find(ctx)gorm.G[User](db).Where("id = ?", u.ID).Update(ctx, "age", 18)

与其等用户踩坑再加锁,不如从 API 设计上就不给犯错的机会。这个思路我挺认可的。


十、总结

三层防护,各管各的:

层级
机制
解决的问题
Statement 层
clone 字段控制写时复制
查询条件不互相污染
连接池层
database/sql
 并发安全连接池
连接获取不竞争
API 层
泛型版本收敛危险接口
从源头减少误用

记住 clone 的三个值就行:

  • • clone = 1:种子实例,每次派生独立副本。✅ 安全。
  • • clone = 2:深拷贝继承,修改不影响原实例。✅ 安全。
  • • clone = 0:直接复用,共享 Statement。❌ 不安全。

实践中注意这几点:

  1. 1. 全局 *gorm.DBgorm.Open 创建)可以直接并发用
  2. 2. 链式调用后的实例不要并发复用
  3. 3. 需要带基础条件并发查询时,用 Session(&gorm.Session{}) 或 WithContext() 重置 clone
  4. 4. 事务实例内部可以并发用
  5. 5. 泛型 API gorm.G[T](db) 能减少误用风险,优先用它

GORM 没有在文档里承诺并发安全,它给的是一套范式:按范式用就安全,不按范式用就出事。理解 clone 的三个值和 getInstance() 的行为,比记住所有安全/不安全用法更有用——因为你知道为什么了。


参考资料

  • • GORM 官方文档 - 方法链[1]
  • • GORM 泛型方式[2]
  • • 知乎 - gorm不并发安全[3]
  • • 五岁博客 - Go源码之gorm并发安全机制clone[4]
  • • SegmentFault - gorm是如何保证协程安全的[5]
  • • 知乎 - Gorm中的Db对象为什么是线程安全的[6]
  • • 百度云 - GORM:并发安全的探索与实践[7]

引用链接

[1] GORM 官方文档 - 方法链: https://gorm.io/zh_CN/docs/method_chaining.html[2] GORM 泛型方式: https://gorm.io/zh_CN/docs/the_generals_way.html[3] 知乎 - gorm不并发安全: https://zhuanlan.zhihu.com/p/556065676[4] 五岁博客 - Go源码之gorm并发安全机制clone: https://fiveyoboy.com/articles/go-source-code-gorm-clone/[5] SegmentFault - gorm是如何保证协程安全的: https://segmentfault.com/a/1190000041645556[6] 知乎 - Gorm中的Db对象为什么是线程安全的: https://zhuanlan.zhihu.com/p/672830593[7] 百度云 - GORM:并发安全的探索与实践: https://cloud.baidu.com/article/3189893

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-20 12:07:41 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/774380.html
  2. 运行时间 : 0.185784s [ 吞吐率:5.38req/s ] 内存消耗:4,773.57kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=b114293784bc628eb7b79b1115447215
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001290s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001795s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000905s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000653s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001311s ]
  6. SELECT * FROM `set` [ RunTime:0.000614s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001662s ]
  8. SELECT * FROM `article` WHERE `id` = 774380 LIMIT 1 [ RunTime:0.001509s ]
  9. UPDATE `article` SET `lasttime` = 1781928461 WHERE `id` = 774380 [ RunTime:0.004215s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000619s ]
  11. SELECT * FROM `article` WHERE `id` < 774380 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001089s ]
  12. SELECT * FROM `article` WHERE `id` > 774380 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001063s ]
  13. SELECT * FROM `article` WHERE `id` < 774380 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001731s ]
  14. SELECT * FROM `article` WHERE `id` < 774380 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002015s ]
  15. SELECT * FROM `article` WHERE `id` < 774380 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.009510s ]
0.188635s