2010-03-04 12 views
8

necesito para seleccionar varios registros¿Cuál es la mejor manera de seleccionar varias filas por ID en sql?

utilizo

SELECT * 
FROM `table` 
WHERE `ID` =5623 
OR `ID` =5625 
OR `ID` =5628 
OR `ID` =5621 

esta consulta carrera 4 veces en cada segundo php whit

hay una manera mejor y más rápido para esto?

+1

se recomienda usar la indexación, se mejorará que muchos de ID en la base de datos. ¿Los ID son diferentes cada vez que lo ejecuta? ¿Puedes asumir algo en los ID? ¿Con qué frecuencia se escriben los datos en la mesa? – Artium

+2

¿Por qué necesita una forma más rápida? ¿Su sitio funciona lento o tiene alguna otra razón para encontrar una forma más rápida? –

Respuesta

30
SELECT * 
FROM `table` 
where ID in (5263, 5625, 5628, 5621) 

es probablemente mejor, pero no más rápido.

+0

¿Puede explicar la razón por la que cree que esto es mejor? – gameover

+1

Definitivamente más legible. Sin embargo, creo que la mayoría de los optimizadores de consultas generarían el mismo plan de ejecución, lo que significa que sería equivalente al enfoque de largo alcance – AdaTheDev

+0

No creo que haya una diferencia de rendimiento, pero es más legible y prueba de error (si se deben agregar filtros adicionales) adicional). – anthares

3
SELECT * 
FROM `table` 
WHERE `ID` IN (5623, 5625, 5628, 5621) 

Pero cuatro veces por segundo es mucho. Pensaría en otro enfoque que necesita menos acceso a la base de datos.

+1

No es mucho, las bases de datos normales deberían poder manejar 20 veces más consultas por segundo sin una carga significativa. Solo tiene que establecer los índices correctamente. – dbemerlin

+1

@dbemerlin: Ok, si tú lo dices. Sin embargo, para mí suena que el código podría mejorarse y no hacer la misma consulta una y otra vez. –

3
SELECT * 
FROM `table` 
WHERE `ID` in (5623, 5625, 5628, 5621) 

mientras que la investigación más a fondo me encontré con un interesante blog post que explica cómo utilizar un conjunto para obtener un rendimiento de SQL más rápido de In cláusulas, mediante la creación de una lista de identificadores en una expresión de tabla común (CTE) y luego unirse en ese.

Así que podría codificar el equivalente PHP de lo siguiente para obtener el máximo rendimiento.

DECLARE @idList varchar(256) 
SET @idList = '5623, 5625, 5628, 5621' 

;with ids (id) as 
(
    SELECT value FROM UTILfn_Split(@idList,',') 
) 

SELECT  t.* 
FROM  table as t 
INNER JOIN ids 
ON  t.ID = ids.id 
+0

Probablemente sea un enfoque viable si tiene una lista separada por comas como entrada. Si ya comienza con una lista de números (como dice la pregunta), convertirla en una cadena y luego dividirla probablemente le genere demasiada sobrecarga. Sugiero seguir con una consulta simple con la cláusula IN. – VladV

+0

Sí, por supuesto, solo otra forma de "desollar al gato". –

5

Por encima de lo que la gente declararon (donde id in):

1) si hay una gran cantidad de identificaciones, mejor quedarse en una tabla temporal y ejecutar una unión con la tabla temporal

2) Asegúrese de que la tabla tiene un índice de Identificación del

3) Si el tiempo real, la puntualidad de los datos no es crítica, poner los resultados de la consulta en una memoria caché en el lado de la aplicación

+3

+1 para "tabla temporal". –

+1

+1 por caché. El enfoque de tabla temporal necesitaría una evaluación comparativa cuidadosa ya que los gastos generales en la creación de la tabla pueden anular cualquier mejora. – AdaTheDev

+0

Ah, vale, sí, eso sería mejor. Todavía estoy a favor de su sugerencia de caché, que brinda la mejor optimización posible en una milla de país. – AdaTheDev

1

Si lo hace

SELECT * 
FROM `table` 
WHERE `ID` IN (5623, 5625, 5628, 5621) 

que debe estar bien, siempre y cuando el número de ID de no crezca demasiado. Te sugiero que crees un índice para las ID, por lo que la consulta funcionará más rápido.

También, considere cambiar su lógica, por lo que no tiene que pasar a la velocidad de recuperación

Cuestiones relacionadas