SQLのCREATE INDEXをPrismaの@@indexに変換する

SQL単一カラム、複合、部分インデックスがPrismaの@@index属性にどのように変換されるかを学びます。B-tree、ユニークインデックス、インデックスの命名を解説します。

Advanced Features

詳細な説明

SQLインデックスからPrismaの@@indexへ

インデックスはクエリパフォーマンスにとって重要です。Prismaは@@index model属性を使用してインデックスを宣言し、コンバーターはSQLのCREATE INDEX文を適切なPrisma構文にマッピングします。

SQLの例

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INTEGER NOT NULL,
  status VARCHAR(20) NOT NULL,
  total DECIMAL(10, 2) NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE INDEX idx_orders_user_id ON orders (user_id);
CREATE INDEX idx_orders_status ON orders (status);
CREATE INDEX idx_orders_user_status ON orders (user_id, status);
CREATE INDEX idx_orders_created_at ON orders (created_at DESC);

生成されるPrismaスキーマ

model Order {
  id        Int      @id @default(autoincrement())
  userId    Int      @map("user_id")
  status    String   @db.VarChar(20)
  total     Decimal  @db.Decimal(10, 2)
  createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz()
  user      User     @relation(fields: [userId], references: [id])

  @@index([userId], map: "idx_orders_user_id")
  @@index([status], map: "idx_orders_status")
  @@index([userId, status], map: "idx_orders_user_status")
  @@index([createdAt(sort: Desc)], map: "idx_orders_created_at")
  @@map("orders")
}

インデックスの種類

SQLインデックスタイプ Prisma構文
単一カラム @@index([fieldName])
複合 @@index([field1, field2])
降順 @@index([field(sort: Desc)])
ユニークインデックス @@unique([...])
全文検索(MySQL) @@fulltext([field1, field2])

ソート順

SQLではカラムごとにソート方向を指定できます:

CREATE INDEX idx_orders_date_desc ON orders (created_at DESC);

Prismaではインデックス定義でsort: Descを使用します。これは最新のものから順にソートするクエリで特に重要です。

複合インデックスのカラム順序

複合インデックスのカラム順序はクエリ最適化に影響します。コンバーターはSQLのカラム順序を保持します:

// 良い:userIdでのフィルタリング、またはuserId + statusでのフィルタリングをサポート
@@index([userId, status])

// 異なる:statusでのフィルタリング、またはstatus + userIdでのフィルタリングをサポート
@@index([status, userId])

インデックスの命名

コンバーターはmapパラメータでSQLインデックス名を保持します:

@@index([userId], map: "idx_orders_user_id")

名前が指定されていない場合、Prismaが自動的に生成します。元の名前を保持することで、Prismaスキーマの変更と既存のデータベースインデックスを関連付けやすくなります。

インデックスを追加するタイミング

コンバーターは以下のインデックスを生成します:

  1. 外部キーカラム — JOINパフォーマンスに不可欠
  2. WHERE句のカラム — 一般的なクエリパターンに基づく
  3. ORDER BYのカラム — ソートされたクエリ用
  4. GROUP BYのカラム — 集計クエリ用

全文検索(MySQL)

CREATE FULLTEXT INDEX idx_posts_search ON posts (title, content);
@@fulltext([title, content], map: "idx_posts_search")

注意:@@fulltextはPrismaではMySQLでのみ利用可能です。

ユースケース

本番データベースに単一カラム、複合、降順インデックスなどの慎重に調整されたインデックスがある場合に、コンバーターがすべてのインデックス定義と名前を保持し、Prismaスキーマが既存のデータベースのパフォーマンス特性に一致するようにします。

試してみる — SQL to Prisma Schema

フルツールを開く