2011-11-05 9 views
7

¿Hay alguna forma escalable de seleccionar miles de filas usando mysql IN o algo similar?La forma más eficiente de seleccionar miles de filas de una lista de identificadores

E.g.

SELECT * FROM awesomeTable WHERE id IN (1,2,3,4......100000) 

¿Esto es posible o estoy soñando? Schema es InnoDB, se puede cambiar si otro proporciona una solución más escalable.

Como referencia obtengo los resultados de búsqueda de un conjunto de identificadores devueltos de Solr. Me gustaría usar mysql para la recuperación final, ya que haría la clasificación y el filtrado final de estos resultados mucho más fáciles (no entraré en los detalles de por qué).

EDIT:

La consulta podría ser utilizar una cláusula LIMIT siempre y cuando el EN todavía contenía todos los identificadores de 100.000

P. ej

SELECT * FROM awesomeTable WHERE id IN (1,2,3,4......100000) LIMIT 10; 
+1

es mejor utilizar la clasificación de Solr si desea lograr el rendimiento. – sathis

+0

¿De verdad tiene que buscar el contenido real de todas las mil filas? ¿No puedes hacer tu paginación algo y luego comenzar a buscar por página? – cherouvim

+0

@cherouvim él tiene que hacer la clasificación. Es por eso que está seleccionando todos los registros que asumo. – sathis

Respuesta

1

I que yo, y no saber realmente su marco, usted debe tratar de insertar los ID en una tabla temporal y el uso de esta tabla con una simple combinación interna. Eso podría ser tan rápido como este IN.

+0

Estaba pensando en esto, pero ¿no escribiría una sobrecarga al llamar a INSERT para que potencialmente cientos de miles de identificadores superen cualquier beneficio obtenido de la unión interna? –

+0

Aún más importante, generalmente hay un límite superior de qué tan grande (en caracteres) puede obtener una única consulta SQL. Una larga lista 'IN()' es una buena forma de alcanzar ese límite. Usar una tabla temporal evita esto. Además, la solución de tabla temporal puede ser mucho más eficiente si necesita usar la lista más de una vez. – sleske

+0

, que sería probablemente el caso si se trata de una búsqueda, ya que es posible que desee paginar el resultado. – NoDataFound

0

Llegué a la misma pregunta mientras insertaba en las tablas de mysql. El posible tamaño de consulta depende de su configuración de mysql.

Mi enfoque era dividir la gran colección de ids en algunas partes.

El uso de Ruby on Rails:

all_ids.each_slice(10000) do |ids_part| 
    query = "INSERT INTO ..." 
end 

Tal vez esto también podría ser una solución para la selección de filas por IDS.

Cuestiones relacionadas