phpbar.de logo

Mailinglisten-Archive

[dbs] Wie finde ich die passenden Datensätze am schnellsten?

[dbs] Wie finde ich die passenden Datensätze am schnellsten?

Sebastian Mendel lists at sebastianmendel.de
Die Okt 31 08:19:56 CET 2006


René Thiel wrote:
> Hallo,
> 
> ich brauche aus 1.000.000 Datensätzen folgendes:
> 
> 1. Verbindungsaufbau (Call X)
> 2. Verbindungsdetails (Call X)
> 3. Verbindungsabbau (Call X)
> 
> Zwischen Verbindungsaufbau, Verbindungsdetails und
> Verbindungsabbau können weitere Verbindungen auf-
> und abgebaut werden:
> 
> aufbau(Call 1)
> details(Call 1)
> aufbau(Call 2)
> aufbau(Call 3)
> details(Call 3)
> details(Call 2)
> abbau(Call 3)
> abbau(Call 1)
> abbau(Call 2)
> 
> Ich brauche also eigentlich für ein "Free" das vorangegangene
> "Release" und zu dem wieder das vorangegangene "Alloc",
> WENN NICHT nach dem "Alloc" noch ein "Free" zu finden ist.
> 
> Ich habe das so versucht:
> 
> SELECT * FROM `Tabelle`
> WHERE `Typ` = 'Free'
> ORDER BY `ID`
> 
> SELECT * FROM `Tabelle`
> WHERE `Call` = '".$Free_row['Call']."'
> AND `Typ` = 'Release'
> AND `ID` < '".$Free_row['ID']."'
> ORDER BY `ID` DESC
> LIMIT 1
> 
> SELECT *
> FROM `Tabelle`
> WHERE `Call` = '".$Free_row['Call']."'
> AND `Typ` = 'Alloc'
> AND `ID` < '".$Release_row['ID']."'
> ORDER BY `ID` DESC
> LIMIT 1 "
> 
> Das Ganze gab mit Abbruch bei 500 gefundenen
> Verbindungen: 3,734 sec - eindeutig zu viel.

das das zu lange dauert glaube ich gerne, du machst für jedes ERgebnis
aus der ersten Abfrage zwei weitere Abfragen ... puh

probiere es doch mal mit JOINS

und Indizes auf (`Typ`, `ID`) und (`Call`, `Typ`, `ID`)

(`ID`) ja sowieso ...


SELECT 	`free`.`ID` AS `free_id`,
	`release`.`ID` AS `release_id`,
	`alloc`.`ID` AS `alloc_id`,
        [was du halt sonst noch so für Felder brauchst]
FROM	`Tabelle` AS `free`
LEFT JOIN
	`Tabelle` AS `release`
ON	`free`.`call` = `release`.`call`
AND	`Typ` = 'Release'
AND	`ID` =
	(	SELECT	`ID`
		FROM	`Tabelle` AS `release_id`
		WHERE	`ID` < `free`.`ID`
		ORDER BY `ID` DESC)
LEFT JOIN
	`Tabelle` AS `alloc`
ON	`free`.`call` = `alloc`.`Call`
AND	`Typ` = 'Alloc'
AND	`ID` =
	(	SELECT	`ID`
		FROM	`Tabelle` AS `release_id`
		WHERE 	`ID` < `free`.`ID`
		ORDER BY `ID` DESC)
WHERE	`free`.`Typ` = 'Free'
ORDER BY
	`ID`


ist aber ungestest, aber so in der Art würde ich es wohl mal probieren ...




-- 
Sebastian Mendel

www.sebastianmendel.de

php::bar PHP Wiki   -   Listenarchive