Moin!
Nehmen wir an, ich bin bei einem Wald- und Wiesenprovider. Da hat man ja mittlerweile auch keine Begrenzung wie früher der Datenbank mehr. Eine Datenbank kann da ja lockere hunderte von MB umfassen. Entsprechend kann man ja auch mehrere CMS in einer Datenbank laufen lassen.
Vom Prinzip her dürfte es ja auch zu keinem Performance Verlust führen oder? Wenn eine Seite z.B. gleichzeitig 100 Besucher drauf hat und da läuft eine Datenbank und ich habe 3 CMS in einer Datenbank und habe 3 x 5 Besucher, dürfte der Datenbankzugriff ja nicht langsamer sein, nur weil ich mehrere CMS in einer Datenbank nutze oder?
Ich kann nur über MySQL reden.
Als allererstes aber: Zumindest mit MySQL gibt mindestens vier Ebenen der Aufteilung. Die höchste Ebene ist "der Datenbankserver". Auf dieser Ebene ist selbsterklärend, dass eine Trennung der Speicherorte für zwei Projekte auf zwei unterschiedliche Maschinen auf der einen Seite sofort doppelte Performance bringt (jedes Projekt hat einen Server exklusiv), auf der anderen Seite aber das projektübergreifende Zugreifen auf die Daten schwieriger macht (wie andernorts schon erwähnt: JOINs gehen nicht, zumindest nicht auf Serverseite).
Wenn allerdings nur ein Server im Spiel ist, ist in MySQL kein Unterschied mehr in den darunterliegenden Schichten: Das, was man als "Datenbank" bezeichnet, ist nur ein logisch abgegrenzter Bereich, eine Sammlung von Tabellen, genauso wie eine Tabelle nur eine Sammlung von Spalten ist.
Es macht auf Zugriffsebene keinen Unterschied, ob ich die Tabellen eines Projekts mit Tabellenprefix in derselben Datenbank ablege, oder in eine andere Datenbank. Sofern innerhalb von MySQL keine einschränkenden Zugriffsrechte eingetragen sind (dieser Teil der Datenbankfähigkeiten fällt immer unter den Tisch, weil alle Welt immer nur mit "dem einen DB-User" auf die DB zugreift - dabei kann man sehr feingranular einstellen, welcher User was genau darf), ist es egal, ob zwei Tabellen in derselben Datenbank liegen, oder nicht. JOINs zumindest gehen.
Jetzt bleibt nur noch die Frage der Performance. MySQL bietet genau zwei praxisrelevante Storage-Engines an: MyISAM und InnoDB. MyISAM möchte man eigentlich nicht mehr verwenden, weil bei Schreibzugriffen auf eine Tabelle die gesamte Tabelle für Lesezugriffe gesperrt wird (bei InnoDB wird nur der zu ändernde Datensatz gesperrt). Das sorgt bei hoher Auslastung und wechselseitigen Schreib- und Lesezugriffen für enorme Wartezeiten des einzelnen Zugriffs. Außerdem kann MyISAM keine Transaktionen. Wenn man sich die technische Realisierung des DB-Speicherns ansieht, wird man feststellen, dass MySQL in seinem Datenverzeichnis pro Datenbank einfach ein neues Verzeichnis anlegt und pro Tabelle darin einen Satz von drei Dateien.
Eine Mischung von Tabellen zweier Projekte in derselben Datenbank hat also zur Folge, dass mehr Dateien in einem Verzeichnis liegen. Umgekehrt würde der Zugriff auf Dateien in zwei Verzeichnissen erfolgen. Diese technische Realisierung sieht auf den ersten Blick nicht so aus, als ob sie irgendeinen Performanceeinfluss hat. (Außer natürlich, man legt die zwei Verzeichnisse durch Mounten auf zwei unabhängige Festplatten - das erhöht den I/O-Durchsatz pro Datenbank. Genausogut kann man aber auch RAID-0 einsetzen, das erhöht den Durchsatz auch dann, wenn nur eine Datenbank benutzt wird, auf's doppelte.)
Nutzt man InnoDB, landen alle Daten in wenigen, großen Dateien, die von der InnoDB-Storage-Engine verwaltet werden - egal in welcher Datenbank die Tabelle liegt. Auf technischem Level ist hier also kein Unterschied zu merken.
Bleiben als intransparenter Einflussfaktor nur noch die in dem DB-Server selbst anfallenden Verwaltungsaufgaben. Es könnte ja beispielsweise sein, dass das "Öffnen" einer Datenbank bzw. das fortwährende Wechseln zwischen zwei Datenbanken viel mehr Performance kostet, als wenn die Tabellen alle in einer Datenbank liegen. Dafür kenne ich aber keine Hinweise. "Die Datenbank" ist eher eine Verwaltungsstruktur für den User oder Admin, auf technischer Ebene sind alles nur Tabellen. Darauf deutet ja auch Christians Hinweis mit Postgres hin, dass die Anzahl der Tabellen ein relevanter Faktor sind, denn für jede Tabelle hat der DB-Server Verwaltungsinformationen bereitzuhalten, mindestens mal das Wissen, dass die Tabelle existiert.
Wie immer bei einer Performance-Frage am Ende der Hinweis: Ohne Messwerte für den konkreten Anwendungsfall sind alle Aussagen Makulatur.
Wenn du in der Situation steckst, dass du zwei Projekte hast, die einfach so laufen und schnell genug sind, und dich fragst, wie du die auf dem Datenbankserver organisieren sollst: Organisiere sie so, dass du das Leben einfach hast.
Wenn du hingegen mit den Projekten an einer Leistungsgrenze steckst und dich fragst, ob das Verschieben von zwei Datenbanken in eine (oder umgekehrt das Trennen in zwei) mehr Performance bringt: Nein, die Auswirkungen sind mit Sicherheit so marginal, dass sich der Aufwand nicht lohnt. Was sich an der Stelle viel mehr lohnt: Analysieren, wo das Problem steckt. Datenbankabfragen sind oftmals nur deswegen langsam, weil sie nicht optimal programmiert wurden, bzw. weil notwendige Indices nicht definiert wurden.
Wenn alle Abfragen und Indices optimal sind, und es trotzdem zu wenig Power gibt, ist die Lösung vermutlich eher ein Trennen auf zwei Datenbankserver (womit als Konsequenz auch die Trennung in zwei Datenbanken einhergeht).
Befürchtest du, dass eines deiner Projekte irgendwann auf diese Weise abgespalten werden muss, wäre es allein aus organisatorischen Gründen ratsam, schon heute alle Tabellen in einer eigenständigen Datenbank zu haben. Diese komplette Datenbank könnte man dann bei Bedarf auf einen anderen Server schieben und relativ problemlos sofort nutzen.
Haben zwei Projekte jedoch aus Versehen einzelne gemeinsam genutzte Tabellen entwickelt, wäre die Trennung schwieriger.
- Sven Rautenberg