2012-01-16 17 views
5

por qué o cómo resolver el problema en mysql.MySQL SELECT es muy lento porque LONGBLOB

table xxx 
-> id primary key 
-> name varchar 255 
-> data longblob 

cuando se almaceno a esta mesa 100 archivos, cada uno de 100 MB, la mesa tendría 10GB

y luego tratar de seleccionar cualquier fila ... que se necesita para larga

SELECT name FROM xxx WHERE id = 50 LIMIT 1; 

toma aproximadamente 8 segundos

mi problema es probablemente en eso, mysql lee toda la fila antes de devolver name, que tiene solo 255 caracteres ... así que cuando quiero enumerar nombres de 100 archivos, m ysql lee 10 GB y devuelve aproximadamente 2 KB de resultado.

+0

StackExchange muestra una vista previa de su pregunta/respuesta mientras la escribe. Mire la vista previa y asegúrese de que el formato sea correcto. Si el código preformateado que escribe se muestra como una sola línea en la vista previa, así se verá para todos los demás. Por lo tanto, utilice el botón "muestra de código" para formatearlo correctamente (o simplemente coloque 4 espacios antes de cada línea y SE sepa que es código preformateado). –

Respuesta

6

Intente dividir los blobs en una tabla separada.

Por ejemplo, usted podría tener una tabla que contiene las columnas xxxid y name, y otra tabla que contiene las columnas xxx_dataid y data. Si solo desea el nombre, no necesita consultar la tabla xxx_data; si necesita tanto el nombre y los datos, puede unirse a las tablas entre sí utilizando la clave compartida primaria id:

SELECT id, name, data 
FROM xxx JOIN xxx_data USING (id) 
WHERE id = ... 

Para más ideas de la información y de optimización, véase, por ejemplo 10 tips for optimizing MySQL queries.

+2

Simplemente agregaría que debería considerar almacenar estos archivos en el sistema de archivos en su lugar en la base de datos. Por supuesto, hay razones para almacenarlos en la base de datos (como seguridad, fácil de eliminar, replica fácil en muchos servidores, etc.) pero imagine que desea devolver 10 archivos ... consulta la base de datos y luego almacena 10 * 100MB en el carnero. ¿Realmente desea consumir 1GB de RAM en su servidor solo para devolver los archivos, mientras que solo puede transmitirlos desde alguna ubicación en su servidor? Creo que sus archivos son demasiado grandes para almacenarse en la base de datos. –

+1

Si no necesita absolutamente los datos en la base de datos, también puede moverlos al sistema de archivos. Creo que esto funciona mejor cuando se trata de grandes cantidades de archivos o grandes. –