2012-06-03 10 views
5

Estoy leyendo un libro sobre Sphinx y menciona que para aprovechar los múltiples núcleos y la tecnología Sphinx en sí misma, inevitablemente tendré que dividir un gran índice en los más pequeños y consultarlos en una consulta de múltiples índices. Sin embargo, el libro no entra en más detalles.Cómo aprovechar los múltiples índices de Sphinx para mejorar el rendimiento

¿Cuáles son las estrategias generales para esto? ¿Simplemente lo divide de una manera parecida a UNIÓN, p.

index1: SELECT ... FROM table LIMIT 0, 1000 
index2: SELECT ... FROM table LIMIT 1000, 1000 
... 

Y luego reconstruye estas piezas de vez en cuando. Cuando se realiza la búsqueda ¿diferentes núcleos procesarán estos índices en paralelo? ¿O es algo diferente como separar elementos existentes en un índice más grande y artículos más nuevos que se están agregando a un índice más pequeño? ¿O separar campos de texto en un índice y atributos en otro?

Respuesta

10

Una gran pregunta.

Esfinge es la utilización de un solo núcleo de la CPU por un solo índice de búsqueda local y un núcleo de CPU para la construcción de un índice al indexar

Si tiene dos índices podría ejecutar dos controladores paso a paso a la vez y utilizar dos núcleos de CPU. Tenga en cuenta que la indexación es una tarea IO intensiva, por lo que no debe ejecutar demasiados indexadores.

Una vez que tenga dos (o más) los índices se podría buscar en ellos al mismo tiempo, mencionando todos ellos en consulta de búsqueda o utilizando el índice distribuido así:

index index_main 
{ 
     type   = distributed 
     local   = index1 
     local   = index2 
} 

donde index1 y index2 son índices separados. En este caso se puede buscar en contra index_main y la esfinge le proporcionará resultados agregados de ambos índices

En cuanto a los datos de división que podría utilizar todas las técnicas que desea incluyendo los registros de división de rango, de Hash o por valor de atributo y toda la arriba en cualquier combinación.

Mi favorito es el uso de módulo para determinar el número de índice de esta manera:

Para el primer índice:

sql_query  = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 0 

Por segundo:

sql_query  = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 1 

Este método tiene algunas desventajas, pero en general, es un buen comienzo si no tienes muchos datos.

+0

Buena respuesta +1. – Yavar

+0

Gracias! Espero que esto ayude. – vfedorkov

+0

@vfedorkov Usé el mismo método que tú, teniendo múltiples índices y usando el operador de módulo (%) ... pero ¿podrías decirnos qué quieres decir con respecto al operador% que tiene inconvenientes? Tenemos más de 50 millones de palabras clave, utilicé este operador al indexar, pero parece estar bien ... aunque tardó aproximadamente 2 a 3 horas en indexarse. Tenemos alrededor de 8 índices, ya que estamos usando 8 núcleos para nuestro servidor. por lo tanto, utilicé id% 8 = 1, id% 8 = 2, etc. –

Cuestiones relacionadas