查询性能
当谈到 Drizzle 时——我们是在 SQL 之上的一层很薄的 TypeScript 层,几乎没有任何开销;如果想让它真正做到 0 开销,你可以使用我们的预编译语句 API。
当你在数据库上运行查询时,会发生几件事:
- 查询构建器的所有配置都会被拼接到 SQL 字符串中
- 该字符串和参数会被发送到数据库驱动
- 驱动将 SQL 查询编译为二进制 SQL 可执行格式,并将其发送到数据库
使用预编译语句时,你只需在 Drizzle ORM 这一侧进行一次 SQL 拼接,然后数据库驱动就能够重用预编译的二进制 SQL,而不是每次都解析查询。
这对大型 SQL 查询有极其显著的性能优势。
不同的数据库驱动以不同方式支持预编译语句,有时 Drizzle ORM 甚至可以 比 better-sqlite3 驱动更快。
预处理语句
const db = drizzle(...);
const prepared = db.select().from(customers).prepare();
const res1 = await prepared.execute();
const res2 = await prepared.execute();
const res3 = await prepared.execute();占位符
当你需要嵌入一个动态运行时值时,可以使用 sql.placeholder(...) API
import { sql } from "drizzle-orm";
const p1 = db
.select()
.from(customers)
.where(eq(customers.id, sql.placeholder('id')))
.prepare()
await p1.execute({ id: 10 }) // SELECT * FROM customers WHERE id = 10
await p1.execute({ id: 12 }) // SELECT * FROM customers WHERE id = 12
const p2 = db
.select()
.from(customers)
.where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`)
.prepare();
await p2.execute({ name: '%an%' }) // SELECT * FROM customers WHERE lower(name) like '%an%'