Zum Hauptinhalt springen

Tag 4

1 Dokumentationsaufträge

1.1 Storage Engines bei MySQL

Tag 3 - Kapitel 2.1.1

1.2 Benutzer und Berechtigungen

Tag 3 - Kapitel 2.1.2

1.3 Server-Konfiguration

Tag 4 - Kapitel 2.1.1

1.4 Server-Betrieb

Tag 4 - Kapitel 2.1.2

2 Übungen

2.1 Konfiguration eines RDBMS

2.1.1 Server-Konfiguration

Transaktions-Isolation : Verfizieren Sie welche Transaktions-Isolation auf Ihrem Server aktiviert ist. Dokumentieren Sie, was das bezüglich den Anomalien für Ihre Installation bedeutet.

SHOW VARIABLES LIKE "transaction_isolation";
OUTPUT
mysql> SHOW VARIABLES LIKE "transaction_isolation";
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.01 sec)

REPEATABLE-READ gewährleistet, dass die gleichen Daten bei wiederholten Lesevorgängen innerhalb der Transaktion konsistent bleiben. Phantom Reads sind möglich.

Exportieren Sie die aktuelle Liste an System-Variablen

-- Ausserhalb des MySQL Servers ausführen.
sudo mysql -u root -p -e "SHOW VARIABLES;" > ./Downloads/system_variables.txt

OUTPUT

Netzwerkkonfiguration DBMS-Server anpassen und dokumentieren (wie kann man einen TCP Port öffnen?)

/etc/mysql/mysql.conf.d/mysqld.cnf
...
port = 33066
...
sudo mysql -u root -p -P 33066

2.1.2 Server-Betrieb

Protokollierung langsamer Abfragen aktivieren

/etc/mysql/mysql.conf.d/mysqld.cnf
...
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
...

Listen Sie den Inhalt des Data-Directories auf

/etc/mysql/mysql.conf.d/mysqld.cnf
...
datadir = /var/lib/mysql
...
sudo ls /var/lib/mysql

Dokumentieren Sie die Default-Datenbanken mysql, sys, performance_schema

mysql: Enthält systemrelevante Informationen, MySQL-Benutzerkonten und deren Zugriffsrechte. Sie ist für Verwaltung von Benutzerkonten und die Zugriffsrechte nötig.

sys: Diese Datenbank wirs automatisch erstellt und enthält Informationen über Speicher, CPU, Zugriffe usw. Es kann als Monitoring für das DBMS genutzt werden.

performance_schema: Detailliertere Informationen die für die Perfomance für das DBMS zuständig sind. Es kann verwendet werden um Abfragen zu analysieren.

Alle drei Datenbanken sind für MySQL essentiell und sollten nicht vom User bearbeitet oder gelöscht werden.

2.1.3 Datentypen / Attribute

Recherchieren Sie zu Datentypen in MySQL

Offizielle MySQL-Doku (ein bissschen unübersichtlich)

Eine bessere Übersicht gibt die folgende Tabelle Quelle:

DatentypSpeicherplatzBeschreibung
Numerisch
TINYINT1 ByteGanzzahlen Bereich mit Vorzeichen: -128 bis 127 Bereich ohne Vorzeichen: 0 bis 255
SMALLINT2 BytesGanzzahlen Bereich mit Vorzeichen: -32.768 bis 32.767 Bereich ohne Vorzeichen: 0 bis 65.535
MEDIUMINT3 BytesGanzzahlen Bereich mit Vorzeichen: -8.388.608 bis 8.388.607 Bereich ohne Vorzeichen: 0 bis 16.277.215
INT4 BytesGanzzahlen Bereich mit Vorzeichen: -2.147.483.648 bis 2.147.483.647 Bereich ohne Vorzeichen: 0 bis 4.294.967.295
BIGINT8 BytesGanzzahlen Bereich mit Vorzeichen: -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 Bereich ohne Vorzeichen: 0 bis 18.446.744.073.709.551.615
DECIMALvariiert (weitere Infos)Fixkommazahlen (M, D) Die maximale Anzahl an Ziffern (M) ist 65 (Standard: 10), die maximale Anzahl an Nachkommastellen (D) ist 30 (Standard: 0)
FLOAT4 BytesFließkommazahlen Erlaubte Werte sind -3,402823466 x 1038 bis -1,175494351 x 10-38, 0 und 1,175494351 x 10-38 bis 3,402823466 x 1038
DOUBLE8 BytesFließkommazahlen Erlaubte Werte sind -1,7976931348623157 x 10308 bis -2,2250738585072014 x 10-308, 0 und 2,2250738585072014 x 10-308 bis 1,7976931348623157 x 10308
REAL8 BytesSynonym für DOUBLE Ausnahme: im SQL-Modus REAL_AS_FLOAT ein Synonym für FLOAT
BITca. (M+7)/8 BytesEin Bitfeld-Typ (M), der M Bits pro Wert speichert (Standard ist 1, Maximum ist 64)
BOOLEAN1 ByteEin Synonym für TINYINT(1), ein Null-Wert wird als falsch angesehen, Nicht-Null-Werte werden als Wahr angesehen
SERIAL8 BytesEin Alias für BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
Datum und Uhrzeit
DATE3 BytesDatum Unterstützter Bereich ist 1000-01-01 bis 9999-12-31
DATETIME8 BytesKombination aus Datum und Uhrzeit Unterstützter Bereich ist 1000-01-01 00:00:00 bis 9999-12-31 23:59:59
TIMESTAMP4 BytesZeitstempel Unterstützter Bereich ist 1970-01-01 00:00:01 UTC bis 2038-01-09 03:14:07 UTC Gespeichert als Anzahl der Sekunden seit Beginn der UNIX-Epoche (1970-01-01 00:00:00 UTC)
TIME3 BytesUhrzeit Unterstützter Bereich ist -838:59:59 bis 838:59:59
YEAR1 ByteJahr Vier- (4, Standard) oder zweistelliges (2) Format Erlaubte Werte sind 70 (1970) bis 69 (2069) oder 1901 bis 2155 und 0000
Zeichenkette
CHARL Byte(s)Zeichenkette mit fester Länge (0 bis 255, Standard: 1) L Rechts wird immer bis zur angegebenen Länge mit Leerzeichen aufgefüllt
VARCHARL+1 Byte(s)Zeichenkette mit variabler Länge (0 bis 65.535) L Die tatsächliche maximale Länge hängt von der maximalen Anzahl an Zeilen ab
TINYTEXTL+1 Byte(s)TEXT-Spalte mit einer maximalen Länge von 255 Zeichen Gespeichert mit einem Ein-Byte-Präfix, der die Länge des Wertes in Bytes angibt
TEXTL+2 Byte(s)TEXT-Spalte mit einer maximalen Länge von 65.535 Zeichen Gespeichert mit einem Zwei-Byte-Präfix, der die Länge des Wertes in Bytes angibt
MEDIUMTEXTL+3 Byte(s)TEXT-Spalte mit einer maximalen Länge von 16.777.215 Zeichen Gespeichert mit einem Drei-Byte-Präfix, der die Länge des Wertes in Bytes angibt
LONGTEXTL+4 Byte(s)TEXT-Spalte mit einer maximalen Länge von 4.294.967.295 oder 4 GiB Zeichen Gespeichert mit einem Vier-Byte-Präfix, der die Länge des Wertes in Bytes angibt
BINARYL Byte(s)Ähnlich wie der CHAR-Typ, speichert aber binäre Byte-Zeichenketten anstelle von nicht-binären Buchstaben-Zeichenketten
VARBINARYL+1 Byte(s)Ähnlich wie der VARCHAR-Typ, speichert aber binäre Byte-Zeichenketten anstelle von nicht-binären Buchstaben-Zeichenketten
TINYBLOBL+1 Byte(s)BLOB-Spalte mit einer maximalen Länge L von 255 Zeichen Gespeichert mit einem Ein-Byte-Präfix, der die Länge des Wertes in Bytes angibt
BLOBL+2 Byte(s)BLOB-Spalte mit einer maximalen Länge von 65.535 Zeichen Gespeichert mit einem Zwei-Byte-Präfix, der die Länge des Wertes in Bytes angibt
MEDIUMBLOBL+3 Byte(s)BLOB-Spalte mit einer maximalen Länge von 16.777.215 Zeichen Gespeichert mit einem Drei-Byte-Präfix, der die Länge des Wertes in Bytes angibt
LONGBLOBL+4 Byte(s)BLOB-Spalte mit einer maximalen Länge von 4.294.967.295 oder 4 GiB Zeichen Gespeichert mit einem Vier-Byte-Präfix, der die Länge des Wertes in Bytes angibt
ENUM1-2 Byte(s)Aufzählung Gewählt aus einer Liste von bis zu 65.535 Werten
SET1, 2, 3, 4 oder 8 Byte(s)String-Objekt Ein einzelner Wert gewählt aus einem Satz von bis zu 64 Einträgen
Räumlich
GEOMETRYTyp, der die Geometrie irgendeinen Typs speichern kann
POINTPunkt im 2-dimensionalen Raum
LINESTRINGKurve mit linearer Interpolation zwischen Punkten
POLYGONVieleck (Polygon)
MULTIPOINTPunkte-Sammlung
MULTILINESTRINGKurven-Sammlung mit linearer Interpolation zwischen Punkten
MULTIPOLYGONPolygon-Sammlung
GEOMETRYCOLLECTIONSammlung von Geometrie-Objekten irgendeinen Typs

Spezialtyp : JSON als Datentyp beschrieben (grob) und ein Beispiel dokumentiert

Seit der Version 5.7 von MySQL können in Tabellen JSON gespeichert werden. Folgende Vorteile gibt es für den Datentypen:

  • Automatische Validierung von JSON (wenn Datentyp JSON genutzt wird)
  • Das JSON wird in ein internes Format konvertiert, welches einen schnellen Lesezugriff erlaubt
idjson_data
1{"name": "John Doe", "age": 35, "email": "john.doe@example.com", "phone": {"home": "555-1234", "work": "555-5678"}, "tags": ["mysql", "json"]}
2{"name": "Jane Smith", "age": 27, "email": "jane.smith@example.com", "phone": {"home": "555-9876"}, "tags": ["mysql", "database"]}

Das Beispiel hat eine id und einen Spalte json_data. In der json_data-Spalte wird JSON gespeichert. Somit kann die Tabelle relativ klein gehalten werden, da für z.B. name, age, etc. nicht eine eigene Spalte erstellt werden muss.

Spezialtyp : ENUM als Datentyp beschrieben (grob) und ein Beispiel dokumentiert

Mit ENUM kann eine Liste von zulässigen Werten festgelegt werden. Somit kann sichergestellt werden, dass nur bestimmte Werte möglich sind. Dies verbessert die Datenkonsistenz und -integrität.

CREATE TABLE users (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
gender ENUM('Male', 'Female') NOT NULL,
PRIMARY KEY (id)
);

In dieser Tabelle ist die Spalte gender ein ENUM-Datentyp. Er legt die beiden Werte Male und Female fest. Wird jetzt per INSERT INTO versucht in die Spalte gender den Wert Animal einzufügen, wird eine Fehlermeldung ausgegeben.

Beim erstellen von einem neuen Datensatz, muss der ENUM Wert als String übergeben werden.

INSERT INTO users (name, gender) VALUES ('John Doe', 'Male');

2.1.4 Indexierung

Indexierungstypen beschrieben und Anwendung dokumentieren

Mit einem Index kann das Auffinden von Datensätzen beschleunigt werden. Es ist eine spezielle Datenstruktur in MySQL. Ohne Indexierung wird bei einem WHERE die ganze Tabelle überprüft. Das kann bei einer Tabelle mit vielen Datensätzen viel Perfomance (und Zeit) fressen. Bei der Indexierung wird neben den normalen Datensätzen eine zusätzliche Datenstruktur erstellt, diese ist nur für die Indexierung zuständig.

CREATE INDEX idx_zip_code ON customers (zip_code);

Dieses Statement erstellt einen B-Tree-Index für die Spalte zip_code in der Tabelle customers. Wird jetzt eine Abfrage auf zip_code mit WHERE gemacht, wird MySQL den Index verwenden, um den Datensatz zu finden.

--                                   Das ist der Index
-- \/
SELECT * FROM customers WHERE zip_code = '12345';

Folgend die verschiedenen Typen der Indexierung:

  • B-Tree-Indexierung: am häufigsten verwendet; geeignet für Spalten mit begrenzten Werten (ENUM oder BOOLEAN) oder Spalten mit vielen unterschiedlichen Werten (z.B. Zeitstempel)
  • Hash-Indexierung: geeignet für Splaten mit vielen zufälligen Werten; können nur verwendet werden um genaue Übereinstimmungen zu suchen, da ein Hash generiert wird; wird oft für Spalten mit Text oder Binärdaten verwendet
  • Volltext-Indexierung: verwendet um Wörter oder Abschnitte in einem langen Text zu suchen; beschleunigt Suchanfragen in Dokumenten oder Nachrichten
  • Räumliche Indexierung: verwendet um Ortsangaben zu suchen (z.B. Koordinaten); ermöglichen MySQL schnell nach Punkten, Linien und Polygonen zu suchen

Quellen: