URL: https://www.overclockers.at/coding-stuff/php_geschwindigkeit_arrays_vs_mysql_db_145025/page_1 - zur Vollversion wechseln!
Ich hätt ne grundlegende frage.
angenommen wir ham ne tabelle mit ein paar 1000 einträgen (id, name).
anschließend nen string wie zb.. 11/3452/984/209. Diese zahlen sind alles IDs obriger Tabelle. Was ist da schneller? Vorher die ganze tabelle in ein array verfrachten und dann über das zugreifen? Oder doch lieber jede zahl mittels sql query abfragen...
i mein klar, es hängt auch davon ab wie stark die db belastet ist,...
danke & mfg.
Deine Fragestellung ist mehr als unklar.
Du hast eine Table und ein String - ok, das sind Datenstrukturen und die haben keine "Geschwindigkeit" wenn nichts damit gemacht wird.
Wenn viele User das Array benutzen wirst du Probleme mit dem RAM bekommen. Es kommt halt auf die anzahl der User an.
Zitat von semteXanschließend nen string wie zb.. 11/3452/984/209. Diese zahlen sind alles IDs obriger Tabelle. Was ist da schneller? Vorher die ganze tabelle in ein array verfrachten und dann über das zugreifen? Oder doch lieber jede zahl mittels sql query abfragen...

Ich hab so aehnliche Aufgaben auch schon mal gehabt. Bei mir war entscheidend dass es oft vorkam, dass die gleichen IDs (11/2134/...) bei mehreren Datensaetzen vorkamen. Da war es ohne Umschweife schneller, alles in ein Array zu lesen und dann per $array[$index] zuzugreifen. Sind die Gesamtdaten sehr gross, ist dass dann vielleicht wieder doch nicht so g'schickt. Bei paar 1000 Eintraegen hoehrt sichs net problematisch an. Mach halt Tests mit CLI-Version und schau auf den Speicherverbrauch.
das wär genau das, was ich brauchn würde. kannte das "in" beim select gar ned..Zitat von rettichwarum jede zahl? was genau willst du mit dem ergebnis machen?
mit genau einer zeilen kannst du den string "11/2134/345..." so zersplitten, dass du ein
select * from table where id in (11,2134,23...)
machen kannst. und das liefert dir in einem einzigen select statement alle passenden einträge zurück.

Also ich würds vielleicht so machen:
Du hast 2 Tabellen, eine speichert die Verzeichnisse, eine die Dateien, beispielsweise:
Verzeichnisse := _id_, path
Dateien := _id_, dir_id, name
Inhalte beispielsweise:
Code:Verzeichnisse: id | path ---+----- 1 | eigene dateien/hans 2 | eigene dateien/hans/wurst 3 | eigene dateien/hans/marmelade ... Dateien: id | dir_id | name ---+--------+----- 1 | 1 | lala.jpg 2 | 1 | bubu.jpg 3 | 2 | lala.jpg ...
diese möglichkeit ist sicher schneller, aber wiederum nicht das optimum an "platzersparniss".
in deinem beispiel würde 3x "eigene dateien", 3x "hans" in der tabelle stehen (eben für jeden unterordner alles 1x..)
bei mir wärs nur 1x eigene dateien, 1x hans, 1x wurst, 1x marmelade
IN() -> http://dev.mysql.com/doc/mysql/en/c...-operators.html
"Optimum" an Platzersparnis wär aber ein "Objektorientierter" Ansatz... (beware tha quotation)
Code:dirs ([u]dirID[/u], parentID, name) files ([u]dirID, name[/u])
Zitat von semteXdiese möglichkeit ist sicher schneller, aber wiederum nicht das optimum an "platzersparniss".
Hab gestern noch ein bissi herumgespielt => 50k "file einträge" brauchn in der DB ca 2 MB... antwort: nein. Das ganze ist eh eher a bissi zum "lernen" gedacht.Zitat von thatIst das bei deinen Datenmengen in dieser Anwendung wirklich das Ziel, auf das du hinoptimieren solltest?
wie wärs mit einer intersection table?
speichere filme und speicherorte extra. für jeden film und für jeden möglichen speicherort jeweils einen eintrag. in der intersection table hängst du die zwei zusammen - also film1 zu ort1, film2 zu ort2, film3 zu ort1, film4 zu ort3 usw
so kannst du, wenn du einen film anlegst, prüfen, obs den speicherort schon gibt. wenn ja, einfach ID vom speicherort holen und gemeinsam mit der film-ID in die intersection table schreiben. wenns den speicherort noch nicht gibt, legst den zuerst neu an und nimmst dann erst die ID und schreibst die mit der film-ID in die DB.
so hast jeden speicherort und jeden film nur einmal in der DB abgelegt und sparst platz. die abfrage über "wo liegt welcher film" kriegst über ein statement mit zwei joins (film join intersection join speicherort) zurück.
sorry hab ich da grad was besonderes überlesen oder ist das wirklich nur eine n:m beziehung in Worten erklärt?Zitat von rettichwie wärs mit einer intersection table?
speichere filme und speicherorte extra. für jeden film und für jeden möglichen speicherort jeweils einen eintrag. in der intersection table hängst du die zwei zusammen - also film1 zu ort1, film2 zu ort2, film3 zu ort1, film4 zu ort3 usw
so kannst du, wenn du einen film anlegst, prüfen, obs den speicherort schon gibt. wenn ja, einfach ID vom speicherort holen und gemeinsam mit der film-ID in die intersection table schreiben. wenns den speicherort noch nicht gibt, legst den zuerst neu an und nimmst dann erst die ID und schreibst die mit der film-ID in die DB.
so hast jeden speicherort und jeden film nur einmal in der DB abgelegt und sparst platz. die abfrage über "wo liegt welcher film" kriegst über ein statement mit zwei joins (film join intersection join speicherort) zurück.

Zitat von watchoutsorry hab ich da grad was besonderes überlesen oder ist das wirklich nur eine n:m beziehung in Worten erklärt?

ZitatDas ist aber eigentlich eine 1:n Beziehung, deswegen braucht man keine Intersection Table und spart noch mehr Platz
paths (pathID, path)
files (pathID, filename)
hier ist kein pfad doppelt... oder irre ich mich?
das is aber alles egal, weil imho ist die Platzersparnis in keiner relation zum Performanceunterschied allein der join der notwendig ist, macht alles zunichte - deswegen ist die einzige Möglichkeit, die Sinn macht:
files (path_filename)
auch wenn statt 3MB vielleicht 4MB verbraucht werden...
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026