sanyuwan

sanyuwan

使用Prisma提高索引的查詢性能(轉載)

引言#

什麼是資料庫索引#

資料庫索引是資料庫伺服器用來儲存表格資料子集的較小的輔助資料結構。索引通常用於提高給定表格的讀取效能。

索引包含鍵 - 值對:

  • key: 用於建立索引的欄位
  • value: 以及指向特定表格中的記錄的指標

可以對一個表格中的多個欄位建立索引。例如,如果有一個名為 User 的表格,其中有 3 個欄位: id、firstName 和 lastName,則可以在 firstName 和 lastName 欄位上建立一個索引。

資料庫索引的類型#

  • Index (預設值) : 一個正常的、非唯一的索引,它不對資料強制任何約束
  • Primay Key:主鍵, 用於唯一標識表格中的行
  • Unique indexes: 唯一索引,用於強制欄位中值的唯一性,防止重複值
  • **Full-text indexes:** 用於文字欄位並支援全文搜尋

僅索引掃描直接查找索引中的記錄#

資料庫還可以選擇從索引返回匹配的記錄,甚至不需要「查詢」原始表格。這被稱為僅索引掃描。

SELECT firstName from 'User' where firstName = 'Jimmy';

使用索引快速讀取的代價#

普遍認為,索引對於提高讀取效能非常有效,但是索引是有代價的。

寫操作將產生額外的開銷。這是因為每次寫操作都需要更新索引。

索引的另一個成本是,它們需要從資料庫伺服器獲取額外的資源進行維護。索引需要來自資料庫伺服器的額外儲存、記憶體和 IO。


B-Tree 索引提高查詢效能#

B 樹的時間複雜度#

順序掃描具有線性時間複雜度 (O (n))。這意味著檢索一條記錄所花費的時間與您擁有的記錄數量呈線性關係。

另一方面,B 樹具有對數時間複雜度 (O log (n))。這意味著,隨著資料規模的增長,檢索記錄的成本增長速度明顯較慢。

添加索引 全量查詢#

第一次查詢 無索引(216ms)

model User {
  id        Int    @id @default(autoincrement())
  firstName String
  lastName  String
  email     String
}

第二次查詢 添加 firstName(59ms)

model User {
  id        Int    @id @default(autoincrement())
  firstName String
  lastName  String
  email     String

  @@index(fields: [firstName])
}

第三次查詢 添加聯合索引(17ms)

model User {
  id        Int    @id @default(autoincrement())
  firstName String
  lastName  String
  email     String

  @@index(fields: [firstName, lastName])
}

第四次查詢 添加索引並排序 (11ms)

model User {
  id        Int    @id @default(autoincrement())
  firstName String
  lastName  String
  email     String

  @@index(fields: [firstName("desc"), lastName])
}

Hash 索引提高查詢效能 (postgreSQL)#

使用 hash 索引#

model User {
  id        Int    @id @default(autoincrement())
  firstName String
  lastName  String
  email     String

  @@index(fields: [firstName], type: Hash)
}
npx prisma migrate dev --name add-firstName-index

原文連結#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。