Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 14.03.2006 11:32:12 von Frederic Finu

Hallo ihr!

Folgendes Problem. Ich muss aus bereits existierenden DB-Tabellen
verschiedene Werte auslesen. Eine der Tabellen enthält folgendes Format:

id INT(11) AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL,
txt TEXT NOT NULL,
lastview BIGINT(12) NOT NULL

Die Spalte ´lastview´ enthält immer einen Unix-timestamp der auf den
Zeitpunkt hinweist, an dem der Datensatz das letzte mal angezeigt wurde.

Nun will ich den Datensatz aus der Tabelle auslesen, dessen letzter
Anzeigezeitpunkt am weitesten zurück liegt.

Bisher mache ich das wie folgt:

SELECT MIN(lastview) AS lastview FROM mytable

und danach noch eine 2. Abfrage

SELECT id, name, txt FROM mytable WHERE lastview=%s

%s ist nur nen Platzhalter in den das Ergebnis der 1. Abfrage eingesetzt
wird (Über eine Scriptsprache)

Nun meine Frage:
Gibt es eine Moeglichkeit beide Abfragen zu einer einzigen zu kombinieren?

Auf das Design der DB habe ich keinen Einfluss. Es wird Mysql 3.23.56
verwendet.

Tschüß,
Fred

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 14.03.2006 12:07:49 von unknown

Post removed (X-No-Archive: yes)

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 14.03.2006 13:20:49 von Frederic Finu

Ulrich Gehauf schrieb:

> SELECT id, name, txt FROM mytable ORDER BY lastview ASC LIMIT 1
>
> Das war jetzt aber einfach...

Danke! Sorry das ich da nicht selbst drauf gekommen bin, aber sind noch
meine 1. Schritte mit Mysql.

Gruß,
Fred

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 14.03.2006 13:30:07 von Hartmut Holzgraefe

Frederic Finu wrote:
> Ulrich Gehauf schrieb:
>
>> SELECT id, name, txt FROM mytable ORDER BY lastview ASC LIMIT 1
>>
>> Das war jetzt aber einfach...
>
> Danke! Sorry das ich da nicht selbst drauf gekommen bin, aber sind noch
> meine 1. Schritte mit Mysql.

und hoffentlich gibt es einen Index auf lastview ...?


--
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 14.03.2006 17:33:57 von Frederic Finu

Hartmut Holzgraefe schrieb:

> und hoffentlich gibt es einen Index auf lastview ...?

Da ich mit dem Begriff noch nichts anfangen kann, hab ich erst mal
google gefragt, und hab auch "tausende" Beispiele gefunden, die mir
sagen wollen, das die Vergabe eines Index die Performance bei Abfragen
erhöht und das man die nachträglich über
ALTER TABLE mytable ADD INDEX(lastview);
umsetzen kann.

Ich nehme an das die Verwendung von INDEX, UNIQUE impliziert?
Wenn das so ist waere es schon ein Ausschlusskriterium, da es keine
Kontrolle darueber gibt, das nicht zur gleichen Zeit mehrere Views
angezeigt werden (also es kann mehrere gleiche lastviews geben). Darauf
hab ich auch keinen Einfluss, da das Programm dem eigentlich die Tabelle
gehoert nicht mein eigenes ist und ich auch keinen Source dazu besitze.

Tschüß,
Fred

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 14.03.2006 17:47:32 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 15.03.2006 07:59:57 von Thomas Rachel

Andreas Kretschmer wrote:

> PS.: noch ein Begriff, der für Dich neu sein wird: EXPLAIN.
>
> Wobei, bei dem, was MySQL bei EXPLAIN liefert, man dies vielleicht auch
> nicht braucht.

Hast Du es ausprobiert? Wohl nicht.


Thomas

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 15.03.2006 12:44:53 von Frederic Finu

Andreas Kretschmer schrieb:

>> Ich nehme an das die Verwendung von INDEX, UNIQUE impliziert?
> Nein.

OK, dann hät ich ja nicht so viel schreiben brauchen. ;-)

> PS.: noch ein Begriff, der für Dich neu sein wird: EXPLAIN.

Ja EXPLAIN kenn ich schon, konnte aber bisher nicht sonderlich viel
damit anfangen. Die resultierenden Daten sagen mir einfach mal nicht
viel, mit was ich was anfangen kann. Aber das kommt bestimmt noch.

Beispiel an meiner Tabelle

mysql> SELECT id, name, txt FROM views ORDER BY stamp ASC LIMIT 1;
+-------+-------+---------------+-------+---------+------+-- ----+------+
| table | type | possible_keys | key | key_len | ref | rows | Extra|
+-------+-------+---------------+-------+---------+------+-- ----+------+
| views | index | NULL | stamp | 8 | NULL | 514 | |
+-------+-------+---------------+-------+---------+------+-- ----+------+

Was will mir Mysql jetzt sagen, was mich irgendwie zu einer Optimierung
anregen sollte?

Gruß,
Fred

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 15.03.2006 12:47:20 von Frederic Finu

Frederic Finu schrieb:

> mysql> SELECT id, name, txt FROM views ORDER BY stamp ASC LIMIT 1;

soll natürlich heissen:
EXPLAIN SELECT id, name, txt FROM views ORDER BY stamp ASC LIMIT 1;

Gruß,
Fred

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 19.03.2006 13:33:28 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 19.03.2006 14:39:39 von Christian Kirsch

Frederic Finu wrote:
> Andreas Kretschmer schrieb:
>
>
>>>Ich nehme an das die Verwendung von INDEX, UNIQUE impliziert?
>>
>>Nein.
>
>
> OK, dann hät ich ja nicht so viel schreiben brauchen. ;-)
>
>
>>PS.: noch ein Begriff, der für Dich neu sein wird: EXPLAIN.
>
>
> Ja EXPLAIN kenn ich schon, konnte aber bisher nicht sonderlich viel
> damit anfangen. Die resultierenden Daten sagen mir einfach mal nicht
> viel, mit was ich was anfangen kann. Aber das kommt bestimmt noch.
>
> Beispiel an meiner Tabelle
>
> mysql> SELECT id, name, txt FROM views ORDER BY stamp ASC LIMIT 1;
> +-------+-------+---------------+-------+---------+------+-- ----+------+
> | table | type | possible_keys | key | key_len | ref | rows | Extra|
> +-------+-------+---------------+-------+---------+------+-- ----+------+
> | views | index | NULL | stamp | 8 | NULL | 514 | |
> +-------+-------+---------------+-------+---------+------+-- ----+------+
>
> Was will mir Mysql jetzt sagen, was mich irgendwie zu einer Optimierung
> anregen sollte?

Dass es keinen Schlüssel verwenden kann ('possible_keys' NULL). Übrigens
gibt es eine Dokumentation zu MySQL, in der Du z.B. Informationen zur
Verwendung von Indizes ebenso findest wie die Erklärung der
EXPLAIN-Ausgabe. Näheres siehe dev.mysql.com/doc.

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 21.03.2006 14:57:42 von Ulf Kadner

Christian Kirsch wrote:

>>mysql> SELECT id, name, txt FROM views ORDER BY stamp ASC LIMIT 1;
>>+-------+-------+---------------+-------+---------+------+ ------+------+
>>| table | type | possible_keys | key | key_len | ref | rows | Extra|
>>+-------+-------+---------------+-------+---------+------+ ------+------+
>>| views | index | NULL | stamp | 8 | NULL | 514 | |
>>+-------+-------+---------------+-------+---------+------+ ------+------+
>
> Dass es keinen Schlüssel verwenden kann ('possible_keys' NULL). Übrigens
> gibt es eine Dokumentation zu MySQL, in der Du z.B. Informationen zur
> Verwendung von Indizes ebenso findest wie die Erklärung der
> EXPLAIN-Ausgabe. Näheres siehe dev.mysql.com/doc.

Hallo Christian!

Da bin ich ja jetzt mal gespannt. Welchen Index sollte er den setzen um
bei der oben genutzten Abfrage, possible_keys!=NULL zu erhalten?

Da kannste auf jedes Feld nen Index setzen und trotzdem bekommst Du
keine "moeglichen Schluessel"!

MfG, Ulf

Re: Datensatz ermitteln der kleinsten Wert fuer ein Feld enthaelt

am 21.03.2006 15:42:51 von Axel Schwenke

Ulf Kadner wrote:
> Christian Kirsch wrote:
>
>>>mysql> SELECT id, name, txt FROM views ORDER BY stamp ASC LIMIT 1;
>>>+-------+-------+---------------+-------+---------+------ +------+------+
>>>| table | type | possible_keys | key | key_len | ref | rows | Extra|
>>>+-------+-------+---------------+-------+---------+------ +------+------+
>>>| views | index | NULL | stamp | 8 | NULL | 514 | |
>>>+-------+-------+---------------+-------+---------+------ +------+------+
>>
>> Dass es keinen Schlüssel verwenden kann ('possible_keys' NULL).
>
> Da bin ich ja jetzt mal gespannt. Welchen Index sollte er den setzen um
> bei der oben genutzten Abfrage, possible_keys!=NULL zu erhalten?

Gar keinen. Schließlich *verwendet* MySQL ja den Index auf `stamp`.
Steht doch da und ist für die Query auch das sinnvollste.

IMNSHO macht MySQL das bestmögliche aus dieser Query: ein Index-Walk
auf dem `stamp` Index, der N=0 rows überspringt und dann K=1 rows
vom Storage liest (N und K sind die LIMIT-Parameter).


XL