Was ist schneller?

Was ist schneller?

am 10.07.2007 12:46:40 von stefan.glaesser

Hallo,

welches Konstrukt ist das schnellste? Kann man das ausm Stehgreif sagen?
Konkret geht es mir darum zu entscheiden, ob ein DS aktualisiert werden muss
oder eben nicht (weil sich nichts geändert hat).

Die Variablen $field1 .. $field4 sind jeweils mit den Inhalten aus einem
Textfile vorbelegt.

Variante 1
----------

$query = mysql_query("SELECT id, sha1(concat(field1,field2,field3,field4))
as hash
FROM table");
$row = mysql_fetch_assoc($query);
if (sha1($field1.$field2.$field3.$field4)!=$row['hash'])
{
...aktualisere DS...
}

Variante 2
----------

$query = mysql_query("SELECT id, field1, field2, field3 , field4
FROM table");
$row = mysql_fetch_assoc($query);
if (sha1($field1.$field2.$field3.$field4)==
sha1($row['field1'].$row['field2'].$row['field3'].$row['fiel d4']))
{
...aktualisere DS...
}


Ziel des Ganzen soll sein, dass ich möglichst wenig Update-Operationen
fahren muss, wenn sich an den Ursprungsdaten im Vergleich zum letzten Update
nichts geändert hat. Ist dieser Ansatz sinnvoll oder gibt's vielleicht
schnellere, leichtgewichtigere Lösungen?


Gruß,
Stefan

Re: Was ist schneller?

am 10.07.2007 14:06:18 von Claus Reibenstein

Stefan Gläßer schrieb:

> welches Konstrukt ist das schnellste?

Das hängt von vielen Faktoren ab, ohne deren genaue Kenntnis man das
nicht beurteilen kann.

> Variante 1
> [...]
>
> Variante 2
> [...]

Variante 3
¯¯¯¯¯¯¯¯¯¯

$query = mysql_query(
"update ... where sha1(concat(field1,field2,field3,field4))
= sha1('$field1$field2$field3$field4')"
);

Gruß. Claus

Re: Was ist schneller?

am 10.07.2007 14:17:31 von Boris Stumm

Claus Reibenstein wrote:
> Stefan Gläßer schrieb:
>> welches Konstrukt ist das schnellste?
>
> Das hängt von vielen Faktoren ab, ohne deren genaue Kenntnis man das
> nicht beurteilen kann.
>
>> Variante 1
>> [...]
>>
>> Variante 2
>> [...]
>
> Variante 3
> ¯¯¯¯¯¯¯¯¯¯
>
> $query = mysql_query(
> "update ... where sha1(concat(field1,field2,field3,field4))
> = sha1('$field1$field2$field3$field4')"
> );

Mir stellt sich die Frage, wozu der Hash gut ist. Ich kann mir nicht
vorstellen, dass der sha1-Algorithmus schneller ist als ein Stringvergleich.
Deshalb würd ich die where-Klausel wohl eher so gestalten:
where field1 != '$field1' or field2 != '$field2' ...

Re: Was ist schneller?

am 10.07.2007 15:16:25 von Claus Reibenstein

Boris Stumm schrieb:

> Claus Reibenstein wrote:
>
>> "update ... where sha1(concat(field1,field2,field3,field4))
>> = sha1('$field1$field2$field3$field4')"
>
> Mir stellt sich die Frage, wozu der Hash gut ist.

Ich habe das einfach so vom Vorposter übernommen, ohne mir die Frage zu
stellen :-)

> where field1 != '$field1' or field2 != '$field2' ...

WHERE field1 = '$field1' AND field2 = '$field2' ...

Es war nach Gleichheit, nicht nach Ungleichheit gefragt ;-)

Gruß. Claus

Re: Was ist schneller?

am 10.07.2007 15:16:59 von bruening

Claus Reibenstein schrieb:
> Es war nach Gleichheit, nicht nach Ungleichheit gefragt ;-)

Der OP prüft in seinem Eingangsbeispiel auf Ungleichheit, im zweiten auf
Gleichheit. Ich gehe davon aus, dass er die Ungleichheit verifizieren
will, damit er entsprechend updaten kann.


Gruß,
Habbo

Re: Was ist schneller?

am 10.07.2007 15:21:53 von stefan.glaesser

Jan Habbo Brüning schrieb:
> Der OP prüft in seinem Eingangsbeispiel auf Ungleichheit, im zweiten auf
> Gleichheit. Ich gehe davon aus, dass er die Ungleichheit verifizieren
> will, damit er entsprechend updaten kann.

Korrekt. In Variante 2 ist ein Tippfehler. Ich möchte auf Ungleichheit
prüfen. Was ich mich halt Frage, ist sha1 in MySQL schneller oder in PHP
oder ist's an sich gleich?

Stefan

Re: Was ist schneller?

am 10.07.2007 19:09:55 von Claus Reibenstein

Stefan Gläßer schrieb:

> Jan Habbo Brüning schrieb:
>
>> Der OP prüft in seinem Eingangsbeispiel auf Ungleichheit, im
>> zweiten auf Gleichheit.

Ups! Ist mir gar nicht aufgefallen. Sorry.

> Korrekt. In Variante 2 ist ein Tippfehler.

Ok, dann eben Variante 3a:
¯¯¯¯¯¯¯¯¯¯¯

$query = mysql_query(
"update ... where sha1(concat(field1,field2,field3,field4))
!= sha1('$field1$field2$field3$field4')"
);

> Ich möchte auf Ungleichheit prüfen. Was ich mich halt Frage, ist sha1
> in MySQL schneller oder in PHP oder ist's an sich gleich?

Ging es Dir _nur_ um sha1? Das war Deiner ursprünglichen Frage nicht zu
entnehmen. Dies würde mich dann - unter Berücksichtigung von Boris'
Anmerkung in - zu Variante 3b führen (ohne
jegliches sha1): ¯¯¯¯¯¯¯¯¯¯¯

$query = mysql_query(
"update ... where field1 != '$field1' or field2 != '$field2'
or field3 != '$field3' or field4 != '$field4'"
);

Gruß. Claus