MySQL - Primary Key Date,Time vs ID

J90

Aktives Mitglied
Hallo,

ich verwende aktuell in meinen Kursdaten-Tables eine autoinkrementierte ID (int) als primary key und
2 Attribute date und time als zusätzlichen Index. Zudem existiert der Key UNIQUE(date,time).
Dieser Aufbau entstand zu einem Zeitpunkt, bei welchem ich nicht stark mit SQL bewandert war und nur die
Tables anlegen musste.

Mit neuem Wissen aus meiner Datenbanksysteme-Vorlesung stellt sich mir nun die Frage,
ob nicht eher gelten sollte primary key(date,time) ohne ID.

Wichtig ist, dass Date und Time immer aufsteigend sortiert sind.
Mir ist nun leider unklar, ob die aktuelle Variante (mit ID) oder die Neue effizienter wäre
(automatisch unique date,time durch primary key). Leider gibt es dazu widersprüchliche Aussagen im I-Net.

Soweit ich mich richtig erinnere hatte ich schoneinmal in der Vergangenheit einen Table mit primary key(date,time),
welcher langsamer Fragen verarbeitete.

Hat jemand einen klare Antwort für den Aufbau? Führt das Verwenden eines extra Primary Key (ID) mit Indexen auf Date,Time
zu redundanten Mehraufwand oder ist es im allgemeinen besser als nur primary key(date,time)?
 

mihe7

Top Contributor
Hat jemand einen klare Antwort für den Aufbau?
In der Regel einen künstlichen PK verwenden. Ein PK identifiziert einen Datensatz, als solcher sollte er sich auch dann nicht ändern, wenn die Inhalte des Satzes geändert werden und das ist bei natürlichen Schlüsseln oft nicht (auf Dauer) der Fall. So kann es z. B. dass der Zeitpunkt eines Kurses verschoben werden muss, was zu einer Änderung des PK führen würde, was wiederum zu Problemen führt, da Fremdschlüsselbeziehungen dies ggf. verhindern.

Wichtig ist, dass Date und Time immer aufsteigend sortiert sind.
Das ist für den PK völlig unerheblich.

Mir ist nun leider unklar, ob die aktuelle Variante (mit ID) oder die Neue effizienter wäre
Effizienter im Hinblick worauf? Was das Einfügen betrifft, bist Du ohne künstlichen PK natürlich schneller, da kein weiterer Index verwaltet werden muss. Umgekehrt ist ein Lookup mit einem geeigneten PK sehr viel effizienter als mit einem zusammengesetzten PK oder einem ungünstigen PK.
 

J90

Aktives Mitglied
Ok, danke für die Antwort.
Damit werde ich es am besten so lassen wie es nun ist. Da es sehr viele Tables betrifft musste ich mir Gedanken machen..
 

FrittenFritze

Mitglied
Zum "autoincrement(int)" als PK: bitte gewöhne es Dir ab, ein INT als PK zu nehmen, das macht Dir jeden Index "kaputt". Warum das so ist, erkennst Du, wenn Du Dir den Aufbau eines B-Tree-Indexes anschaust. Für PKs nimmt man eine sys_guid, bzw. in MySQL nennt sich das Ding UUID().

Nun zu Deiner Frage: die PKs haben normalerweise keine fachliche Bedeutung und dienen nur dazu einen Datensatz zu identifizieren, nicht mehr und nicht weniger, also ein künstlicher Schlüssel, wie mihe7 es schon sagte.

Warum hast Du Date und Time getrennt? Das date() ist doch mit der Uhrzeit in MySQL?

Zusammengesetzt unique Indexes sind absolut okay, solange sie NICHT als Filter- oder Joinkriterium verwendet werden. Das hat was mit dem Zugriffspfad zu tun, ob ein Index-Skip-Scan stattfindet oder nicht.
 

Thallius

Top Contributor
Zum "autoincrement(int)" als PK: bitte gewöhne es Dir ab, ein INT als PK zu nehmen, das macht Dir jeden Index "kaputt". Warum das so ist, erkennst Du, wenn Du Dir den Aufbau eines B-Tree-Indexes anschaust. Für PKs nimmt man eine sys_guid, bzw. in MySQL nennt sich das Ding UUID().

Die gibt es aber erst seit mySQL v8. Ich glaube 99% aller aktiven mysql DB's sind deutlich daruntern angesiedelt :)

Gruß

Claus
 

Thallius

Top Contributor
Was hat der B-Tree damit zu tun?

Zumal es jahrzente auch mit INT geht ist mir das auch ein wenig scheleirhaft wieso das jetzt plötzlich Baeh sein soll nur wein ein neuer Typ dafür eingeführt wurde der intern sicher auch nur auf int abgebildet wird (Alles andere würde ja performance kosten)

Aber ich lasse mich gerne eines besseren belehren.

Claus
 
X

Xyz1

Gast
INT verwenden, keine esoterischen Schlüssel verwenden und nicht unbedingt auf die (Troll) Antwort von Fritten befolgen, das wäre meine Meinung.
 

mrBrown

Super-Moderator
Mitarbeiter
Das sagen MySQL-Entwicker dazu:

https://mysqlserverteam.com/mysql-8-0-uuid-support/ hat gesagt.:
Disadvantages:
[...]
– performance issues: mainly because of the size and not being ordered

[...]
This will have a significant performance impact, since the values will be inserted in random locations in the index tree which will require a lot of IO when the index tree will not fit in memory anymore.


UUID hat durchaus Vorteile, aber das int den Index negativ beeinflusst wäre mir neu...



INT verwenden, keine esoterischen Schlüssel verwenden und nicht unbedingt auf die (Troll) Antwort von Fritten befolgen, das wäre meine Meinung.
UUIDs sind alles andere als "esoterisch", und mit Troll-Vorwürfen solltest grade dazu vorsichtig sein ;)
 
X

Xyz1

Gast
Nein, mir ist es egal wenn eine Antwort inhaltlich Sch*** ist, dann sage ich das auch. esoterisch bezog sich auf zusammengesetzte Schlüssel mit denen man nichts anfangen kann.
 

FrittenFritze

Mitglied
Was hat der B-Tree damit zu tun?

Wie ist ein B-Tree aufgebaut?
Wo werden im B-Tree neue INT-Werte angehängt?

Zumal es jahrzente auch mit INT geht ist mir das auch ein wenig scheleirhaft wieso das jetzt plötzlich Baeh sein soll nur wein ein neuer Typ dafür eingeführt wurde der intern sicher auch nur auf int abgebildet wird (Alles andere würde ja performance kosten)

Aber ich lasse mich gerne eines besseren belehren.

Claus

Das ist nicht "jetzt plötzlich bäh", es war schon immer scheisse, die INTs als Schlüssel zu verwenden. Die UUIDs gibt es schon ewig, zumindest bei richtigen RDBMS, wenn bei MySQL es neu ist, dann ist es sehr traurig.

Nach einer gewissen Zeit (bzw. größe der Tabelle) ist der Index "kaputt" und langsam. Genau das passiert bei UUIDs nicht. Aber UUIDs scheinen bei MySQL ein Problem zu sein, wenn das Schreiben im Index "a lot of I/O".

@mihe7: Ein Index ist ein binärer Baum, also ein B-Tree. Habe gerade gesehen, dass MySQL auch ein Hash-Index hat, der ist nicht gemeint. Aber danke, dass Du nochmal drüber nachgedacht hast :)

@Tobias-nrw: Ich betreue seit 17 Jahren Oracle Datenbanken. Die größte (DWH) hat gerade ca 50TB Laufzeitdaten und nochmal 150TB Archivdaten. Wenn Du die Antwort nicht verstehst, ist sie nicht scheisse.
 

mrBrown

Super-Moderator
Mitarbeiter
Nach einer gewissen Zeit (bzw. größe der Tabelle) ist der Index "kaputt" und langsam. Genau das passiert bei UUIDs nicht.
Deine Aussage erklärst du nicht, indem du sie wiederholst :) warum wird das denn mit Ints langsamer?


Aber UUIDs scheinen bei MySQL ein Problem zu sein, wenn das Schreiben im Index "a lot of I/O".
Ich würde bei anderen DBs das gleiche erwarten (wie relevante das jeweils bei int vs uuid ist, vermag ich nicht zu beurteilen.

Abgesehen von der Größe: Bei ints liegen Daten, die „nah beieinander liegen“ (hintereinander eingefügt, in diesem Fall dann vermutlich auch Zeitstempel nah beieinander), auch im Index nah beieinander, mit UUIDs sind die zufällig verteilt (korrigier mich, falls das nicht stimmt.)
Daten nah beieinander schreiben sollte schneller sein, als Daten weit entfernt zu schreiben, und fürs lesen ebenso, oder nicht?

Index ist ein binärer Baum, also ein B-Tree.
andersrum gilt das aber nicht, B-Tree meint nicht zwingend Binär-Baum. Afaik nutzt MySQL (zumindest InnoDB) auch B+-Trees.
 
X

Xyz1

Gast
Ich betreue seit 17 Jahren Oracle Datenbanken
Ist doch ok, aber Dein Auftreten hier macht nicht gerade den seriösesten Eindruck.

Hier ist ein bisschen Theorie:
 

mihe7

Top Contributor
Deine Aussage erklärst du nicht, indem du sie wiederholst :) warum wird das denn mit Ints langsamer?
Vermutlich geht es um die schlechten ca. 50 % Füllgrad, die im nackten B-Tree durch Einfügen aufeinanderfolgender Werte erreicht wird und die daraus resultierende Höhe.

andersrum gilt das aber nicht, B-Tree meint nicht zwingend Binär-Baum.
Ein Binärbaum meint auch nicht zwingend einen B-Tree :)
 

vish234

Mitglied
It's probably about the bad 50% fill level that is achieved in the bare B-Tree by inserting consecutive values and the resulting height.


A binary tree does not necessarily mean a B-tree either:)
Correct a B-tree and binary tree differ in that the B-tree is required to have all of its child nodes on the same level, but the binary tree is not. The maximum number of nodes or subtrees in a binary tree is 2, whereas the maximum number of nodes or subtrees in a B-tree is M, where M is the order of the B-tree.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
Juelin MySQL Datenbankmit glassfish und Netbeans Datenbankprogrammierung 18
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
Warum funktioniert MySQL nicht Datenbankprogrammierung 8
M MySQL Datenbank in Array Datenbankprogrammierung 2
P MySQL- Neues Passwort Datenbankprogrammierung 1
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
sserio SQL oder MySQL Datenbankprogrammierung 44
OnDemand Mysql Query Builder Datenbankprogrammierung 1
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
yakazuqi MySQL MySQL Connection reset Datenbankprogrammierung 7
OnDemand MySql Foreign Key nötig oder unnötig Datenbankprogrammierung 3
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
OnDemand MySQL und mongoDB wann macht was Sinn? Datenbankprogrammierung 11
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
D MYSQL goorm IDE - Wie speichern? Datenbankprogrammierung 0
OnDemand Mysql UPDATE if condition Datenbankprogrammierung 14
D MySQL Geburtsdatum per KW abfragen Datenbankprogrammierung 1
C Java MySQL check if value exists in database Datenbankprogrammierung 2
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
ruutaiokwu MySQL: Messwerte, welche stagnieren interpolieren? Datenbankprogrammierung 2
S Datenbank MySQL und Java Datenbankprogrammierung 8
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
J MySQL MySQL Risiken bei Stromausfall minimieren Datenbankprogrammierung 9
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
D MySQL Connection richtig herstellen. Wie ? Datenbankprogrammierung 7
D Multiple Connection mit MySQL Datenbankprogrammierung 4
D MySQL Eibinden des "mysql-connector" in eine fertige Jar Datenbankprogrammierung 3
L MySQL Android zu externer MySQL Datenbank verbinden Datenbankprogrammierung 5
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
D MySQL Zeilen kumulieren Datenbankprogrammierung 8
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
K Servlet-MySQL DB Datenbankprogrammierung 2
X MySQL Json String in MySQL einfügen. Datenbankprogrammierung 20
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
D Datumsformat aus MySQL ändern Datenbankprogrammierung 15
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
K MySQL LAN-MySQL Server mit XAMPP Datenbankprogrammierung 2
R ERModel der Datebanken (ORACLE,MySQL,MS-SQL usw) Datenbankprogrammierung 4
X MySQL In MySQL Funktionen erstellen, wenn Zelle leer dann andere Zelle ändern? Datenbankprogrammierung 9
K Anfängerfrage CSV in MySQL Datenbankprogrammierung 41
I MySQL Wert nachträglich bearbeiten Datenbankprogrammierung 1
N MySQL Datenbank lokal Datenbankprogrammierung 3
B MySQL: Port ändern über GUI? Wo und wie Port ändern? Datenbankprogrammierung 0
B MySQL installieren - silent / User anlegen Datenbankprogrammierung 3
X MySQL Verbindungdsaufbau MySql auf Ubuntu-Server Datenbankprogrammierung 10
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
P MySQL JPA / MySQL - Fehler bei type=innoDB Datenbankprogrammierung 8
M MySQL MySQL DATETIME-Import Datenbankprogrammierung 9
P MySQL Connection Global Datenbankprogrammierung 13
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
P MySQL-Verbindung in anderer Klasse nutzen Datenbankprogrammierung 2
D JavaFX Anwendung zugriff auf MySQL DB. Datenbankprogrammierung 2
D MySQL Grundsätzliche Fragen zu MySQL Datenbankprogrammierung 3
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
M MySQL-Syntax-Fehler Datenbankprogrammierung 1
M In MySql Datenbank schreiben Datenbankprogrammierung 6
D mySQL Timestamp in RegularTimePeriod bzw Second Datenbankprogrammierung 3
H SHOW Tables in Java/MySQL Datenbankprogrammierung 8
windl MySQL und HSQLDB Datenbankprogrammierung 4
S Anbindung zur mysql von mit Swing und AWT Datenbankprogrammierung 22
F MySQL+ Netbeans: Datenbanken mit Automatisch generierten Entity Classes get und set Datenbankprogrammierung 2
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
C MYSQL kann wert nicht eintragen Datenbankprogrammierung 3
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
F BPlaced MySql Datenbank ansprechen Datenbankprogrammierung 5
S MySQL MySQL will einfach nicht, bitte um Rat Datenbankprogrammierung 4
M MySQL Datenbank durchsuchen Datenbankprogrammierung 5
Z MySQL mysql Facharbeit: Tipps und Ideen gesucht Datenbankprogrammierung 5
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
K MySQL Datenbank 2facher Zugriff Datenbankprogrammierung 1
Z MySQL Shopsystem mit mysql und Java Datenbankprogrammierung 8
S [MySQL] Topliste Datenbankprogrammierung 2
H Datenbank-Anbindung Java/MySQL Datenbankprogrammierung 2
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
J Dateien in MySQL speichern & indizieren Datenbankprogrammierung 2
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
K MySQL Datenbankbackups Datenbankprogrammierung 5
P MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code Datenbankprogrammierung 3
kaoZ HyperSQL vs. MYSQL Datenbankprogrammierung 4
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
V Internationalization mit MySql Datenbankprogrammierung 1
K Adressverwaltung mit MySql und Java? Datenbankprogrammierung 11
M Java Mysql verbinden Datenbankprogrammierung 3
L Zugriff auf lokal gespeicherte mySQL Datenbank Datenbankprogrammierung 3
L MySQL App/Java Zugriff auf Mysql-DB funktioniert nicht Datenbankprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben