2012-02-26 19 views
5

Tengo una tabla con más de 300 000 filas y necesito seleccionar el valor más alto para la columna 'id'. Por lo general, voy a hacer como esto:PHP seleccione el mayor valor 'id' de la tabla MySQL

SELECT id FROM my_table ORDER BY id DESC 

... pero esto hará que las consultas lentas y no querer usarlo. ¿Hay alguna manera diferente de resolver esta situación? id es incremento automático y clave principal.

Edición posterior: Parece que mi código completo está bastante mal escrito, como deduzco de sus comentarios. A continuación publiqué una muestra del código que estoy trabajando y las tablas. ¿Puede sugerir una forma adecuada de insertar el último ID + 1 de table_x en dos tablas (incluido table_x en sí mismo). Debo mencionar que el script se ejecutará más de una vez.

TABLE_X   TABLE_Y 
------------  ---------- 
id_x | value  id_y | id_x 
------------  ---------- 
    1 | A   1 | 3 
    2 | B    
    3 | C 

<?php 
for($i=0; $i<10; $i++){ 
    $result_x = mysql_query('SELECT id_x FROM table_x ORDER BY id_x DESC'); 
    $row_x = mysql_fetch_array($result_x); 

    $next = $row_x['id_x'] + 1; 
    mysql_query('INSERT INTO table_x(id_x) VALUES("'.$next.'")'); 
    mysql_query('INSERT INTO table_y(id_x) VALUES("'.$next.'")'); 
} 
?> 
+1

'SELECT MAX (id)' – knittl

+1

Um, 'SELECCIONE MAX (id) como id FROM my_table'.id es un PK auto_increment, y por lo tanto indexado, así que esto debería ser muy rápido. –

+1

¿por qué necesita una identificación máxima? –

Respuesta

3

Aquí está el código correcto que debe usar.

+0

Oh, eso es tan fácil. Sí, tengo que usar mysql_insert_id(). ¡Gracias! – Cosmi

+0

característica de incremento automático destinada a ser utilizada automáticamente, no manualmente. De lo contrario, romperá la consistencia de su base de datos. Siempre permita que la base de datos asigne el ID –

-1

Supongo que es lento porque recupera las 300 000 filas. Agregue LIMIT 1 a la consulta.

SELECT id FROM my_table ORDER BY id DESC LIMIT 1 

O utilice el operador MAX().

13

Ligeramente mejor:

SELECT id FROM my_table ORDER BY id DESC LIMIT 1 

Significativamente mejor:

SELECT MAX(id) FROM my_table 
+0

Gracias. MAX() es la solución! – Cosmi

1

Dependiendo del contexto, ya sea

SELECT id FROM my_table ORDER BY id DESC LIMIT 1 

o mysql_insert_id() en PHP o (SELECT LAST_INSERT_ID()) en MySQL

+0

LAST_INSERT_ID() es específico de conexión y por lo tanto solo en situaciones muy especiales útiles. – SteAp

+0

@SteAp Por supuesto. Aunque tiene que ser considerablemente más rápido que buscar el 'max()'. No hay necesidad de downvote aquí amigos. –

+0

Ah, bien, ahora entiendo tu comentario. ¡Rallado! Incluya una nota en su respuesta, y voy a volver a votar nuevamente. Si solo para desbloquear el voto para mí para esta respuesta. – SteAp

0

Como otro dijo, se debe utilizar el operador MAX:

SELECT MAX(id) FROM my_table ORDER BY id DESC 

Como regla general, siempre reducir la cantidad de registros devueltos desde la base de datos. La base de datos siempre es más rápida que su programa de aplicación cuando se opera en conjuntos de resultados.

En caso de consultas lentas, por favor, dar una oportunidad EXPLAIN:

EXPLAIN SELECT id FROM my_table ORDER BY id DESC 

vs

EXPLAIN SELECT MAX(id) FROM my_table ORDER BY id DESC 

EXPLIQUE pedir optimizador de consultas de MySQL cómo ve la consulta. Consulte la documentación para aprender a leer su resultado.

PD: Realmente me pregunto por qué necesita MAX(id). Incluso si su aplicación recupera el valor de la base de datos, es inútil: otro proceso podría haber insertado un nuevo registro durante el siguiente ciclo de la CPU, y MAX(id) ya no es válido.

+0

Necesito insertar la identificación en dos tablas y no puedo encontrar una solución adecuada. Revisé mi publicación, ¿puedes echar un vistazo, por favor? ¡Gracias! – Cosmi

+0

Primero, inserte los registros principales y guarde el resultado de mysql_insert_id() en una variable. A continuación, utilice esta ID de inserción permanentemente válida en las siguientes dos instrucciones insertadas. Todo en una sola secuencia de comandos. – SteAp

Cuestiones relacionadas