SELECT naechsten wert im index

SELECT naechsten wert im index

am 06.12.2006 13:01:27 von Stefan+Usenet

Ich stehe gerade irgendwie auf der Leitung... folgendes ist gegeben
(auf die notwendigen Felder reduziert):

| CREATE TABLE Position (
| FKIDPosGroup int(11) NOT NULL,
| PositionNumber varchar(30) NOT NULL,
| Multiple char(1) NOT NULL,
|
| UNIQUE KEY (FKIDPosGroup, PositionNumber, Multiple)
| ) ENGINE=InnoDB;

In Prosa: verschiedene Gruppen enthaltenen mehrere Positionen, die
sich in der Regel durch ihre PositionNumber eindeutig erkennen
lassen, in Ausnahmefaellen gibt es aber gleiche Nummern, bei denen
dann erst "Multiple" die Eindeutigkeit sicherstellt.

Nun moechte ich fuer eine gegebene Gruppe zu einem Datensatz
halbwegs effizient den naechsten in der Reihe finden. Dieser steht
im Index ja unmittelbar danach - aber frage ich das ueber SELECT ab?
Wenn ich ein CONCAT ueber die beiden Zeichenketten mache, erkennt
MySQL wohl nicht mehr, dass das Ergebnis der Indexreihenfolge
entspricht, oder?

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Einsame Klasse für zweisame Tage! Stefan, so lustig...
(Sloganizer)

Re: SELECT naechsten wert im index

am 06.12.2006 19:58:03 von Oliver Dietz

Hallo,

> | CREATE TABLE Position (
> | FKIDPosGroup int(11) NOT NULL,
> | PositionNumber varchar(30) NOT NULL,
> | Multiple char(1) NOT NULL,
> |
> | UNIQUE KEY (FKIDPosGroup, PositionNumber, Multiple)
> | ) ENGINE=InnoDB;
> [...]
> Nun moechte ich fuer eine gegebene Gruppe zu einem Datensatz
> halbwegs effizient den naechsten in der Reihe finden. Dieser steht
> im Index ja unmittelbar danach - aber frage ich das ueber SELECT ab?
> Wenn ich ein CONCAT ueber die beiden Zeichenketten mache, erkennt
> MySQL wohl nicht mehr, dass das Ergebnis der Indexreihenfolge
> entspricht, oder?

a, b, c sind die Index-Werte des gegebenen Datensatzes, von dem aus der
nächste Datensatz gesucht ist.

Versuch mal folgendes:
---
SELECT * FROM Position WHERE FKIDPosGroup=a AND ((PositionNumber=b AND
Multiple>=c) OR (PositionNumber>b)) ORDER BY FKIDPosGroup, PositionNumber,
Multiple LIMIT 1, 1

Verwendet bei mir die ersten 4 Byte des Keys ... also schonmal die
FKIDPosGroup.
Sortierung ist auch keine notwendig.


Schöne Grüße,
Oliver

Re: SELECT naechsten wert im index

am 07.12.2006 17:07:13 von Stefan+Usenet

On Wed, 6 Dec 2006 19:58:03 +0100 Oliver Dietz wrote:
> > | CREATE TABLE Position (
> > | FKIDPosGroup int(11) NOT NULL,
> > | PositionNumber varchar(30) NOT NULL,
> > | Multiple char(1) NOT NULL,
> > |
> > | UNIQUE KEY (FKIDPosGroup, PositionNumber, Multiple)
> > | ) ENGINE=InnoDB;
> > [...]
> > Nun moechte ich fuer eine gegebene Gruppe zu einem Datensatz
> > halbwegs effizient den naechsten in der Reihe finden. [...]

> Versuch mal folgendes:


> SELECT * FROM Position WHERE FKIDPosGroup=a AND ((PositionNumber=b AND
> Multiple>=c) OR (PositionNumber>b)) ORDER BY FKIDPosGroup, PositionNumber,
> Multiple LIMIT 1, 1

> Verwendet bei mir die ersten 4 Byte des Keys ... also schonmal die
> FKIDPosGroup.

Gut, die Anfrage haelt sich von der Komplexitaet her hier noch in
Grenzen, und mit dem einen Key ist die mit Abstand groesste
Einschraenkung bereits getroffen (danach gibt es maximal noch
einige wenige 100 Treffer). Wird also in der Form zum Einsatz
kommen, merci.

Trotzdem wundert es mich, dass es fuer diese Operation offenbar
keine Funktion gibt. Es passiert doch oefters, dass man alle
Komponenten eines mehrfachen Keys kennt, und es waere extrem billig,
sich dazu den vorherigen bzw. naechsten Schluessel suchen zu lassen.
Werden das, aus welchem Grund auch immer, einmal fuenf Komponenten
anstatt bloss drei, wird die Abfrage auf diese Weise doch schon
ziemlich wirr.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

(Sloganizer)