跳到主內容

評估

Prisma Accelerate 透過高階連線池和全球邊緣快取來最佳化資料庫互動。其連線池器在 16 個區域可用,並幫助應用程式根據需求進行負載均衡和擴充套件資料庫請求。

考慮到以上資訊,我們建議在高負載下評估 Accelerate 的效能表現。

Accelerate 的連線池如何在負載下最佳化效能

Prisma Accelerate 採用動態、無伺服器的連線池基礎設施。當發出請求時,會在配置 Prisma Accelerate 時分配的區域中,為專案快速配置一個連線池。此連線池保持活躍,在重用已建立的資料庫連線的同時,服務許多額外的請求。連線池會在一段時間不活動後斷開連線,因此使用持續的流量流來評估 Prisma Accelerate 非常重要。

主要優勢

  • 最佳化的查詢效能:無伺服器連線池器會適應查詢負載,確保在高峰需求期間高效管理資料庫連線。

    Prisma Accelerate 的連線池器無法提升資料庫中查詢的效能。在查詢效能存在問題的場景下,我們建議最佳化 Prisma 查詢、應用索引或利用 Accelerate 的邊緣快取。

  • 最大化連線複用:執行持續大量的查詢有助於保持 Accelerate 連線池器的活躍例項。這會增加連線複用,確保後續查詢的更快響應時間。

透過理解和利用此機制,您可以確保您的資料庫查詢在大規模下保持一致且高效的效能。

評估 Prisma Accelerate 連線池效能

您將在下方找到一個如何使用示例模型評估 Prisma Accelerate 的示例

model Notes {
id Int @id @default(autoincrement())
title String
createdAt DateTime @default(now())
updatedAt DateTime? @updatedAt
}
import { PrismaClient } from '@prisma/client'
import { withAccelerate } from '@prisma/extension-accelerate'

const prisma = new PrismaClient().$extends(withAccelerate())

function calculateStatistics(numbers: number[]): {
average: number
p50: number
p75: number
p99: number
} {
if (numbers.length === 0) {
throw new Error('The input array is empty.')
}

// Sort the array in ascending order
numbers.sort((a, b) => a - b)

const sum = numbers.reduce((acc, num) => acc + num, 0)
const count = numbers.length

const average = sum / count
const p50 = getPercentile(numbers, 50)
const p75 = getPercentile(numbers, 75)
const p99 = getPercentile(numbers, 99)

return { average, p50, p75, p99 }
}

function getPercentile(numbers: number[], percentile: number): number {
if (percentile <= 0 || percentile >= 100) {
throw new Error('Percentile must be between 0 and 100.')
}

const index = (percentile / 100) * (numbers.length - 1)
if (Number.isInteger(index)) {
// If the index is an integer, return the corresponding value
return numbers[index]
} else {
// If the index is not an integer, interpolate between two adjacent values
const lowerIndex = Math.floor(index)
const upperIndex = Math.ceil(index)
const lowerValue = numbers[lowerIndex]
const upperValue = numbers[upperIndex]
const interpolationFactor = index - lowerIndex
return lowerValue + (upperValue - lowerValue) * interpolationFactor
}
}

async function main() {
const timings = []

// fire a query before going to the loop
await prisma.notes.findMany({
take: 20,
})

// we recommend evaluationg Prisma Accelerate with a large loop
const LOOP_LENGTH = 10000

for (let i = 0; i < LOOP_LENGTH; i++) {
const start = Date.now()
await prisma.notes.findMany({
take: 20,
})

timings.push(Date.now() - start)
}

const statistics = calculateStatistics(timings)
console.log('Average:', statistics.average)
console.log('P50:', statistics.p50)
console.log('P75:', statistics.p75)
console.log('P99:', statistics.p99)
}

main()
.then(async () => {
await prisma.$disconnect()
})
.catch((e) => {
await prisma.$disconnect()
process.exit(1)
})

評估 Prisma Accelerate 快取效能

Prisma Accelerate 的邊緣快取也針對高查詢量進行了最佳化。快取會自動最佳化重複查詢。因此,快取命中率會隨著查詢頻率的增加而提高。將查詢結果新增到快取也是非阻塞的,因此短時間的查詢突增可能無法充分利用快取,而需要持續負載才能發揮作用。

要評估 Accelerate 的邊緣快取,您可以修改上述指令碼,如下所示

import { PrismaClient } from '@prisma/client'
import { withAccelerate } from '@prisma/extension-accelerate'

const prisma = new PrismaClient().$extends(withAccelerate())

function calculateStatistics(numbers: number[]): {
average: number
p50: number
p75: number
p99: number
} {
if (numbers.length === 0) {
throw new Error('The input array is empty.')
}

// Sort the array in ascending order
numbers.sort((a, b) => a - b)

const sum = numbers.reduce((acc, num) => acc + num, 0)
const count = numbers.length

const average = sum / count
const p50 = getPercentile(numbers, 50)
const p75 = getPercentile(numbers, 75)
const p99 = getPercentile(numbers, 99)

return { average, p50, p75, p99 }
}

function getPercentile(numbers: number[], percentile: number): number {
if (percentile <= 0 || percentile >= 100) {
throw new Error('Percentile must be between 0 and 100.')
}

const index = (percentile / 100) * (numbers.length - 1)
if (Number.isInteger(index)) {
// If the index is an integer, return the corresponding value
return numbers[index]
} else {
// If the index is not an integer, interpolate between two adjacent values
const lowerIndex = Math.floor(index)
const upperIndex = Math.ceil(index)
const lowerValue = numbers[lowerIndex]
const upperValue = numbers[upperIndex]
const interpolationFactor = index - lowerIndex
return lowerValue + (upperValue - lowerValue) * interpolationFactor
}
}

async function main() {
const timings = []

// fire a query before going to the loop
await prisma.notes.findMany({
take: 20,
cacheStrategy: {
ttl: 30,
},
})

// we recommend evaluating Prisma Accelerate with a large loop
const LOOP_LENGTH = 10000

for (let i = 0; i < LOOP_LENGTH; i++) {
const start = Date.now()
await prisma.notes.findMany({
take: 20,
cacheStrategy: {
ttl: 30,
},
})

timings.push(Date.now() - start)
}

const statistics = calculateStatistics(timings)
console.log('Average:', statistics.average)
console.log('P50:', statistics.p50)
console.log('P75:', statistics.p75)
console.log('P99:', statistics.p99)
}

main()
.then(async () => {
await prisma.$disconnect()
})
.catch((e) => {
await prisma.$disconnect()
process.exit(1)
})
© . This site is unofficial and not affiliated with Prisma Data, Inc.