# MySQL - executeUpdate - Performance



## JayJay (1. Feb 2006)

Hallo,

ich habe momentan Problem mit der Performance. Wenn ich aus meiner MySQL tabelle 1.000 Zeilen lese ist das gleich eingelesen.

Nur wenn ich dazu, bei jedem ein Update ausführe, brauchen die Updates für alle 1.000 Zeilen ca. 40sec-1min.
Das ist doch deutlich zu lange??  

Das Einzige was ich tuhe ist, einen wert um 1 zu erhöhen, (bei allen). :
Ich wollte das ganze bei 50.000 Einträgen tun, das würde doch recht lange dauern.

Meine Rechnerleistung: AMD: 1800++, 512MBRam

ein bisschen Code:

```
try
		{
		ResultSet res = db.executeQuery("SELECT * FROM members");
		System.out.println("select => execute");
		
		
		
		while( res.next() )
		{
			String id = res.getString("id");
			String created = res.getString("created");
			//System.out.println(email);
			
			db.addBatch( "UPDATE members SET created="+created+1+" WHERE id="+id);
			
		}
		System.out.println("finished");
		}catch( Exception e){ System.out.println("Error:"+e.getMessage()); }

		// update
		db.executeBatch();		
		System.out.println(" updated ");
		
		db.closeConnection();
```

kann mir evt. jemand dafür einen optimierungstipp geben?


### :###


----------



## Bleiglanz (1. Feb 2006)

LOL

```
sql="UPDATE member SET created=created+1"
```


----------



## JayJay (1. Feb 2006)

Naja den beitrag hätteste dir vollkommen sparen können!


----------



## PoiSoN (1. Feb 2006)

Warum? Bleiglanz' Tip spart dir die Erzeugung von 2 Strings bei jedem der 50.000 Durchläufe . Du brauchst 
created doch nicht erst per Java in nen String einlesen, du kannst gleich die Tabellenspalte benutzen.

Ich weiß nicht wie viele Felder Tabelle members hat, aber da du ja eh nur die id zu brauchen scheinst, wäre es 
evtl. performanter "select id from members" statt "select * from members" zu sagen.


----------



## JayJay (2. Feb 2006)

Wie ich bereits mitgeteilt habe, ist mein problem nicht die select anfrage!!!

ICh habe ein Problem beim UPDATE!!!! 

PS: Das von Bleiglanz halt ich nicht wirklich als performance verbessernd. bei 50sec ausführungszeit reduzier ich dsa ganze um 1/5000


----------



## Bleiglanz (2. Feb 2006)

bin ich blöd?

du setzt 50000 einzelne UPDATE Befehle an die DB ab

mein Tipp ist nur einen einzigen Befehl abzusetzen, der alle 50000 Zeilen in der DB auf einmal ändert

lern erstmal SQL


----------



## Chris Baumann (2. Feb 2006)

Klingt für mich als wäre da eine stored procedure eleganter. Bleiglanz hat aber schon recht mit seinem post. 1 update ist sicherlich performanter als 50'000.


----------



## Bleiglanz (2. Feb 2006)

eine stored procedure "eleganter" als ein einziger bocksimpler SQL-Befehl?

?


----------



## Chris Baumann (2. Feb 2006)

Naja, hast schon recht   Kommt natürlich darauf an, was man machen will. ein einfacher increment einer variable macht natürlich keinen grossen sinn.  (würde aber zumindest verhindern, dass man durch falscheprogrammierlogik anfängt schleife nzu bauen wie oben vorgeschlagen)


----------



## JayJay (2. Feb 2006)

Naja, ich lese jeden Eintrag zeile für zeile aus, da jeder eintrag einzeln besonders bearbeitet werden muss.

Da kann ich leider nicht mit allgemeinen SQL querys kommen.


----------



## KSG9|sebastian (2. Feb 2006)

PreparedStatement ?


----------



## JayJay (2. Feb 2006)

Hm hab mal das ganze ausprobiert. 

nicht preparedStatement: 36,12s
prepared statement: 35,7 sec


```
PreparedStatement ps = db.preparedStatement( "UPDATE members SET created=? WHERE id=?");

		
		start = (new Date()).getTime();
		while( res.next() )
		{
			int id = res.getInt("id");
			int created = res.getInt("created");
			
			ps.setInt( 1, created+1 );
			ps.setInt( 2, id );
			ps.execute();
		}
```

HM sollte das so sein von den Zahlen? 

 :###


----------



## Bleiglanz (2. Feb 2006)

> Naja, ich lese jeden Eintrag zeile für zeile aus, da jeder eintrag einzeln besonders bearbeitet werden muss.


warum?

bisher hast du nur sachen die alle mit einem UPDATE erledigt werden können


----------



## JayJay (2. Feb 2006)

Also hab das ganze mal auf einem anderen rechner ausprobiert.

dauert ca. 2.5 sec was vorher 45 sec dauerte!!


----------

