Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Indizes verwenden
Indizes sind Datenstrukturen, die der Datenbank ermöglichen, Zeilen zu finden, ohne die gesamte Tabelle scannen zu müssen. Ohne Index muss eine Abfrage jede Zeile untersuchen, um Übereinstimmungen zu finden. Mit einem Index kann die Datenbank direkt zu den relevanten Zeilen springen – was die Anzahl der untersuchten Zeilen drastisch reduziert.
Indizes beschleunigen Leseoperationen, fügen Schreibvorgängen (Einfügen, Aktualisieren, Löschen) jedoch Overhead hinzu, da der Index synchron gehalten werden muss. Daher solltest du sie sorgfältig und nur bei Bedarf erstellen.
Gute Kandidaten für Indizes sind Spalten, die häufig in WHERE-Klauseln, Joins und Sortierungen verwendet werden. Wenn mehrere Spalten als Filter verwendet werden, kann ein zusammengesetzter Index sinnvoll sein. Beachte jedoch, dass die Spaltenreihenfolge entscheidend ist – platziere die selektivsten Spalten (mit den meisten eindeutigen Werten) an erster Stelle.
Abfrageleistung analysieren
Die meisten Datenbanken ermöglichen dir zu prüfen, wie eine Abfrage ausgeführt wird – dies nennt man Ausführungsplan. Das Verständnis dieses Plans hilft dir, fehlende Indizes zu identifizieren und die Abfragekonstruktion zu optimieren, indem du verschiedene Methoden zum Abruf derselben Daten vergleichst.
CockroachDB
Use EXPLAIN ANALYZE (same syntax as PostgreSQL):
EXPLAIN ANALYZE SELECT * FROM "user" WHERE "firstName" = 'Timber';
Look for full scan (no index) vs scan with a specific index name.
Google Spanner
Use the Query Plan visualizer in the Google Cloud Console, or run a query in PLAN/PROFILE mode via the gcloud CLI:
gcloud spanner databases execute-sql DATABASE_ID \
--instance=INSTANCE_ID \
--query-mode=PROFILE \
--sql="SELECT * FROM user WHERE firstName = 'Timber'"
Look for Table Scan (no index) vs Index Scan in the returned plan.
MariaDB
Use EXPLAIN or ANALYZE to inspect the query execution plan:
ANALYZE SELECT * FROM user WHERE firstName = 'Timber';
Check the type column — ALL means a full table scan, while ref, range, or index indicate index usage. The key column shows which index was chosen.
MongoDB
Use the explain() method on a query to see the execution plan:
db.user.find({ firstName: "Timber" }).explain("executionStats")
Look for COLLSCAN (collection scan — no index) vs IXSCAN (index scan).
MS SQL Server
Use the execution plan to analyze queries. In SQL Server Management Studio, press Ctrl+M to include the actual execution plan, then run your query. Programmatically:
SET STATISTICS IO ON;
SELECT * FROM [user] WHERE firstName = 'Timber';
SET STATISTICS IO OFF;
Look for Table Scan (no index) vs Index Seek or Index Scan in the execution plan.
MySQL
Use EXPLAIN to inspect the query execution plan:
EXPLAIN SELECT * FROM user WHERE firstName = 'Timber';
Check the type column — ALL means a full table scan, while ref, range, or index indicate index usage. The key column shows which index was chosen.
This also applies to Amazon Aurora MySQL, which uses the same query engine and EXPLAIN syntax. See Aurora MySQL tuning for Aurora-specific guidance.
Oracle
Use EXPLAIN PLAN to inspect the execution plan:
EXPLAIN PLAN FOR SELECT * FROM "user" WHERE "firstName" = 'Timber';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
Look for TABLE ACCESS FULL (no index) vs INDEX RANGE SCAN or INDEX UNIQUE SCAN.
PostgreSQL
Use EXPLAIN ANALYZE to see how PostgreSQL executes a query and whether it uses indexes:
EXPLAIN ANALYZE SELECT * FROM "user" WHERE "firstName" = 'Timber';
Look for Seq Scan (full table scan — no index used) vs Index Scan or Index Only Scan (index used).
This also applies to Amazon Aurora PostgreSQL, which uses the same query engine and EXPLAIN syntax. Aurora also offers query plan management for capturing and controlling execution plans.
SAP HANA
Use EXPLAIN PLAN FOR to inspect the execution plan:
EXPLAIN PLAN FOR SELECT * FROM "user" WHERE "firstName" = 'Timber';
SELECT * FROM EXPLAIN_PLAN_TABLE;
Look for TABLE SCAN (no index) vs INDEX SCAN or INDEX SEEK in the operator column.
SQLite
Use EXPLAIN QUERY PLAN to see how SQLite resolves a query:
EXPLAIN QUERY PLAN SELECT * FROM user WHERE firstName = 'Timber';
Look for SCAN (no index) vs SEARCH (index used) in the output.
Indizes in TypeORM definieren
TypeORM unterstützt das Erstellen von Indizes auf Tabellenspalten mithilfe des @Index-Decorators.
- Basic index
- Composite index
- Join column
import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
@Index()
email: string
@Column()
firstName: string
}
import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"
@Entity()
@Index(["lastName", "firstName"]) // most selective column first
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
}
import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
Index,
} from "typeorm"
import { User } from "./User"
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@ManyToOne(() => User)
@Index() // index foreign key columns to speed up joins
author: User
}
Einen umfassenden Überblick über verschiedene Indextypen (eindeutig, räumlich, Volltext, nebenläufig etc.) findest du im Leitfaden Indizes.
Richtige Indizierung ist oft die größte Einzelverbesserung der Leistung, die du vornehmen kannst – beginne mit der Analyse deiner langsamsten Abfragen mithilfe der oben genannten Ausführungsplan-Tools und füge dann Indizes dort hinzu, wo sie am meisten bewirken.