PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   SQL / Datenbanken (https://www.php-resource.de/forum/sql-datenbanken/)
-   -   Große DB (https://www.php-resource.de/forum/sql-datenbanken/89497-grosse-db.html)

devas 15-01-2008 18:08

Große DB
 
Hallo,

ich habe eine Tabelle die immer weiter anwächst und nun bald 1 GB Daten enthält und mehere 100K Datensätze.

Seit geraumer Zeit stelle ich fest das eine Abfrage immer länger dauert.

Meine Frage: Das die Abfrage länger dauert liegt es an der fülle der Daten, der Anzahl der Datensätze oder doch ehr am Server?

Ich weis nicht genau ob die Frage hier hingehört.

IchBinIch 15-01-2008 18:13

Das kann man pauschal nie beantworten.

Aber eine Wechselwirkung:
Menge der Daten <=> Serverausrüstung
kann wohl niemand abstreiten.

Mit steigenden Daten sollte natürlich auch der Server gesteigert werden. Somit fällt es schwer zu sagen, was "schuld" ist.

Oft liegt es aber einfach am DB-Layout. ;)

unset 15-01-2008 18:15

Re: Große DB
 
Zitat:

Original geschrieben von devas

Meine Frage: Das die Abfrage länger dauert liegt es an der fülle der Daten, der Anzahl der Datensätze oder doch ehr am Server?

Preisfrage: Wo ist der Unterschied zwischen "die Fülle der Daten" und "die Anzahl der Datensätze"?

Jedenfalls: Evtl. ist die Tabelle nicht optimal indiziert. Wenn du zum Beispiel in einer Adressdatensatztabelle einen Index auf die Hausnummer legst, aber stets nach PLZ selectest, ist es kein Wunder, dass es irgendwann mal lange dauert.

Wobei ich natürlich auch nicht ausschließen will, dass es an der Hardware liegt. Vor allem vServer werden da gerne und schnell zickig.

devas 15-01-2008 18:25

Mit fülle meine ich Menge in KB.

Beispiel:

Taballe hat 100k Zeilen mit insgesammt 500MB Platzbedarf.

Oder Tabelle hat 100k Zeilen mit 100MB Platzbedarf.

Was ist entscheident? Die Anzahl der Zeilen oder der Platzbedarf.




Verstehe ich es richitg das man den Index auf das legen sollte, wonach am meisten selectet wird?

arkos 15-01-2008 18:25

du könntest auch anfangen, deine riesentabelle in mehrere untertabellen zu zerlegen. ist ein gängiges mittel...

zb wenns ne usertabelle ist, nimmst du anfangsbuchstaben. so haste aus einer großen tabelle schon 26 kleine gemacht, was die gezielte abfrage bannig schneller werden lässt...


edit:
Zitat:

Original geschrieben von devas
Verstehe ich es richitg das man den Index auf das legen sollte, wonach am meisten selectet wird?
ja.

unset 15-01-2008 18:35

Zitat:

Original geschrieben von devas
Verstehe ich es richitg das man den Index auf das legen sollte, wonach am meisten selectet wird?
Genau. Du kannst aber auch mehrere Spalten indizieren. Jetzt komm aber bloß nicht auf die Schnapsidee, jede Spalte zu indizieren, das hat natürlich den selben Effekt, als wäre gar keine indiziert - unter Umständen hast du sogar einen negatven Performanceeffekt.

devas 15-01-2008 18:41

Wenn ich jetzt, wo die Datenbank gefüllt ist, den index noch setze oder ändere bleibt das ohne Folgeschäden?

unset 15-01-2008 18:44

Um einen Index zu setzen ist AFAIK ein ALTER TABLE notwendig. Das ist auf große Tabellen immer eine langwierige Geschichte. Wenn du am DB-Design rumfummelst solltest du ohnehin unmittelbar vorher ein Backup machen und ggf. Teilbereiche deiner Anwendung, die mit diesen Daten arbeitet nicht zugänglich machen (um Datenverlust weiter zu minimieren). Daraus alleine resultiert also schon, dass du das ganze eher zu einem Zeitpunkt machen solltest, wo deine Applikation kaum oder sogar gar nicht beansprucht wird. IdR also Nachts zwischen 2 und 5 Uhr.

Edit: Jetzt habe ich deine Frage gar nicht beantwortet: Ja, ein ALTER TABLE ist "ohne weiteres" auch möglich, wenn die Tabelle bereits Daten enthält ;)

devas 15-01-2008 18:59

Nur damit wir von dem selben sprechen.

Wenn ich eine Tabelle erstelle ist das rote dann der festgelegte index auf Datum.

CREATE TABLE `tabelle` (
`id` int(11) NOT NULL auto_increment,
`datum` varchar(50) collate latin1_general_ci NOT NULL,
.
.
.
.
.
.
.
PRIMARY KEY (`id`),
KEY `datum` (`datum`)
)

Abraxax 15-01-2008 20:15

ja

arkos 16-01-2008 11:04

und für bestehende tabellen (wie du sie hast):

Code:

ALTER TABLE `tabelle` ADD INDEX my_index (datum)

zum nachlesen:
http://dev.mysql.com/doc/userguide/e...ter-table.html


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:56 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG