查询性能

说到 Drizzle —— 我们是在 SQL 之上的一层很薄的 TypeScript 封装,几乎没有任何开销;而要把它真正做到 0 开销,你可以使用我们的预编译语句 API。

当你在数据库上执行查询时,会发生以下几件事:

使用预编译语句时,你只需在 Drizzle ORM 这一侧进行一次 SQL 拼接,然后数据库驱动就能够复用预先编译好的二进制 SQL,而不是每次都解析查询。
这对大型 SQL 查询有极其显著的性能提升。

不同的数据库驱动以不同方式支持预编译语句,有时 Drizzle ORM 甚至可以比 better-sqlite3 驱动更快。

预备语句

    const db = drizzle(...);

    const prepared = db.select().from(customers).prepare();
    
    const res1 = prepared.all();
    const res2 = prepared.all();
    const res3 = prepared.all();

占位符

当你需要嵌入一个动态的运行时值时,可以使用 sql.placeholder(...) API

    import { sql } from "drizzle-orm";

    const p1 = db
      .select()
      .from(customers)
      .where(eq(customers.id, sql.placeholder('id')))
      .prepare()

    p1.get({ id: 10 }) // 从 customers 中选择 * WHERE id = 10
    p1.get({ id: 12 }) // 从 customers 中选择 * WHERE id = 12

    const p2 = db
      .select()
      .from(customers)
      .where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`)
      .prepare();

    p2.all({ name: '%an%' }) // 从 customers 中选择 * WHERE lower(name) like '%an%'