Count(*) <> angezeigte Anzahl Datensätzte in phpMyAdmin

schauan

Neuer Benutzer
Beiträge
4
Hallöchen,

im phpMyAdmin werden mir für eine Tabelle ca. 223k Datensätze angezeigt:
Zeige Datensätze 0 - 24 (221144 insgesamt, Die Abfrage dauerte 0.0006 Sekunden.)

gehe ich mit einem select count(*) ... über diese Tabelle, werden mir 270247 Datensätze angezeigt. Woher kommt dieser Unterschied?
 
Werbung:
Ursachen können sein von Abfrage in unterschiedlichen Transaktionen (falls die Engine diese unterstützt) bis hin zu Fehlern in MySQL. Die kann man ja auch nicht alle zählen ...
 
Hallöchen,

die 24 kommt nur von der Seitenanzeige im phpmyadmin, ebenso die Datensatzanzahl 221144.
Die 221144 ist hier der Punkt, die vom select count(*) mit 270247 stark abweicht.
Meine Forensoftware zeigt mir 270.072 posts an, wobei ich die kleine Differenz noch verschmerzen kann :).

Hintergrund meiner Frage ist eigentlich, dass ich die Ursache für unterschiedliche Größenangabe der Datenbank suche.
Strato schreibt in der Datenbankverwaltung, ich hätte 1,3 GB belegt. Schaue ich mir das im phpmyadmin an, bin ich bei ca. 540 MB.
In meinem Testforum habe ich 950 MB zu 428 MB, ... das ist ein älterer Stand des produktiven Forums.
Im Testforum hab ich entsprechend der Strato-Anleitung mal eine Optimierung mit ...ALTER TABLE... usw. durchgeführt. Ich habe mir dabei nur die Größe in der Datenbankverwaltung angeschaut, die hatte vorher 952 und ist um 2 MB auf 950 gesunken. Hat also kaum was gebracht.
 
Die 221144 ist hier der Punkt, die vom select count(*) mit 270247 stark abweicht.
Die Zählung der Rows einer Tabelle in einer Datenbank, die Transaktionen unterstützt, ist nicht trivial, weil Du zu jedem Datensatz prüfen mußt, ob dieser in der aktuellen Transaktion sichtbar ist. Damit erzwingt eine solche Abfrage immer einen Full-Table-Scan. Oft reicht eine grobe Schätzung, und dafür gibt es interne Statistiken, die man sehr schnell befragen kann.
 
wie akretschmer schon sagte gibt es datensätze die z.B. nicht sichtbar sind, da sie in einer ander Transaktion gelöscht wurden.

Dein GOAL wird aber wohl eher sein, das MySQL kein eintiges Byte an Speicher freigibt wenn du z.B. mit DELETE FROM ... Alle Zeilen löschen würdest.
MySQL würde zwar den freien Speicherplatz intern wieder für neue ROWS brauchen, aber auf Platte tut sich da gar nichts !!

Wenn du TRUNCATE table machst wird die Tabelle komplett gelöscht und neu erzeugt.
Erst dann siehst du mehr Speicher im System.

Dazu muss aber FILE_PER_TABLE auf 1 stehen, da sonst ALLE Tabellen in einer großen Datei gespeichert werden.
 
Hallöchen,

jupp, hab nach TRUNCATE gegoogelt und da stand nur der erste Teil - also es wird erst mal nur alles gelöscht. :-(

Bin zwar nicht ganz unbelesen was das Thema Daten(banken) und SQL betrifft, aber mein Part war bisher die Datenseite und nicht das Design und andere "Internas" usw.

Kann sein das ich Ende der 80er mit dBase auch mal ne DB angelegt habe. Da gab's nach dem Löschen von Datensätzen noch den Befehl PACK und alles war gegessen. Mit Clipper konnte man ausführbare Programme schreiben ... Disketten waren teilweise noch 8" groß und auf eine Wechselplatte, Durchmesser 37 cm, haben 1MB Daten gepasst :) Allerdings war die Hauptbeschäftigung CNC-Programmierung.
 
Werbung:
So, habe mal etwas weiter gesucht, mir die Tabellengrößen angeschaut
--> select table_name, data_length, data_free from information_schema.tables order by data_free desc
--> Ergebnisanzeige für 15 von 83 Tabellen
--> 4 Tabellen haben data_free 2097152 / 6 Tabellen haben 4194304
--> alle anderen haben data_free 0

Anschliessend die 10 Tabellen einzeln optimiert, z.B.
--> optimize table abcd_posts
Anschließend wieder die Größen angeschaut
--> 8 Tabellen haben data_free 2097152 / 2 Tabellen haben 4194304
--> Tabellengrößen (data_length) sind gleich geblieben

Ich habe dadurch anscheinend intern 6 MB gewonnen. Seltsamerweise habe ich laut Anzeige im Kundenlogin von Strato dadurch ca. 12 MB gewonnen, also ca. doppelt so viel.
In Summe macht dieser data_free aber nicht die große Differenz von über 500 MB aus - war intern ca. 28 und ist jetzt ca. 22 MB

Aufgefallen ist mir dabei, dass beim Versuch, alle Tabellen auszugeben ("Alle anzeigen" im phpMyAdmin), mir zusätzlich sehr viele Fehler blockweise ausgegeben werden. Die Blöcke beginnen damit:

Notice in ./libraries/classes/Display/Results.php#3143
Undefined index: table_schema

Die Fehler hab ich auch in der produktiven Datenbank, da tu ich aber vorerst "nur gucken, nicht anfassen" :)
 
Zurück
Oben