allora, penso di aver ottenuto qualcosa di utile.
se poi qualche guru può ottimizzarla o fare qualcosa di meglio lo ringrazio infinitamente.
nel frattempo....
OBBIETTIVO: trovare il primo id/codice utile in una tabella(senza auto_increment) di 400.000 righe
PUNTO INIZIALE: (esegue la query in 11.3 secondi)
Codice PHP:
SELECT
start AS codice
FROM (
SELECT codice+1 AS start
FROM `articoli`
WHERE figlio='0' AND codice BETWEEN '0' AND '99999'
) AS a
LEFT JOIN (
SELECT codice
FROM `articoli`
WHERE figlio='0' AND codice BETWEEN '0' AND '99999'
) AS b
ON a.start=b.codice
WHERE b.codice IS NULL LIMIT 1
PUNTO FINALE (query modificata) esegue la query in 0.34 secondi
Codice PHP:
SELECT
codice-1 AS codice
FROM (
SELECT
codice, (CAST(codice AS UNSIGNED)-(@rownum:=@rownum+1)) AS test
FROM (
SELECT
DISTINCT codice
FROM articoli
WHERE figlio='0'
ORDER BY codice*1 ASC
) AS c,
( SELECT @rownum:=0 ) AS r
WHERE 1
) AS d
WHERE d.test>0 LIMIT 1
la query è indubbiamente più veloce anche se ha un difetto.
se per caso viene applicata una condizione aggiuntiva per far partire la query da un punto X, il progressivo della colonna temporanea @rownum sballa, perchè parte sempre da 1.
anche se modificando anche il suo punto di partenza potrebbe risolvere.
è da valutare.