Prisma @@indexからSQL CREATE INDEXへの変換

Prisma @@indexモデル属性をSQL CREATE INDEX文に変換します。クエリパフォーマンス最適化のためにインデックスを追加するタイミングと理由を学びます。

Advanced

詳細な説明

インデックスの変換

Prismaの@@index属性はSQLのCREATE INDEX文を生成します。インデックスはクエリパフォーマンスにとって重要で、特にWHERE句、JOIN条件、ORDER BY句で使用されるカラムに有効です。

Prismaスキーマの例

model Order {
  id         Int      @id @default(autoincrement())
  customerId Int      @map("customer_id")
  status     String
  total      Decimal
  createdAt  DateTime @default(now()) @map("created_at")

  @@index([customerId])
  @@index([status])
  @@index([createdAt])
  @@map("orders")
}

生成されるSQL

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  status VARCHAR(255) NOT NULL,
  total DECIMAL(10,2) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_orders_customer_id ON orders (customer_id);
CREATE INDEX idx_orders_status ON orders (status);
CREATE INDEX idx_orders_created_at ON orders (created_at);

インデックスの命名規則

変換ツールはidx_{table}_{columns}形式でインデックス名を生成し、一般的なSQLの命名規則です。例えば、ordersテーブルのcustomer_idカラムのインデックスはidx_orders_customer_idになります。

複合インデックス

複数フィールドをリストして複数カラムのインデックスを作成できます:

model SearchLog {
  id        Int      @id @default(autoincrement())
  userId    Int      @map("user_id")
  query     String
  createdAt DateTime @default(now()) @map("created_at")

  @@index([userId, createdAt])
  @@map("search_logs")
}

これにより生成されます:CREATE INDEX idx_search_logs_user_id_created_at ON search_logs (user_id, created_at);

複合インデックスは複数カラムで頻繁にクエリする場合(「ユーザーXの過去7日間のすべての検索」など)に有用です。

インデックスとUNIQUE制約

  • @@indexは非ユニークインデックスを作成 — 重複値が許可されます。
  • @@uniqueはユニークインデックスを作成 — 重複する組み合わせが拒否されます。
  • 単一フィールドの@uniqueは単一カラムのユニークインデックスを作成します。

3つすべてがクエリパフォーマンスを向上させますが、UNIQUE制約はデータ整合性も強制します。

ユースケース

顧客、ステータス、日付範囲による注文検索が最も一般的なクエリである高トラフィックのECアプリケーションを最適化しており、高速なクエリパフォーマンスのための正しいインデックスがSQLスキーマに含まれるようにする必要があります。

試してみる — Prisma to SQL Schema

フルツールを開く