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