Skip to content

Datenbankgrundlagen (Indizes / Transaktionen / Abfrageoptimierung)

🎯 Kernfrage

Warum braucht Ihre Excel-Abfrage 10 Sekunden, während die Shopping-Suche nur 0,01 Sekunden benötigt? Wenn Daten von „einigen Tausend" auf „eine Milliarde" anwachsen und von „Einzelplatznutzung" auf „Millionen gleichzeitiger Zugriffe", reicht Excel nicht mehr aus. Datenbanken wurden genau für dieses Problem entwickelt — sie sind das „Super-Excel" zur Verarbeitung riesiger Datenmengen und hoher Parallelität. Dieses Kapitel führt Sie von Null an in die Kernprinzipien von Datenbanken ein.


1. Warum „Datenbanken"?

1.1 Vom kleinen Buchladen zum Online-Marktplatz: Die Evolution der Datenmenge

Stellen Sie sich vor, Sie betreiben eine kleine Buchhandlung und verkaufen täglich ein paar Bücher. Sie notieren in einem Notizbuch:

2024-01-15: Max hat „Hundert Jahre Einsamkeit" gekauft, 59 Euro
2024-01-16: Anna hat „Das Leben" gekauft, 39 Euro

Das Notizbuch reicht völlig aus. Aber wenn Ihr Buchladen zu einem „Amazon" wird und täglich eine Million Bestellungen eingehen, entstehen Probleme:

  • Datenmenge: Nicht Dutzende, sondern Hunderte Millionen Zeilen
  • Parallele Zugriffe: Nicht eine Person fragt ab, sondern Millionen gleichzeitig
  • Datenverknüpfungen: Bestellungen sind mit Nutzern, Produkten, Lagerbestand und Logistik verknüpft — komplexe Beziehungen müssen effizient verwaltet werden
  • Datensicherheit: Ein Stromausfall darf nicht alle Bestellungen löschen

📓 Excel/Notizbuch

  • Geeignet für Einzelpersonen oder kleine Teams
  • Datenmenge: Tausend bis Zehntausend Zeilen
  • Einzelnutzer, sequenzieller Zugriff
  • Manuelle Suche, langsam

🗄️ Datenbank

  • Geeignet für Enterprise-Anwendungen
  • Datenmenge: Hunderte Millionen und mehr
  • Millionen gleichzeitige Online-Zugriffe
  • Abfragegeschwindigkeit im Millisekundenbereich

Das ist das Problem, das „Datenbanken" lösen: Wie speichert man riesige Datenmengen effizient, fragt sie schnell ab und verwaltet sie sicher?

1.2 Eine wahre Geschichte: Warum man Nutzerdaten nicht in Excel speichern sollte

Sie könnten sagen: „Mein Projekt hat nur ein paar Zehntausend Nutzer — da reicht Excel doch, oder?" Lassen Sie mich eine wahre Geschichte erzählen.

Kleins Gründungs-Fiasko

Klein gründete eine Social-App. Anfangs gab es nicht viele Nutzer, also speicherte er die Nutzerdaten (Name, Telefonnummer, Registrierungsdatum usw.) in Excel. Jeden Tag exportierte er die Daten, um das Nutzerwachstum auszuwerten — alles lief normal.

Als die Nutzerzahl 100.000 überschritt, begannen die Probleme:

  • Excel brauchte 5 Minuten zum Öffnen
  • Die Filterung nach „Nutzer aus Berlin" ließ das Programm einfrieren
  • Einmal wurde die Excel-Datei beschädigt und Tausende Nutzerdaten waren unwiederbringlich verloren

Am kritischsten war: Er wollte die Funktion „Alle Bestellungen eines Nutzers anzeigen" implementieren — aber Nutzerdaten und Bestellungen lagen in verschiedenen Excel-Tabellen, also musste er manuell kopieren und einfügen, was jedes Mal eine halbe Stunde dauerte.

Er fragte einen erfahrenen Kollegen um Rat. Der sah es sich an und lachte: „Was du brauchst, ist keine Excel-Datei, sondern eine Datenbank."

Nach dem Wechsel zur Datenbank änderte sich alles:

  • Die Abfrage „Nutzer aus Berlin" dauerte nur noch 0,01 Sekunden
  • Nutzer und Bestellungen wurden über „Beziehungen" automatisch verknüpft — eine einzige SQL-Anweisung reichte
  • Automatische Daten-Backups — keine Angst mehr vor Dateibeschädigung

Klein begriff eine Wahrheit: Wenn die Datenmenge klein ist, funktioniert alles; aber wenn die Daten wachsen, wird Excel zur Katastrophe.

💡 Kern-Erkenntnis

Eine Datenbank ist kein „komplizierteres Excel", sondern folgt einem völlig anderen Designansatz:

  • Excel: Entworfen für kleine Daten und Einzelplatznutzung
  • Datenbank: Entworfen für große Daten, hohe Parallelität und komplexe Verknüpfungen

Die Wahl des richtigen Werkzeugs kann die Systemleistung um das Tausendfache steigern.


2. Kernkonzepte: Tabelle, Zeile, Spalte, Primärschlüssel

🤔 Was haben diese Konzepte mit Datenbanken zu tun?

Tabellen, Zeilen, Spalten und Primärschlüssel sind die „Bausteine" von Datenbanken.

Stellen Sie sich vor, Sie bauen ein Haus:

  • Tabelle = ein Raum (speichert eine Art von Daten)
  • Zeile = eine Kiste im Raum (ein vollständiger Datensatz)
  • Spalte = das Etikett auf der Kiste (Name, Alter usw.)
  • Primärschlüssel = die eindeutige Nummer der Kiste (niemals doppelt)

Wenn Sie diese Grundkonzepte verstehen, wissen Sie, wie Daten organisiert sind.

Bevor wir tiefer in Datenbanken einsteigen, müssen wir diese Kernkonzepte klären. Wir verwenden die Bibliotheksmetapher als Vergleich.

2.1 Die Bibliotheksmetapher: Datenbankstruktur verstehen

Stellen Sie sich vor, Sie betreten eine Bibliothek. Die Organisation dort ist erstaunlich ähnlich wie in einer Datenbank:

Konzept📚 BibliotheksmetapherTatsächliche FunktionKonkretes Beispiel
Datenbank (Database)Die gesamte BibliothekContainer für alle DatenDatenbank einer E-Commerce-Website
Tabelle (Table)Ein BücherregalSammlung derselben Art von DatenNutzertabelle, Produkttabelle, Bestelltabelle
Spalte (Column)Das Etikett auf dem BuchrückenAttribute (Felder) der DatenName, Alter, Telefonnummer
Zeile (Row)Jedes Buch im RegalEin konkreter Daten-Datensatz„Max, 25 Jahre, Berlin"
Primärschlüssel (Primary Key)Die ISBN-Nummer jedes BuchesEindeutige ID für jede Zeileuser_id = 1001

Ein konkretes Beispiel: Nutzertabelle (users)

user_id (Primärschlüssel)nameagecityemail
1001Max25Berlinmax@example.com
1002Anna30Münchenanna@example.com
1003Tom28Berlintom@example.com
  • Tabelle: users (speichert alle Nutzerdaten)
  • Spalten: user_id, name, age, city, email (Attribute jedes Nutzers)
  • Zeilen: Jede Zeile ist ein Nutzer (z. B. „Max, 25 Jahre, Berlin")
  • Primärschlüssel: user_id (1001, 1002, 1003 — niemals doppelt)

2.2 Primärschlüssel (Primary Key): Die „Personalausweisnummer" der Daten

📖 Was ist ein Primärschlüssel?

Der Primärschlüssel ist die eindeutige Kennung jeder Zeile in einer Tabelle — wie die Personalausweisnummer.

Wesentliche Merkmale:

  • Eindeutigkeit: Niemals doppelt (keine zwei Personen haben dieselbe Ausweisnummer)
  • Nicht leer: Muss einen Wert haben (es gibt keinen Menschen „ohne Personalausweisnummer")
  • Unveränderlichkeit: Einmal festgelegt, wird er nicht geändert (Ihre Ausweisnummer ändert sich nicht)

Gängige Methoden:

  • Auto-Inkrement-Ganzzahlen verwenden: 1, 2, 3, 4...
  • UUID (Universally Unique Identifier) verwenden: 550e8400-e29b-41d4-a716-446655440000

Warum braucht man einen Primärschlüssel? Stellen Sie sich eine Welt ohne Primärschlüssel vor:

Szenario: Sie möchten das Alter von „Max" ändern, aber es gibt drei „Max" in der Tabelle. Welchen soll das System ändern?

sql
-- Ohne Primärschlüssel: Das ändert alle namens „Max" gleichzeitig!
UPDATE users SET age = 26 WHERE name = 'Max';

-- Mit Primärschlüssel: Präzise Änderung
UPDATE users SET age = 26 WHERE user_id = 1001;

Die goldene Regel des Primärschlüssels: Jede Tabelle sollte einen Primärschlüssel haben, und er sollte niemals geändert werden.

2.3 Fremdschlüssel (Foreign Key): Die Brücke zwischen Tabellen

Das ist der Schlüssel, warum Datenbanken mächtiger als Excel sind — Tabellen können miteinander in Beziehung gesetzt werden.

📖 Was ist ein Fremdschlüssel?

Ein Fremdschlüssel ist eine Spalte, die auf den Primärschlüssel einer anderen Tabelle verweist und Beziehungen zwischen Tabellen herstellt.

Einfach gesagt:

  • Primärschlüssel = meine Personalausweisnummer
  • Fremdschlüssel = die Personalausweisnummer, die ich von jemand anderem referenziere

Ein Beispiel: Das Feld user_id in der Bestelltabelle ist ein Fremdschlüssel, der auf den Primärschlüssel der Nutzertabelle verweist.

Ein konkretes Beispiel:

Nutzertabelle (users):

user_id (Primärschlüssel)namephone
1001Max0151xxx
1002Anna0170xxx

Bestelltabelle (orders):

order_id (Primärschlüssel)product_namepriceuser_id (Fremdschlüssel)
5001iPhone 1559991001
5002MacBook149991001
5003AirPods19991002

Wichtiges Verständnis:

  • user_id = 1001 in der Bestelltabelle verweist auf user_id = 1001 (Max) in der Nutzertabelle
  • Wenn Sie fragen „Wer hat Bestellung 5001 getätigt?", sucht die Datenbank automatisch in der Nutzertabelle nach dem Nutzer mit user_id = 1001

Vorteile:

  • Keine Datenredundanz: Selbst wenn Max 100 Artikel kauft, stehen seine Informationen nur einmal in der Nutzertabelle
  • Einfache Wartung: Wenn Max seine Telefonnummer ändert, muss nur die Nutzertabelle aktualisiert werden; alle Bestellungen verweisen automatisch auf die neue Nummer
  • Flexible Abfragen: Komplexe Fragen wie „Wie viel hat jeder Nutzer insgesamt ausgegeben?" lassen sich leicht beantworten
🔗外键关系演示理解表与表之间如何关联
想象你在管理一个家族谱系:有"家谱表"记录每个人,有"婚姻表"记录谁和谁结婚了。两张表通过"人名"关联起来,这就是外键的作用。
👥用户表 (users)主表
🔑 user_id
name
phone
address
101
张三
138xxxx
北京
102
李四
139xxxx
上海
103
王五
137xxxx
广州
user_id (外键) → user_id (主键)
📦订单表 (orders)从表
🔑 order_id
book_name
🔗 user_id
price
001
百年孤独
101
59
002
活着
101
39
003
三体
101
99
004
百年孤独
102
59
005
红楼梦
102
79
006
西游记
103
69
💡 核心概念

主键(Primary Key):用户表的 user_id 是主键,唯一标识每个用户。

外键(Foreign Key):订单表的 user_id 是外键,指向用户表的主键。

关联查询:通过外键,数据库可以快速找到"订单 001 是用户 101 买的",然后去用户表查到"用户 101 是张三"。

🎯核心优势:外键消除了数据冗余。张三的地址只存一次,无论他买多少本书。如果要修改地址,只需改用户表的一行,所有订单自动关联到新地址。

3. Wie spricht man mit einer Datenbank? SQL-Einführung und Praxis

Sie können eine Datenbank nicht einfach mit der Maus „anklicken" (es gibt zwar grafische Tools, aber diese wandeln die Klicks im Hintergrund in Befehle um). Sie benötigen eine spezielle Sprache, um die Datenbank zu steuern.

Diese Sprache heißt SQL (Structured Query Language, strukturierte Abfragesprache).

Die gute Nachricht: SQL ist dem natürlichen Englisch sehr ähnlich und liest sich fast wie gesprochene Sprache.

3.1 Die Kernoperationen von SQL: CRUD

Meistens reicht es, vier Operationen zu beherrschen, die in der Branche als CRUD bezeichnet werden:

OperationEnglischSQL-SchlüsselwortAnschauliche Erklärung
CreateErstellenINSERTEinen neuen Datensatz hinzufügen
ReadLesenSELECTDaten abfragen
UpdateAktualisierenUPDATEDaten ändern
DeleteLöschenDELETEDaten entfernen

📊 Was zeigt die Tabelle?

Diese vier Operationen decken alle Datenverarbeitungsszenarien ab:

  • Create: Wenn ein Nutzer sich registriert, wird ein neuer Nutzerdatensatz eingefügt
  • Read: Wenn ein Nutzer sich einloggt, werden Benutzername und Passwort abgefragt
  • Update: Wenn ein Nutzer sein Profil bearbeitet, werden die Daten in der Tabelle aktualisiert
  • Delete: Wenn ein Nutzer sein Konto löscht, werden die Nutzerdaten entfernt

Wenn Sie diese vier beherrschen, haben Sie 80 % der alltäglichen SQL-Operationen drauf.

3.2 Daten abfragen (SELECT): Die am häufigsten verwendete Datenbankoperation

Abfragen sind die wichtigste Funktion von Datenbanken und der Schlüssel zur Leistungsoptimierung.

Beispiel 1: Alle Nutzer aus Berlin finden

sql
SELECT name, age FROM users WHERE city = 'Berlin';

Wort-für-Wort-Verständnis:

  • SELECT name, age: Die Spalten name und age auswählen
  • FROM users: Aus der Tabelle users
  • WHERE city = 'Berlin': Unter der Bedingung, dass city gleich „Berlin" ist

Ergebnis:

nameage
Max25
Tom28

Beispiel 2: Produkte mit einem Preis zwischen 5000 und 15000 finden

sql
SELECT name, price FROM products
WHERE price BETWEEN 5000 AND 15000;

Beispiel 3: Unscharfe Suche (Nutzer finden, deren Name „Ma" enthält)

sql
SELECT name FROM users WHERE name LIKE '%Ma%';

⚠️ Performance-Falle: LIKE-Verwendung

LIKE '%Ma%' führt zu einem Full Table Scan und ist bei großen Datenmengen sehr langsam.

Optimierungsempfehlung:

  • ❌ Nicht LIKE '%Ma%' verwenden (% vorne und hinten)
  • LIKE 'Ma%' ist akzeptabel (nur hinten %)

Denn LIKE 'Ma%' kann einen Index nutzen, während LIKE '%Ma%' keinen Index verwenden kann.

3.3 Daten einfügen (INSERT): Neue Datensätze hinzufügen

Beispiel: Einen neuen Nutzer hinzufügen

sql
INSERT INTO users (user_id, name, age, city, email)
VALUES (1004, 'Lisa', 35, 'Hamburg', 'lisa@example.com');

Wort-für-Wort-Verständnis:

  • INSERT INTO users: In die Tabelle users einfügen
  • (user_id, name, age, city, email): Die einzufügenden Spalten angeben
  • VALUES (1004, 'Lisa', ...): Die entsprechenden Werte

Batch-Einfügen (effizienter):

sql
INSERT INTO users (name, age, city) VALUES
('Felix', 25, 'Berlin'),
('Sophie', 28, 'München'),
('Paul', 30, 'Hamburg');

3.4 Daten aktualisieren (UPDATE): Datensätze ändern

Beispiel: Das Alter aller Berliner Nutzer um 1 erhöhen

sql
UPDATE users SET age = age + 1 WHERE city = 'Berlin';

❌ Sehr gefährlich: Die WHERE-Klausel nicht vergessen!

Wenn Sie die WHERE-Klausel vergessen, werden alle Zeilen geändert!

sql
-- Gefährlich! Das ändert das Alter aller Nutzer auf 26
UPDATE users SET age = 26;

-- Richtig: Nur den Nutzer mit user_id = 1001 ändern
UPDATE users SET age = 26 WHERE user_id = 1001;

Wahre Lektion: 2012 hat ein Ingenieur bei einem bekannten Unternehmen die WHERE-Klausel vergessen, wodurch in der Produktionsumgebung Millionen von Nutzerdaten fehlerhaft aktualisiert wurden. Das System war 4 Stunden lang ausgefallen, mit enormen Verlusten.

3.5 Daten löschen (DELETE): Datensätze entfernen

Beispiel: Den Nutzer mit user_id = 1004 löschen

sql
DELETE FROM users WHERE user_id = 1004;

❌ Doppelt gefährlich: DELETE braucht WHERE erst recht!

sql
-- Gefährlich! Löscht alle Daten der gesamten Tabelle!
DELETE FROM users;

-- Richtig: Nur die angegebene Zeile löschen
DELETE FROM users WHERE user_id = 1004;

Best Practices:

  1. Vor dem Löschen mit SELECT die Daten bestätigen
  2. In wichtigen Systemen „Soft Deletes" verwenden (ein is_deleted-Feld zum Markieren hinzufügen)
  3. Vor Operationen in der Produktionsumgebung immer Daten sichern

3.6 Multi-Tabellen-Abfragen (JOIN): Der magische Moment der Datenbank

Erinnern Sie sich an die „Fremdschlüssel", die wir besprochen haben? Die größte Stärke von SQL ist die Fähigkeit, mehrere verknüpfte Tabellen in einer einzigen Abfrage zu durchsuchen.

Szenario: „Alle Produkte, die Max gekauft hat" abfragen

Wir haben drei Tabellen:

Nutzertabelle (users):

user_idname
1001Max

Produkttabelle (products):

product_idnameprice
201iPhone 155999
202MacBook14999

Bestelltabelle (orders):

order_iduser_idproduct_idquantity
500110012011
500210012022

SQL-Abfrage:

sql
SELECT u.name, p.name AS product_name, p.price, o.quantity
FROM orders o
JOIN users u ON o.user_id = u.user_id
JOIN products p ON o.product_id = p.product_id
WHERE u.name = 'Max';

Ergebnis:

nameproduct_namepricequantity
MaxiPhone 1559991
MaxMacBook149992

Den JOIN-Prozess verstehen:

  1. FROM orders o: Mit der Bestelltabelle beginnen
  2. JOIN users u ON o.user_id = u.user_id: Die Nutzertabelle über user_id verknüpfen
  3. JOIN products p ON o.product_id = p.product_id: Die Produkttabelle über product_id verknüpfen
  4. WHERE u.name = 'Max': Nur Max' Bestellungen filtern
💻SQL 练习场体验 SQL 的 CRUD 操作
SQL 就像和数据库对话:你说"给我找所有年龄大于 25 的用户",数据库就会执行查询并返回结果。即使不会编程,也能很快上手。
📝 示例 SQL
SELECT name, age FROM users WHERE age > 25;
💡 逐词翻译
SELECT name, age选择 name 和 age 这两列
FROM users从 users 这张表
WHERE age > 25在 age 大于 25 的条件下
📊 返回结果
name
age
李四
30
王五
28
🎯核心概念:CRUD 涵盖了所有数据管理的基本需求。无论是淘宝、微信、抖音,它们的数据库操作本质上就是这四种:增、删、改、查。

4. Warum sind Datenbanken so schnell? Das Geheimnis der Indizes

Das ist der faszinierendste Teil von Datenbanken und gleichzeitig die am häufigsten gestellte Frage in Vorstellungsgesprächen.

Wenn Sie in Excel „alle Personen mit Nachnamen Ma" suchen, muss Excel von der ersten bis zur letzten Zeile scannen. Das ist ein Full Table Scan — je mehr Daten, desto langsamer.

In einer Datenbank hingegen dauert die Suche selbst bei 1 Milliarde Zeilen nur wenige Millisekunden.

Das Geheimnis heißt: Index (Index).

4.1 Intuitives Verständnis: Die Inspiration des Wörterbuchs

Stellen Sie sich vor, Sie müssen in einem 1000-seitigen Buch ohne Inhaltsverzeichnis ein Wort finden. Was tun Sie?

Sie können nur Seite für Seite blättern — das ist der Full Table Scan, durchschnittlich 500 Seiten.

Aber was wäre, wenn das Buch ein Alphabet-Index hätte?

Sie suchen das Wort „Datenbank":

  1. Zum Index blättern und den Bereich mit „D" finden
  2. Im „D"-Bereich nach „a" suchen
  3. Der Index sagt Ihnen: auf Seite 256

Sie finden es mit nur 3 Nachschlägen! Das ist die Indexsuche.

Der Index einer Datenbank ist wie das Inhaltsverzeichnis eines Buches:

  • Ohne Index: Zeilenweiser Scan (1 Milliarde Zeilen = mehrere Minuten)
  • Mit Index: Direktsprung (1 Milliarde Zeilen = 3 Disk-I/Os = wenige Millisekunden)

4.2 Full Table Scan vs. Indexsuche: Geschwindigkeitsvergleich

Angenommen, wir haben eine Nutzertabelle mit 10 Millionen Einträgen.

Szenario: Den Nutzer mit user_id = 5,555,555 finden

MethodeProzessZu prüfende ZeilenGeschätzte Dauer
Full Table ScanVon Zeile 1 beginnend, Zeile für Zeile prüfenDurchschnittlich 5 Millionen Zeilen5-30 Sekunden
IndexsucheDen Indexbaum prüfen und direkt zur Zielposition springen3-4 Vergleiche0,003 Sekunden

Geschwindigkeitsunterschied: Mehrere tausendfach!

💡 Kern-Erkenntnis

Indizes sind kein Wundermittel; sie haben ihren Preis:

  • Speicherbedarf: Indizes benötigen zusätzlichen Speicherplatz
  • Langsamere Schreibvorgänge: Bei jedem INSERT/UPDATE/DELETE muss auch der Index aktualisiert werden

Wann sollte man einen Index erstellen?

  • Bei Spalten, die häufig in Abfragen verwendet werden (WHERE-, JOIN-Bedingungen)
  • Bei großen Datenmengen (wenige Tausend Zeilen brauchen keinen Index)

Wann sollte man keinen Index erstellen?

  • Bei Spalten, die selten abgefragt werden
  • Bei Spalten, die häufig aktualisiert werden
  • Bei kleinen Tabellen

4.3 Die zugrundeliegende Datenstruktur: B+ Baum

Echte Indizes sind keine einfachen „alphabetischen Listen", sondern eine sorgfältig entworfenen Datenstruktur namens B+ Baum (B+ Tree).

📖 Was ist ein B+ Baum?

Der B+ Baum ist eine „flache, breite" baumförmige Datenstruktur:

  • Flach: Von der Wurzel bis zum Blatt gibt es normalerweise nur 3-4 Ebenen
  • Breit: Jeder Knoten kann mehrere Hundert Schlüsselwerte speichern

Warum „flach und breit "?

Daten werden auf der Festplatte gespeichert, und jeder Festplatten-Lesezugriff (I/O) ist extrem langsam (Tausende Mal langsamer als der Arbeitsspeicher). Das Designziel des B+ Baums ist es, die Anzahl der Festplatten-I/Os zu minimieren.

  • 3-4 Ebenen Höhe = maximal 3-4 Festplatten-Lesezugriffe
  • Jede Ebene speichert große Datenmengen = stellt sicher, dass der Baum nicht zu hoch wird

Ein konkretes Beispiel:

Angenommen, jeder Knoten eines B+ Baums kann 1000 Schlüsselwerte speichern:

  • Wurzelknoten: 1000 Schlüsselwerte → zeigt auf 1000 Kindknoten
  • Mittlere Knoten: Jeder speichert 1000 Schlüsselwerte → zeigt auf 1000 Blattknoten
  • Blattknoten: Jeder speichert 1000 echte Daten

Gesamtdatenmenge = 1000 × 1000 × 1000 = 1 Milliarde Datensätze

Baumhöhe = 3 Ebenen

Das bedeutet: Um einen beliebigen Datensatz unter 1 Milliarde Datensätzen zu finden, werden nur 3 Festplatten-I/Os benötigt!

Das ist das Geheimnis, warum Datenbankabfragen so extrem schnell sind.

🌳B+ 树索引演示理解数据库如何快速查找数据
想象你要在字典里找一个字。你会先看目录,定位到首字母的区域,再在这个区域里找具体页码。B+ 树就是这样的多层目录,让数据库在 10 亿条数据中 3 次就能找到目标。
🐢全表扫描
001用户1
002用户2
003用户3
004用户4
005用户5
006用户6
007用户7
008用户8
009用户9
010用户10
011用户11
012用户12
013用户13
014用户14
015用户15
016用户16
017用户17
018用户18
019用户19
020用户20

👆 点击"开始查找"看全表扫描有多慢

索引查找
根节点
1-100
中间节点
1-10
叶子节点
1
2
3
4
5
6
7
8
9
10

👆 点击"开始查找"看索引有多快

数据量
100 万条
全表扫描
平均 50 万次比较
B+ 树索引
仅 3 次比较
速度提升
10 万倍+
💡核心原理:B+ 树通过"矮胖"的设计,让树的高度只有 3-4 层。每层可以存储成百上千个键值,所以 10 亿数据也只需要 3 次磁盘 I/O。这就是数据库查询飞快的秘密。

5. Transaktionen: Wie verhindert man Datenverlust und Daten-Chaos?

Stellen Sie sich die Ticketsituation zur Feiertagssaison vor:

  • Zeit T1: Nutzer A fragt ab und sieht „Zug G1234 hat noch 1 Ticket"
  • Zeit T2: Nutzer B fragt ebenfalls ab und sieht auch „noch 1 Ticket"
  • Zeit T3: Nutzer A klickt auf „Kaufen"; das System zieht den Bestand ab und verkauft das Ticket an A
  • Zeit T4: Nutzer B klickt auf „Kaufen" — ohne Schutzmechanismus zieht das System den Bestand erneut ab und verkauft dasselbe Ticket auch an B!

Das ist ein klassisches Parallelitätskonflikt-Problem.

5.1 Was ist eine Transaktion (Transaction)?

Eine Transaktion ist eine Gruppe von Datenbankoperationen, die entweder alle erfolgreich sind oder alle fehlschlagen — es gibt keinen Zustand „halb ausgeführt".

🤖 Ein Beispiel aus dem Alltag

Banküberweisung ist eine typische Transaktion:

  1. Konto A wird um 100 Euro belastet
  2. Konto B werden 100 Euro gutgeschrieben

Was passiert, wenn Schritt 1 gelingt, aber Schritt 2 fehlschlägt (z. B. durch Stromausfall)?

  • Ohne Transaktion: Das Geld von Konto A ist weg, Konto B hat keins erhalten — das Geld ist spurlos verschwunden
  • Mit Transaktion: Das System erkennt, dass Schritt 2 fehlgeschlagen ist, und macht Schritt 1 automatisch rückgängig (Rollback). Beide Konten kehren in den Ursprungszustand zurück

Das ist die Atomizität von Transaktionen: Alles oder Nichts.

5.2 Die vier Eigenschaften von Transaktionen (ACID)

Transaktionen haben vier Eigenschaften, die als ACID abgekürzt werden:

EigenschaftEnglischBedeutungBeispiel bei der Banküberweisung
AtomicityAtomizitätAlles oder NichtsBelastung und Gutschrift müssen beide erfolgreich sein; es darf nicht nur belastet werden ohne Gutschrift
ConsistencyKonsistenzDaten bleiben immer in einem gültigen ZustandVor und nach der Überweisung muss die Gesamtsumme beider Konten unverändert bleiben
IsolationIsolationMehrere Transaktionen beeinflussen sich nicht gegenseitigWährend A überweist, sieht B entweder den „Vorher"- oder den „Nachher"-Saldo, aber keinen Zwischenzustand
DurabilityDauerhaftigkeitEinmal committet, sind die Daten dauerhaft gespeichertNach erfolgreicher Überweisung bleibt der Kontostand auch bei Stromausfall unverändert

📊 Was zeigt die Tabelle?

Diese vier Eigenschaften garantieren die Datensicherheit:

  • Atomizität: Verhindert „halb ausgeführt" (Geld belastet, aber nicht gutgeschrieben)
  • Konsistenz: Verhindert unlogische Daten (Gesamtsumme ändert sich nach der Überweisung)
  • Isolation: Verhindert Parallelitätskonflikte (zwei Personen ändern gleichzeitig dieselben Daten)
  • Dauerhaftigkeit: Verhindert Datenverlust (Commit übersteht Stromausfall)

Ohne diese Garantien könnte ein Bankensystem überhaupt nicht betrieben werden.

5.3 Isolationsstufen von Transaktionen: Sicherheit vs. Leistung

Theoretisch wünschen wir uns vollständig isolierte Transaktionen. Aber vollständige Isolation = extrem schlechte Leistung (da viel gelockt werden muss und andere Transaktionen warten müssen).

Daher bieten Datenbanken vier Isolationsstufen an:

IsolationsstufeDirty ReadNon-repeatable ReadPhantom ReadLeistungAnwendungsszenario
Read UncommittedMöglichMöglichMöglichAm schnellstenKaum verwendet (Daten können falsch sein)
Read CommittedNicht möglichMöglichMöglichSchnellNormale Geschäftsprozesse (Oracle-Standard)
Repeatable ReadNicht möglichNicht möglichMöglichMittelBanküberweisungen (MySQL-Standard)
SerializableNicht möglichNicht möglichNicht möglichAm langsamstenExtrem strenge Szenarien (selten verwendet)

📖 Was bedeuten die drei „Read"-Arten?

  • Dirty Read: Daten gelesen, die eine andere Transaktion noch nicht committet hat (könnten zurückgerollt werden, Daten ungenau)
  • Non-repeatable Read: In derselben Transaktion wird derselbe Datensatz zweimal gelesen, aber mit unterschiedlichem Ergebnis (von einer anderen Transaktion geändert)
  • Phantom Read: In derselben Transaktion werden zwei Abfragen ausgeführt, aber die Anzahl der Ergebniszeilen ist unterschiedlich (eine andere Transaktion hat Daten eingefügt/gelöscht)

Alltägliche Beispiele (Kontostand prüfen):

  • Dirty Read: Sie sehen einen Kontostand von 1000 Euro, aber die andere Transaktion wird zurückgerollt — tatsächlich sind es nur 100 Euro
  • Non-repeatable Read: Beim ersten Mal sehen Sie 1000 Euro, beim zweiten Mal nur noch 800 Euro (wurde belastet)
  • Phantom Read: Beim ersten Mal sehen Sie 5 Transaktionen, beim zweiten Mal 6 (eine neue wurde hinzugefügt)
🔒事务 ACID 特性演示理解事务如何保证数据安全
想象银行转账:A 转给 B 100 元。这个操作包含两步:从 A 扣 100,给 B 加 100。如果只扣了钱但没到账,就是灾难。事务保证这两步要么全成功,要么全失败
⚛️
A
原子性
Atomicity
⚖️
C
一致性
Consistency
🔒
I
隔离性
Isolation
💾
D
持久性
Durability
👆 点击上方任意特性,查看详细解释
🎯 12306 抢票场景

场景:用户 A 和 B 同时看到还剩 1 张票,同时点击购买。

没有事务:A 扣库存,B 也扣库存,同一张票卖给了两个人!

有事务(隔离性):A 的操作加锁,B 必须等待。A 买完后,库存变为 0,B 看到的是"已售罄"。

💡核心思想:ACID 四个特性共同保证了数据在高并发环境下的不丢、不乱、不冲突。这就是为什么所有涉及资金、订单的系统都必须使用数据库事务。

6. Leistungsoptimierung: Praxistipps, die Abfragen 1000x schneller machen

Jetzt verstehen Sie die Kernkonzepte von Indizes und Transaktionen. In echten Projekten können Sie jedoch auf verschiedene Performance-Probleme stoßen.

Dieser Abschnitt bietet direkt umsetzbare Optimierungsstrategien.

6.1 Leitfaden zur Vermeidung von Index-Fallen

⚠️ Häufiger Fehler: Wenn Indizes nicht greifen

Oft haben Sie einen Index erstellt, aber die Abfrage ist trotzdem langsam — weil der Index nicht verwendet wird.

Häufige Ursachen für nicht genutzte Indizes:

  1. Funktionen auf Index-Spalten angewendet
  2. Implizite Typkonvertierung
  3. LIKE-Abfrage beginnt mit %
  4. OR-Bedingungen (in bestimmten Fällen)
  5. Zusammengesetzter Index erfüllt nicht die Leftmost-Prefix-Regel

Falle 1: Funktionen auf Index-Spalten

sql
-- ❌ Falsch: Funktion auf Index-Spalte verhindert Indexnutzung
SELECT * FROM users WHERE YEAR(created_at) = 2024;

-- ✅ Richtig: Als Bereichsabfrage umschreiben, Index kann genutzt werden
SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';

Falle 2: Implizite Typkonvertierung

sql
-- Angenommen user_id ist vom Typ int
-- ❌ Falsch: String übergeben, führt zu impliziter Konvertierung, Index kann nicht genutzt werden
SELECT * FROM users WHERE user_id = '123';

-- ✅ Richtig: Den entsprechenden Typ übergeben
SELECT * FROM users WHERE user_id = 123;

Falle 3: LIKE beginnt mit %

sql
-- ❌ Falsch: Beginnt mit %, Index kann nicht genutzt werden
SELECT * FROM users WHERE name LIKE '%Max%';

-- ✅ Richtig: Mit festem Präfix beginnen, Index kann genutzt werden
SELECT * FROM users WHERE name LIKE 'Max%';

-- ✅ Oder Volltextindex verwenden (für Textsuche geeignet)
SELECT * FROM users WHERE MATCH(name) AGAINST('Max');

6.2 SQL-Optimierung — Praxistemplates

Template 1: Paginierungsoptimierung (Deep-Pagination-Problem)

Problem und Lösung anzeigen
sql
-- ❌ Problem: Bei großem OFFSET wird die Abfrage immer langsamer
SELECT * FROM orders
ORDER BY created_at DESC
LIMIT 10 OFFSET 1000000;

-- ✅ Optimierung 1: Den Zeitstempel der letzten Abfrage als Cursor verwenden
SELECT * FROM orders
WHERE created_at < '2024-01-15 12:00:00'
ORDER BY created_at DESC
LIMIT 10;

-- ✅ Optimierung 2: Primärschlüssel-Bereichsabfrage verwenden
SELECT * FROM orders
WHERE order_id > 1000000
ORDER BY order_id
LIMIT 10;

Template 2: Batch-Einfüge-Optimierung

sql
-- ❌ Ineffizient: Mehrere Einzel-Einfügungen (mehrere Netzwerk-Roundtrips)
INSERT INTO users (name, age) VALUES ('Max', 25);
INSERT INTO users (name, age) VALUES ('Anna', 30);
INSERT INTO users (name, age) VALUES ('Tom', 28);

-- ✅ Effizient: Ein einzelnes SQL-Statement für Batch-Einfügung (nur ein Netzwerk-Roundtrip)
INSERT INTO users (name, age) VALUES
('Max', 25),
('Anna', 30),
('Tom', 28);

Template 3: SELECT * vermeiden

sql
-- ❌ Ineffizient: Alle Spalten zurückgeben (inklusive unnötiger großer Felder)
SELECT * FROM users WHERE user_id = 1;

-- ✅ Effizient: Nur die benötigten Spalten zurückgeben
SELECT user_id, name, email FROM users WHERE user_id = 1;

6.3 Strategien für hohe Parallelität

SzenarioProblemLösung
Hotspot-DatenEine Zeile wird häufig gelesen/geschrieben, führt zu Lock-KonkurrenzCache (Redis) + Read/Write-Splitting
Flash-SalePlötzlich hohe Parallelität bei BestandsreduzierungOptimistisches Locking + Bestandsvorladen + Message Queue für Peak-Shaving
Slow QueriesKomplexe Abfragen bremsen die Datenbank ausIndex-Optimierung + Abfrage-Aufteilung + Read/Write-Splitting
VerbindungserschöpfungZu viele parallele Anfragen erschöpfen den Connection PoolConnection-Pool-Optimierung + Rate-Limiting + Service-Degradation

💡 Kern-Erkenntnis

Die Grundprinzipien der Leistungsoptimierung:

  1. Zuerst messen, dann optimieren: Mit EXPLAIN den Abfrageplan analysieren und den echten Engpass finden
  2. Indizes zuerst: 80 % der Performance-Probleme lassen sich durch Index-Optimierung lösen
  3. Datenbanklast reduzieren: Wenn ein Cache möglich ist, Cache verwenden; wenn asynchron möglich ist, asynchron arbeiten
  4. Teile und herrsche: Große Tabellen in kleine aufteilen, große Abfragen in kleine aufteilen
查询优化演示常见错误与正确做法对比
很多时候,查询慢不是因为数据库性能差,而是因为 SQL 写错了。下面这些错误,你可能每天都在犯。
1
在索引列上使用函数
SELECT * FROM users WHERE YEAR(created_at) = 2024;
⚠️ 索引失效,全表扫描
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';
💡 可以使用索引,查询速度提升 1000 倍
原理:当对列使用函数时,数据库必须先计算每一行的函数值,无法使用索引。把函数移到等号右边,或用范围查询代替。
2
隐式类型转换
3
LIKE 以 % 开头
4
SELECT * 返回所有列
📝 优化建议清单
为 WHERE、JOIN、ORDER BY 的列创建索引
避免在索引列上使用函数或表达式
用 EXPLAIN 分析查询执行计划
只查询需要的列,避免 SELECT *
批量操作代替单条操作
考虑使用覆盖索引减少回表
🎯核心原则:不要让数据库做"多余的工作"。索引失效、全表扫描、返回不必要的数据,这些都是最常见的性能杀手。写出高效 SQL 的关键,是理解数据库如何执行你的查询

7. Zusammenfassung und Lernpfad

Lassen Sie uns die Kernkonzepte von Datenbanken in einer Tabelle rekapitulieren:

KonzeptErklärung in einem SatzGelöstes ProblemKernpunkt
Tabelle, Zeile, SpalteDie Organisation der DatenWie strukturierte Daten gespeichert werdenTabelle = Excel-Arbeitsblatt, Zeile = Datensatz, Spalte = Feld
PrimärschlüsselEindeutige Kennung jeder ZeileWie man eine bestimmte Zeile präzise findetEindeutig, nicht leer, unveränderlich
FremdschlüsselDie Brücke zwischen TabellenWie man Daten unterschiedlicher Tabellen verknüpftVerweist auf den Primärschlüssel einer anderen Tabelle
SQLDie Sprache, um mit der Datenbank zu sprechenWie man Daten einfügt, abfragt, ändert und löschtSELECT, INSERT, UPDATE, DELETE
IndexDatenstruktur zur Beschleunigung von AbfragenWie man Daten schnell findetB+ Baum, reduziert Disk-I/O
TransaktionMechanismus zur Gewährleistung der DatensicherheitWie man Parallelitätskonflikte und Datenverlust verhindertACID: Atomizität, Konsistenz, Isolation, Dauerhaftigkeit

Zum Schluss

Datenbanken sind ein tiefgründiges und umfangreiches Thema; dieser Artikel ist nur eine Einführung. Wenn Sie tiefer einsteigen möchten, empfehlen wir folgenden Lernpfad:

Nächste Schritte:

  1. Praktische Übungen: MySQL oder PostgreSQL installieren, Tabellen erstellen, Daten einfügen und SQL-Abfragen schreiben
  2. ORM-Frameworks: Lernen, wie man Datenbanken im Code verwendet (z. B. SQLAlchemy, Prisma, TypeORM)
  3. Index-Optimierung: Zusammengesetzte Indizes, Covering Index, Index Pushdown und andere fortgeschrittene Themen vertiefen
  4. Transaktions-Prinzipien: MVCC (Multi-Version Concurrency Control), Locking-Mechanismen und die Implementierung von Isolationsstufen verstehen
  5. Verteilte Datenbanken: Sharding, Read/Write-Splitting, Master-Slave-Replikation und andere Architekturkonzepte lernen

Denken Sie daran: Theorie + Praxis = wahre Meisterschaft.