PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   DB verkleinern: jeden 2. Datensatz löschen (http://www.selfphp.de/forum/showthread.php?t=23644)

lasser 05.10.2010 10:38:11

DB verkleinern: jeden 2. Datensatz löschen
 
Moin!
Gibt es die Möglichkeit per SQL jeden 2. Datensatz bedingungslos zu löschen?
Hintergrund: Ich logge unsere PV-Anlage alle 30 Sekunden, aber das doppelte Intervall würde reichen. Den logger kann ich einfach umstellen, ich würd halt die Tabellengröße gern halbieren.

Die Tabelle sieht so aus (Ausschnitt):
Code:

created                        kdy        kmt        kyr        kt0        tnf        tkk        pac        prl        il1        idc        ul1        udc        sys
2010-09-12 08:25:39        3        194        639        639        5001        25        371        5        156        122        2339        3398        20008
2010-09-12 08:26:09        3        194        639        639        5000        25        389        5        165        124        2337        3445        20008
2010-09-12 08:26:39        3        194        639        639        5000        25        395        5        165        128        2346        3422        20008
2010-09-12 08:27:09        3        194        639        639        5003        25        408        6        170        131        2343        3412        20008
2010-09-12 08:27:39        3        194        639        639        5001        25        421        6        175        135        2349        3397        20008
2010-09-12 08:28:09        3        194        639        639        5000        25        432        6        181        138        2328        3417        20008
2010-09-12 08:28:39        3        194        639        639        5000        25        437        6        182        143        2337        3410        20008
2010-09-12 08:29:10        3        194        639        639        5001        25        453        6        189        144        2343        3463        20008
2010-09-12 08:29:39        3        194        639        639        5002        25        470        7        196        149        2341        3452        20008
2010-09-12 08:30:09        3        194        639        639        5001        25        486        7        202        154        2339        3433        20008

Bedingungslos löschen deshalb, weil der logger vor allem anfangs nicht alle 30, sondern alle 33 Sekunden Einträge gemacht hat, daher gibt es manchmal nur einen Eintrag pro Minute.

Gruß
lasser

thomas_w 05.10.2010 14:10:13

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Die Daten sind nach dem Timestamp (1. Spalte) sortiert vermute ich mal.

Gibt es in der Tabelle noch eine andere Spalte (z. B. ein Auto_increment Primary Key) in der Tabelle? Damit könnte man dann vielleicht eine einfachere Abhängigkeit für den DELETE erstellen, als mit dem Abstand der Timestamps voneinander.

Zeige doch mal

Code:

mysql>SHOW CREATE TABLE tabelle1
Grüße
Thomas

lasser 05.10.2010 14:23:07

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Moin!
ok, das sieht wie folgt aus:
Code:

CREATE TABLE `log` (
 `created` timestamp NOT NULL default CURRENT_TIMESTAMP,
 `kdy` int(11) NOT NULL default '0',
 `kmt` int(11) NOT NULL default '0',
 `kyr` int(11) NOT NULL default '0',
 `kt0` int(11) NOT NULL default '0',
 `tnf` int(11) NOT NULL default '0',
 `tkk` int(11) NOT NULL default '0',
 `pac` int(11) NOT NULL default '0',
 `prl` int(11) NOT NULL default '0',
 `il1` int(11) NOT NULL default '0',
 `idc` int(11) NOT NULL default '0',
 `ul1` int(11) NOT NULL default '0',
 `udc` int(11) NOT NULL default '0',
 `sys` int(11) NOT NULL default '0',
 PRIMARY KEY  (`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Gruß
lasser

thomas_w 05.10.2010 14:57:00

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Also ich mache "...jeden zweiten Datensatz löschen.." einfach an der Sekunde fest. Z.b. ":39". Die Suche wäre dann einfach so

Code:


SELECT DATE_FORMAT(created,'%s'), created FROM log
 WHERE DATE_FORMAT(created,'%s') = '39' ;


Wenn dass stimmt, dann geht das löschen z.B. so..

Code:

DELETE FROM log
 WHERE DATE_FORMAT(created,'%s') = '39' ;

Anschließend noch die Tabelle optimieren, sonst wird diese nicht "kleiner" was den Plattenplatz angeht.

Code:

ANALYZE TABLE log;
OPTIMIZE TABLE log;

Grüße
Thomas

lasser 05.10.2010 15:35:24

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Ah, ok. Ja, das würde gehen, wenn tatsächlich die Sekunden immer '39' wären. Sind sie aber nur in dem Ausschnitt :-(

Hm, andere Idee mit PHP und einer while-Schleife:

Code:

$result = @mysql_query("SELECT * FROM `tabelle1` WHERE created BETWEEN '$start' AND '$end'") or die(mysql_error());
$rest=0;
while($row = mysql_fetch_object($result))
{
  if($rest%2 == 0)
      {
      //Wie krieg ich den Datensatz in 'tabelle2' geschrieben? So:?
      @mysql_query("INSERT INTO `tabelle2` '$row'");
      }
  $rest++;
}

Würde das so gehen? Wenn ja, dann ließe sich ja auch jeder n-te Datensatz löschen :-)
Code:

if($rest%n == 0)
Gruß
lasser

thomas_w 05.10.2010 15:56:57

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Zitat:

Zitat von lasser (Beitrag 138371)
Hm, andere Idee mit PHP und einer while-Schleife:

Code:

$result = @mysql_query("SELECT * FROM `tabelle1` WHERE created BETWEEN '$start' AND '$end'") or die(mysql_error());
$rest=0;
while($row = mysql_fetch_object($result))
{
  if($rest%2 == 0)
      {

      // Hier müsste der DELETE hin
      // mysql_query("DELETE ...'");

      //Wie krieg ich den Datensatz in 'tabelle2' geschrieben? So:?
      // mysql_query("INSERT INTO `tabelle2` (col1, col2, ...) VALUES ( ....");

      }
  $rest++;
}


Also im Prinzip ja, Du kannst mit Modulo so jeden 2. oder X. Datensatz finden.

a) Den DELETE nicht vergessen
b) Den INSERT Befehl mal im Handbuch nachschauen
c) Am Besten auf den @ vor den MySQL Befehlen verzichten, sonst bekommt Du keine Fehler mit.
d) Stichwort "Transaktion". Falls das Skript abbricht, kannst Du das so nicht beliebig wiederholen.

Grüße
Thomas

Ckaos 06.10.2010 08:15:13

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Hi,

das geht auch mit mysql.

1. Primary key löschen (created)
Code:

ALTER TABLE `tabelle1` DROP PRIMARY KEY
2. Spalte id Primary auto increment erstellen
Code:

ALTER TABLE `tabelle1` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;
3. Jede 2. Zeile löschen
Code:

DELETE FROM `tabelle1` WHERE id%2=0
4. Spalte id löschen
Code:

ALTER TABLE `tabelle1` DROP `id`
5. Primary key anlegen (created)
Code:

ALTER TABLE `tabelle1` ADD PRIMARY KEY ( `created` )
fertig.

lasser 06.10.2010 09:04:03

[GELÖST]: DB verkleinern: jeden 2. Datensatz löschen
 
Moin!

Code:

ALTER TABLE `tabelle1` DROP PRIMARY KEY;#  Betroffene Datensätze:  681

ALTER TABLE `tabelle1` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;#  Betroffene Datensätze:  681

DELETE FROM `tabelle1` WHERE id%2=0;#  Betroffene Datensätze:  340

ALTER TABLE `tabelle1` DROP `id`;#  Betroffene Datensätze:  341

ALTER TABLE `tabelle1` ADD PRIMARY KEY ( `created` );#  Betroffene Datensätze:  341

Vielen Dank! Das klappt hervorragend!

Gruß
lasser

thomas_w 06.10.2010 14:13:17

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Zitat:

Zitat von Ckaos (Beitrag 138378)
Hi,

das geht auch mit mysql.

1. Primary key löschen (created)
Code:

ALTER TABLE `tabelle1` DROP PRIMARY KEY
...

Du greifst zwar heftig in eine fremde Tabellenstruktur ein, aber stimmt, so geht es auch.

Sehr gute Idee.

Grüße
Thomas

lasser 06.10.2010 15:21:12

AW: DB verkleinern: jeden 2. Datensatz löschen
 
Moin!

Keine Angst, STRG-C/V sind mir zwar ein Begriff, aber zwischen C und V liegt noch mein Hirn ;-)

Und ich verwende zum Testen solchen Krams immer nur nicht mehr benötigte Tabellen und habe vom Original mindestens ein aktuelles Backup. Wenn da was schief geht macht es nichts.

Gruß
lasser


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:27:10 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.