Wie viele Daten in Datenbak eintragbar?

supersoft

Grünschnabel
Hallo alle zusammen.

Ich wollte hier mal in die runde Fragen wie viele Daten eine Datenbank den Überhabut so bewältigen kann?
Es geht mir hier nicht um den Speicherplatz, sonden eher um die Performance,

Ich denke mal wenn so 50.000 Einträge in der DB drine sind, und da wird eine Suchabfrage gestarted kann das ganze doch schon ein Par sec dauern?

Und was kann man tun das die Datenbank das ganze schneller sucht und ausgibt?

Wobei ich denke das 50.000 Einträge ja keine Mänge sind?

mfg
sascha
 
Zuletzt bearbeitet:
Hallo, willkommen im Forum.

Also 50000 Datensaetze sind im Grunde ein Witz.
Von welchem Datenbanksystem sprichst Du denn eigentlich? Ich nehme mal an MySQL, oder?
Weil Du solltest Dir darueber im Klaren sein, dass es so einige Datenbanksysteme gibt, unter anderem z.B. MySQL, PostgreSQL und auch MSSQL.

Weiterhin moechte ich Dich darauf hinweisen Dich doch bitte an die Gross- und Kleinschreibung zu halten.
 
Danke Danke...

Ich werde den Beitrag gleich editiren. ;)
Das es da verschiedene DB Prorgamme gibt weis ich, aber ist das den wirklich ein SO großer Unterschied welches System man da wählt?

Aber wir können ja mal von MySQL ausgehen.
50.000 sind ein Witz... d.h. wenn die DB Duchsucht wird dauert es 1sec bis der Eintrag gefunden wird?
und bei 500.000? dauert es dann 10 sec? oder kann man das nicht so Hochrechnen?

Wie sieht es aus wenn aus den 500.000 Einträgen 1.000 Stück zusammengesucht werden müssen um diese Auszugeben?

Sorry das ich das hier jetzt mal so ales Fragen muss, aber ich kenne mich mit der Performance von DB Null aus :(.

mfg
sascha
 
Die Dauer der Suche hängt von mehreren Attributen ab:

1. Welcher Datentyp ist betroffen (eine Volltextsuche dauert natürlich länger als die Suche auf einen Integer wert)
2. Wie gut sind die Daten indiziert? (Gibt es überhaupt eine Indexierung)?
3. Wie gut sind die Suchalgorithmen (Bubble-Search etc.)
4. Was kann die Hardware?

Also Du kannst nicht wirklich sagen, wieviele Datensätze eine Datenbank (vielmehr eine Tabelle) verkraftet. Ich hab mal eine Studie von MySQL gelesen, dass der erste Performance-Bruch bei ca. 20. mio. Datensätzen kommt.... Aber das ist sicherlich auch nur eine Schätzung bzw. eine Messung bei exakt einem bestimmten System....

Aber wenn Du wirklich Tabellen verwalten willst, die > 20mio Einträge verwalten und indizieren sollen, würd ich mich mal auf die Suche nach einem High-End DBMS (Oracle etc.) und einem ordentlichen Cluster-System machen. Vorausgesetzt Du hast das nötige Kleingeld :)

Ciao,
Mike
 
So sehr hab ich mich auch noch nicht mit der Performance auseinandergesetzt da meine Datenbanken bisher nicht grad gross sind. Ein paar hundert Eintraege, auf der Arbeit komm ich langsam in Richtung 1000, aber alles laeuft wunderbar fix.

Ich hab vor einer Weile mal ein Benchmark-Script in PHP geschrieben, damit koenntest Du ja mal ein paar Tausend oder paar Millionen Datensaetze erstellen lassen wenn Du willst.
Du solltest aber die Benchmarks die nicht auf die Datenbank bezogen sind auskommentieren um nicht unnoetig Zeit zu verschwenden.
PHP:
<?php
function calctime($start,$end)
{
	list($msec,$sec)=explode(' ',$start);
	$start=(float)$msec+(float)$sec;
	list($msec,$sec)=explode(' ',$end);
	$end=(float)$msec+(float)$sec;
	$time=($end-$start);
	return $time;
}

function loop_bench($count=50000)
{
	echo '<tr><th colspan="2">Loops</th></tr>';
	$start=microtime();
	for ($x=0;$x<$count;$x++)
		{
			$b=$x;
		}
	$end=microtime();
	echo '<tr><td>FOR-Loop from 1 to '.$count.'</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	$x=0;
	while ($x<$count)
		{
			$x++;
		}
	$end=microtime();
	echo '<tr><td>WHILE-Loop from 1 to '.$count.'</td><td>'.calctime($start,$end).'</td></tr>';
}

function sql_bench($host,$username,$password,$rows=5000)
{
	echo '<tr><th colspan="2">MySQL</th></tr>';
	$db=mysql_connect($host,$username,$password);
	$start=microtime();
	mysql_query("create database benchtestdb",$db);
	$end=microtime();
	echo '<tr><td>Create database</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	mysql_select_db("benchtestdb",$db);
	$end=microtime();
	echo '<tr><td>Select database</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	mysql_query("create table benchtest (a INT(8) UNSIGNED NOT NULL,b INT(8) UNSIGNED NOT NULL,c INT(8) UNSIGNED NOT NULL,d INT(8) UNSIGNED NOT NULL,e INT(8) UNSIGNED NOT NULL)",$db);
	$end=microtime();
	echo '<tr><td>Create table</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	for ($x=0;$x<$rows;$x++)
		{
			mysql_query("insert into benchtest (a,b,c,d,e) values ('$x','$x','$x','$x','$x')",$db);
		}
	$end=microtime();
	echo '<tr><td>Write '.$rows.' rows</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	$result=mysql_query("select * from benchtest",$db);
	$end=microtime();
	echo '<tr><td>Query Table ('.$rows.' rows)</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	while ($row=mysql_fetch_assoc($result))
		{
			$b=$row;
		}
	$end=microtime();
	echo '<tr><td>Read '.$rows.' rows</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	mysql_query("drop database benchtestdb",$db);
	$end=microtime();
	echo '<tr><td>Drop database</td><td>'.calctime($start,$end).'</td></tr>';
	mysql_close($db);
}

function fs_bench($path,$bytes=50000,$dirs=1000)
{
	echo '<tr><th colspan="2">Files</th></tr>';
	$file=fopen($path."/benchtest.tmp","w");
	$start=microtime();
	for ($x=0;$x<$bytes;$x++)
		{
			fwrite($file,'x');
		}
	$end=microtime();
	echo '<tr><td>Write '.$bytes.' Bytes</td><td>'.calctime($start,$end).'</td></tr>';
	fclose($file);
	$file=fopen($path."/benchtest.tmp","r");
	$start=microtime();
	while (!feof($file))
		{
			$x=fread($file,1);
		}
	$end=microtime();
	echo '<tr><td>Read '.$bytes.' Bytes</td><td>'.calctime($start,$end).'</td></tr>';
	fclose($file);
	$start=microtime();
	unlink($path."/benchtest.tmp");
	$end=microtime();
	echo '<tr><td>Unlink file</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	for ($x=0;$x<$dirs;$x++)
		{
			mkdir($path."/benchtest".$x);
		}
	$end=microtime();
	echo '<tr><td>Create '.$dirs.' directories</td><td>'.calctime($start,$end).'</td></tr>';
	$start=microtime();
	for ($x=0;$x<$dirs;$x++)
		{
			rmdir($path."/benchtest".$x);
		}
	$end=microtime();
	echo '<tr><td>Remove '.$dirs.' directories</td><td>'.calctime($start,$end).'</td></tr>';	
}

echo 'PHP '.phpversion().'<br>';
echo '<table border="1">';
$start=microtime();
loop_bench();
sql_bench("host","user","passwort");
fs_bench("/tmp/benchpath");
$end=microtime();
echo '</table>';
echo 'Total benchmark: '.calctime($start,$end);
?>

Es macht uebrigens durchaus einen Unterschied welche DBMS (DataBaseManagementSystem) Du nutzt, vor allem beim Funktionsumfang und beim SQL-Dialekt, denn SQL ist nicht gleich SQL.
 
Ich danke euch beiden!
Das waren schon einmal wichtige Infos die ihr mir geben könntet. und den DB Benchmark werde ich Heute noch testen.

Aber vieleicht kann mir jemand ja hier eine empfelung geben.
Ich Plane ein Projekt wo jeder User der sich Anmeldet ca. 1000 Datensätze einträgt.
Da ich das ganze auf einen Stink Normalen Root laufen lasse, war ich mir halt wegen der DB Performance nicht ganz sicher (mal schauen was der Benchmark sagt ;) )
Ausdem hatte ich von Anfang an überlegt die Programierung so zu gestalten das jeder User eine XML Datei angelegt bekommt, (bei Anmeldung) wo die Daten die er eingibt abgespeichert werden.

Die Idee dahinter ist einfach das so keine "unmengen" von Daten aus der DB Duchsucht und Zusammengestelt werden müssen, sonden nur diese eine XML Datei aufgerufen wird.

Aber da die DB das ja eigendlich mit leichtigkeit verarbeiten können müsste, bin ich mir jetzt wieder unschlüssig.

mfg
sascha
 
Zuletzt bearbeitet:
Also "Nur die XML Files parsen" darfst Du nicht unterschätzen..
Ein DB Zugriff ist meist noch immer wesentlich schneller, als eine File-Operation.

Und:
Es wäre nicht schlecht die Anzahl der User (erwartet) anzugeben. Sinds nur 10, bist du bei nur 10.000 Datensätzen, sinds 100.000 würd ich mir mal Gedanken machen, wo Du mindestens 50.000 Euro für nen DBMS Cluster mit Oracle (o.ä.) herbekommst :) (Auch wenn das noch billig ist).

Aber welcher User legt selbständig 10.000 Datensätze an?
 
Das ein DB Zugriff schneller ist als ein File Zugriff wuste ich garnicht.
Was ich mir aber vorstellen kann das wenn das File was geöffnet werden soll
3-4-5 oder noch mehr MB hat (je nachdem wie groß die Mänge der Daten ist natürlich) und der User kein DSL hat könnte sich das ganz schön hinziehn.

Also ich Rechne so mit 1000-2000 Usern die alle so 300-1000 Einträge erzeügen. (Natürlich nicht ales auf einmal sonden ca. 3 Einträge am Tag).
Das wären dann maximal 2.000.000 Einträge.
Aber 50.000 € für ne DBMS Cluster mit Oracle habe ich dann leider doch nicht ;)
Zumal der Service Kostenloss sein wird/soll.

mfg
sascha
 
Also ein Oracle-Cluster ist ja nun gleich die teuerste Option und lohnt sich bei 2.000.000 Datensätzen überhaupt nicht.
Ich hab zwar keine Erfahrungen mit MySQL aber das sollte voll und ganz ausreichen, um diese Daten zu bewältigen (ordentliches Datenbank-Design vorausgesetzt)

Bei der Performance-Messung kommt es aber auch darauf wie du die Datensätze abfragst.
Select * from xyz kann man nicht wirklich als aussagekräftige Fehlermeldung nutzen.
Es hängt auch davon ab, was steht in der WHERE-Clause, wie schauen die JOINs aus, ....
Oracle hat zum Beispiel die Eigenart, dass es den IN-Operator schneller verarbeiten kann als der SQL Server von Microsoft (der SQL Server beachtet dabei die Indizes nicht).
Du solltest dich auf jeden Fall vorher über diverse DBMS genau informieren, wo deren Stärken und Schwächen liegen und dann entscheiden, was für dich in Frage kommt. Das setzt aber auch voraus, dass du genau weißt, was du vor hast.
 
kleiner erfahrungsbeitrag:

ich arbeite momentan mit mysql in einer großen Tabelle, die 26Mio Zeilen hat. Mit Index sind das ca. 1,7Gb Daten.
Das durchsuchen der Datenbank dauert bei gleichen Suchparametern bei der Erstausführung teilweise an die 10-15 sekunden. (dann wird wohl gechached, die selbe suche geht ab jetzt ganz flott.)

Die Zahl von Mik3e (20 Mio) könnten als "Grenze" also wohl hinkommen...

(unterm strich werden wir wohl wechseln müssen... hätt ich mich am anfang wohl doch für ein vernünftiges db-api entscheiden sollen; auf welches system wir wenn dann umziehen werden, weis ich noch nicht, vielleicht hat da jemand für mich auch ein paar tipps?)
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück