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+AS start 
     FROM  
`articoli`  
     
WHERE figlio='0'  AND codice BETWEEN '0' AND '99999'
) AS 
LEFT JOIN 
(
     
SELECT codice 
     FROM 
`articoli
     
WHERE figlio='0' AND codice BETWEEN '0' AND '99999'
) AS 
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
-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:=) AS r    
      WHERE 1 
) AS 
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.