Datenbank mit vielen vielen Tabellenzeilen



  • Ich habe ein Tabelle "Zeugs" die folgendermaßen aussieht:

    +----+-----------+------+
    | id | parent_id | name |
    +----+-----------+------+
    | 1 | 1 | bla1 |
    +----+-----------+------+
    | 2 | 2 | bla2 |
    +----+-----------+------+
    | 3 | 1 | bla3 |
    +----+-----------+------+
    | 4 | 2 | bla4 |
    +----+-----------+------+
    | 5 | 2 | bla5 |
    +----+-----------+------+

    D.h.: Ich habe zwei parent-Objekte die eine beliebige Anzahl an "Zeugs"-Objekten enthält. Angenommen diese Tabelle hätte nun zB 1Mio Einträge.

    Eignetlich möchte ich nur die 50 ersten Resultate wissen, d.h sowas wie
    "Gebe mir alle Zeugs-Daten für parent_id = 2 aber nur die ersten 50 Stück"

    Allerdings frage ich mich: Ist es aus Performance-Gründen egal ob ich ein "SELECT * FROM zeugs" mache? Ich meine, dann erhalte ich als Ergebnis eine Tabelle die wahrscheinlich 500000 Zeilen hat, obwohl ich nur die ersten 50 will. Ist das nicht übertrieben aus Performance Sicht?



  • Ist es in der Tat ...

    Nimm LIMIT 50 oder so.



  • Welches RDBMS?

    MSSQL hat kein LIMIT.
    Hier gibt es TOP.

    MySQL kennt LIMIT.

    Es ist nicht egal ob du die Ausgabe limitierst.
    Das RDBMS hört bei LIMIT/TOP auf weiter zu suchen.
    Wenn du übers NETZ abfragst dann braucht auch nur das übertragen zu werden was angefordert wird was Bandbreite schont.



  • MySQL



  • Mein Problem ist folgendes: Ich habe eine Tabelle mit sehr vielen Einträgen. Es wird immer gespeichert, wann eine Zeile zuletzt bearbeitet wurde (Datum). Wenn ich die Tabelle abfrage, dann sollen nur die 50 zuletzt bearbeiteten Zeilen chronologisch geordnet angezeigt werden.

    Meine Idee wie man es machen könnte aber ich nicht weiss ob es das gibt:
    Wenn eine Zeile (zB die 1000te) bearbeitet wurde, dann soll diese automatisch anschließend an die erste Zeile der Tabelle wandern, so dass sie die erste Zeile in der der Tabelle "select * from table" ist.

    Dann könnte ich mit "SELECT * FROM myTable LIMIT 50;" immer die aktuellsten Zeilen laden.



  • Mit ner Sortierung sollte es doch gehen:

    SELECT <columns>
    FROM   <table>
    ORDER  BY <datum_aenderung> DESC
    LIMIT  50
    


  • Ja, das hab ich mir auch schon gedacht. Aber dann muss die Datenbank intern trotzdem wieder alle zB 1Mio Zeilen miteinander vergleichen und das kostet ja wieder viel Zeit?



  • Wenn du einen Index auf dem Aenderungsdatum hast, sollte eigentlich kein Full-Table-Scan erforderlich sein (ich weiss aber nicht wie intelligent MySql da ist).



  • Selbst wenn MySQL da ziemlich dumm sein sollte. Ein Index ist und bleibt ein Index und ist im Regelfall als balanzierter Binärbaum implementiert. Sprich, das Suchergebnis sollte sehr schnell geliefert werden. Ohne Millionen Vergleiche...



  • nimm dir doch ein mysql-frontend (z.B. phpmyadmin) und lass dir die verarbeitungdauer anzeigen.. einen mysql-Befehl sollte es dafuer auch geben (den ich aber grad aus dem Stegreif nicht weiss)



  • EXPLAIN


Anmelden zum Antworten