Explore cómo la base de datos Oracle almacena imágenes
Imágenes de productos, avatares subidos por los usuarios y otras imágenes. Actualmente, existen dos formas de almacenar imágenes en la industria:
1. Almacenar imágenes directamente en formato binario en la base de datos.
Generalmente, las bases de datos proporcionan un campo binario para almacenar datos binarios. . Por ejemplo, hay un campo blob en MySQL. En la base de datos Oracle, es tipo blob o bfile
2. La imagen se almacena en el disco y la ruta de la imagen se guarda en el campo de la base de datos.
1. Las imágenes se almacenan directamente en la base de datos en formato binario
La primera implementación de almacenamiento (lenguaje PHP):
Idea general:
1. Convierta la imagen leída a formato binario usando el programa PHP. Luego combine la instrucción insertar en para insertarla en el campo de tipo de blob en la tabla de datos.
3. Al sacar fotografías de la base de datos para mostrarlas. Luego envíe el contenido de la imagen directamente
4.
$row=mysql_fetch_object($resultado);
Header( "Tipo de contenido: imagen/gif") ;
echo $row-gt;this_image;
El código de implementación es el siguiente:
$PicturePath = '/tmp/xxxjgjgj.jpg';/ /Supongamos que esto es una imagen cargada y php está colocado en una carpeta temporal. Se elimina automáticamente después de ejecutar el script.
$imgStream = fread(fopen($PicturePath, "r");
$blob_img = fread(fopen($imgStream, "r"), tamaño de archivo($PicturePath)) ;
$sql =” INSERT INTO Images (this_image) VALUES ($blob_img)”;
Nota: this_image es un campo de tipo blob en la tabla de datos
================Obtener el código de la imagen para mostrar
$result=mysql_query("SELECT * FROM Images WHERE PicNum=$PicNum") o morir( " No se puede realizar la consulta");
$row=mysql_fetch_object($resultado);
Encabezado( "Tipo de contenido: imagen/gif");
echo $row-gt; this_image;
Resumen: Se siente realmente problemático procesar el código. De hecho, nunca he usado el almacenamiento binario de imágenes en la base de datos. Lo usamos más para almacenar imágenes. , la imagen real se guarda en el disco (la imagen binaria se coloca en la base de datos, lo que aumenta la carga sobre la base de datos
Hasta donde yo sé, en el entorno de Internet, hay una gran cantidad de). visitas, la velocidad y el rendimiento de la base de datos. Este aspecto es muy importante. Generalmente, el método para almacenar imágenes en la base de datos es menor y el método para almacenar la ruta de la imagen en la base de datos es mayor. conecte la ruta del disco y cargue la imagen porque la imagen es un campo grande. Una imagen puede tener entre 1 y varios metros de largo.
Hay un principio: trate de no almacenar imágenes en la base de datos (es decir, no). guardarlos en formato binario, pero solo guarde la ruta de la imagen). Aumentará la carga de la base de datos y la ralentizará. Esto es importante en el caso de un gran acceso simultáneo.
Si observa el análisis de DBA sobre el ajuste del rendimiento de la base de datos, obtendrá la respuesta: no almacene imágenes en la base de datos.
Al igual que esta regla: los artículos se dividen en título, autor, hora de adición, hora de actualización, contenido del artículo y palabras clave del artículo.
El contenido del artículo es generalmente relativamente largo. Los campos de texto se utilizan a menudo para el almacenamiento. El contenido del artículo pertenece al gran campo. Generalmente, el contenido del artículo se puede dividir en una tabla separada. No almacene información del artículo en la misma tabla.
El principio que entiendo es: los datos de una tabla en MySQL están todos en un solo archivo de datos. Si los datos de campos grandes también se almacenan en él. El programa muestra una lista, como una lista de artículos. No es necesario mostrar el contenido del artículo en este momento. Pero aún afectará la velocidad. La búsqueda de datos en la base de datos es en realidad escanear el archivo de datos. Cuanto más pequeño sea el tamaño del archivo, más rápida será la velocidad (por qué la tabla única se divide básicamente en tablas cuando la capacidad es de 1 g a 2 g). ). Divídalo en una tabla separada, que es un archivo separado. Siento que la idea de hacer inferencias de un ejemplo y ser independientes y separados entre sí no solo se usa en el desarrollo de sistemas, sino que también existe a menudo en la vida real. Mezclarse entre sí provocará una influencia mutua. Pequeño, conciso es un pensamiento.
Puedes leer este artículo traducido,
/art/201211/364472.htm
El autor recomienda que estas tres cosas nunca se coloquen en la base de datos. , imágenes, archivos, datos binarios. La razón del autor es que
La velocidad de lectura/escritura en la base de datos nunca puede seguir el ritmo de la velocidad de procesamiento del sistema de archivos
La copia de seguridad de la base de datos se ha vuelto enorme y consume cada vez más tiempo
El acceso a los archivos debe pasar por la capa de aplicación y la capa de base de datos
¿Guardar miniaturas de imágenes en la base de datos? Genial, entonces no puedes usar nginx u otro tipo de servidor liviano para manejarlos.
Hazlo más fácil para ti, simplemente almacena la ruta relativa de tu archivo en el disco de la base de datos o utiliza un servicio como S3 (nota: Amazon Cloud Service) o CDN.
============================================ === =================
Acerca del tipo blob en mysql
bolb, al igual que el tipo int, se divide en blob , MEDIUMBLOB y LONGBLOB . De hecho, de pequeño a grande, la capacidad de blob es de 64 KB, la capacidad de MEDIUMBLOB es de 16 M y la capacidad de LONGBLOB es 4G.
Para ser honesto, las imágenes almacenadas de esta manera rara vez se utilizan. Usando la función PHP serializar para serializar el valor, vi a alguien almacenándolo en este campo.
php manual: serializar devuelve una cadena. Esta cadena contiene un flujo de bytes que representa el valor y se puede almacenar en cualquier lugar.
Existe una configuración de tamaño de comunicación para almacenar imágenes en el campo blob en mysql:
Si la imagen se va a transferir a mysql para su almacenamiento, es necesario involucrar la comunicación de datos. Existe una configuración en mysql que limita el tamaño de los datos de comunicación.
Para max_allowed_packet en el archivo de configuración my.conf, el valor predeterminado de mysql es 1M.
Muchas imágenes, especialmente las originales, pueden tener una longitud superior a 1m. Los datos transferidos (es decir, las imágenes) superan este tamaño de configuración. El resultado será incorrecto
Jaja, hay muchas restricciones. Se siente tan problemático. Obviamente, esto requiere tiempo de comunicación al interactuar con MySQL. Se ha ampliado el tiempo de respuesta. Envío directamente la ruta de la imagen "images/xxxx" a mysql. No requiere tantos recursos.
De hecho, el llamado rendimiento, lo más crítico es el rendimiento de la base de datos. Porque a medida que aumenta la cantidad de datos de la base de datos, la mayor parte del tiempo se dedica al proceso de esperar a que la base de datos devuelva datos en lenguajes como PHP y Java.
Después de que el sitio web tiene una gran cantidad de visitas, el idioma específico no es el cuello de botella, el cuello de botella es la base de datos. Puede utilizar c, php, java y net para operar la base de datos mysql para obtener datos. Puede haber diferencias en la velocidad de ejecución entre idiomas, pero de hecho esta diferencia ya es muy pequeña. Al menos creo que no es obvio para los usuarios. No hay una diferencia obvia en la percepción del usuario si la diferencia de ejecución es de 0,0001 segundos. Se puede decir que la diferencia se reflejará cuando haya una gran concurrencia (muchos usuarios acceden al mismo tiempo). De hecho, creo que un gran acceso simultáneo es el cuello de botella de la base de datos. Espere a que la base de datos proporcione los datos. No alcanzar un cierto nivel realmente no hace ninguna diferencia. La cantidad de datos de la base de datos alcanza un cierto nivel. Una diferencia de idioma de 0,001 s hará que la experiencia del usuario sea diferente. Creo que es por eso que PHP es muy adecuado para el desarrollo web. El análisis de páginas es rápido (lenguaje interpretado, no se requiere compilación). Puede utilizar Java para manejar la base de datos y obtener datos. PHP no opera directamente la base de datos, sino que llama a la interfaz de datos proporcionada por Java para obtener datos y mostrarlos en la página inmediatamente. Esto aprovecha la rápida velocidad de ejecución de páginas de PHP.
Es conveniente hacer una copia de seguridad de los datos de la imagen y migrar datos.
Las imágenes se almacenan en la base de datos en forma binaria, lo que tiene una ventaja: es conveniente realizar una copia de seguridad. Haga una copia de seguridad de la base de datos directamente y también se realizará una copia de seguridad de las imágenes. En otras palabras, es conveniente a la hora de migrar entornos.
Si la imagen se coloca en el disco, solo la ruta de la imagen se almacena en la base de datos. Después de hacer una copia de seguridad de la base de datos. También se debe hacer una copia de seguridad de las imágenes del disco.
Pero creo que el beneficio de la copia de seguridad no es muy obvio. Las imágenes están en el disco, por lo que no es gran cosa hacer una copia de seguridad del disco. También se encuentran disponibles embalaje y compresión. Después de todo, el entorno de Internet es diferente del desarrollo de software tradicional y presta más atención a la velocidad del sitio web. Esa es la velocidad de la base de datos. Al igual que en el desarrollo de Internet, a veces es común intercambiar espacio por tiempo en aras de la velocidad, por lo que los tres paradigmas principales del diseño de bases de datos tradicionales a menudo no se siguen necesariamente al diseñar una base de datos.
Si la ruta de la imagen se guarda en la base de datos, en un entorno de desarrollo web, en realidad existe una mejor ventaja: la aceleración CDN. Aquí es donde se hará el resumen a continuación.
2. Guarde la ruta de la imagen en la base de datos
Generalmente se ve así:
Genere la ruta según el año, mes y día. Específicamente, generar la ruta según año, mes, día o año y mes depende de sus propias necesidades (no necesariamente según la fecha).
La clave es comprender por qué es necesario distribuirlo en varias carpetas. Implica un principio:
El sistema operativo tiene un límite en la cantidad de archivos en un solo directorio. . Cuando la cantidad de archivos es grande. La recuperación de archivos del directorio será cada vez más lenta. Por lo tanto, para mantener la velocidad, debe distribuirse en varios directorios de acuerdo con reglas fijas.
Las imágenes están dispersas en la ruta del disco. Lo que se guarda en el campo de la base de datos es algo como esto: "images/2012/09/25/ 1343287394783.jpg"
El nombre del archivo de imagen original cargado se cambiará de nombre y se guardará, por ejemplo, generado según la marca de tiempo, 1343287394783 .jpg. Esto es para evitar la duplicación de nombres de archivos, lo que puede ocurrir cuando varias personas cargan imágenes en el mismo directorio.
No importa qué reglas uses para nombrar las imágenes, siempre y cuando los nombres de las imágenes sean únicos.
Por ejemplo, si un sitio web tiene un gran número de visitas simultáneas, cuanto más detallada sea la generación del directorio, mejor. Por ejemplo, tiene una precisión de hora y una hora puede ser una carpeta. Al mismo tiempo, dos usuarios cargan imágenes al mismo tiempo en 0,001 segundos (porque entonces las imágenes se almacenarán en la misma carpeta de horas). Porque la marca de tiempo tiene una precisión de segundos. Para que el nombre de la imagen sea único y evitar la sobrescritura, la generación puede continuar agregando milisegundos, microsegundos, etc. después de la marca de tiempo. La regla general es que cuanto mayor sea el número de visitas simultáneas. Cuanto más preciso sea, mejor.
Aún no me he encontrado con nada que requiera tanta precisión. La probabilidad es relativamente pequeña.
Para resumir: por qué la ruta del disco guardado es "images/2012/09/25/1343287394783.jpg" en lugar de "/images/2012/09/25/ 1343287394783.jpg" (con una barra en desde el principio)
Mi entendimiento:
Ni siquiera necesito esa barra. Esto también se hace para facilitar la futura expansión del sistema.
Cuando necesite eliminar la ruta de la imagen para mostrar la imagen en la página, si es una ruta relativa, puede usar "./" "images/2012/09/25/1343287394783.jpg "para el montaje.
Si necesita un nombre de dominio separado (como cuando realiza la aceleración CDN), nombres de dominio como img1.xxx.com e img2.xxx.com,
Ensamble "/" directamente images/2012/09/25/1343287394783.jpg”
Por supuesto, la base de datos se puede guardar con una barra diagonal / delante, /images/2012/09/25/ 1343287394783.jpg
De hecho, no conviene unificar. Por ejemplo, al cargar imágenes usando una ruta relativa, es "." "/images/2012/09/25/ 1343287394783.jpg"
Quizás aún no me he dado cuenta de las desventajas y las haré. encontrar problemas en el futuro. Sin embargo, simplemente siga la convención y omita la barra diagonal "images/2012/09/25/1343287394783.jpg".
Involucra una nueva pregunta: ¿por qué la mayoría de los sistemas no guardan el nombre de dominio, sino que lo guardan en la base de datos de esta manera /images/2012/09/25/1343287394783.jpg
I Una vez charlé con un internauta en Shanghai y también estaba acostumbrado a no guardar nombres de dominio en la base de datos. Pero cuando charlamos en ese momento, no tenía claros los pros y los contras de "guardar el nombre de dominio" y "hacerlo sin guardar el nombre de dominio". Sintió que no había una diferencia obvia.
Cuanto más conocimiento tengamos, mejor nos resultará tomar decisiones. Puede ser que bajo la influencia de "no siento que la diferencia sea muy grande", tome una decisión, pero tendrá un mayor impacto en el futuro. Al menos aumenta mi carga de trabajo.
De hecho, guardar el nombre de dominio no es un delito grave. Pero ningún desarrollador experimentado haría esto. Esto se acumula a través de la experiencia, por lo que es normal que los internautas en Shanghai no tengan una idea clara al respecto. Dijo que no sabía nada sobre CDN (por supuesto, pensó que no era gran cosa guardar un nombre de dominio). Debe comprender el conocimiento de la CDN y en qué circunstancias se utilizará el conocimiento de la CDN.
Aunque soy desarrollador, no necesito prestar atención a conocimientos como operación, mantenimiento y servidores. Pero será útil entenderlo si sabes un poco.
Esto implica aceleración cdn.
Sobre el principio de CDN (es decir, red de distribución de contenido)
CDN, entiendo que su esencia es resolver el problema de velocidad causado por la larga distancia y el uso de servicios cercanos.
Solicitar imágenes a un servidor de Estados Unidos desde China. Generalmente es más lento, debido a que la distancia es tan larga, hay una pérdida en la transmisión de la red. Cuanto mayor es la distancia, mayor es el tiempo de transmisión. Generalmente, verá en la esquina inferior izquierda del navegador: "Respondida, se están transfiriendo datos...". Esto no es un problema con el servidor en sí. De hecho, el servidor respondió a la solicitud y envió los datos al cliente. Sin embargo, debido a problemas de red, la transmisión continuó y no se completó.
En China, el problema es la gran distancia entre el norte y el sur. También habrá interconexión de redes entre el norte y el sur. La mayoría de los usuarios del sur utilizan las telecomunicaciones, mientras que la mayoría de los usuarios del norte utilizan China Netcom. Es necesario cruzar dos líneas y habrá un retraso. La distancia entre Beijing y Guangzhou, si la solicitas directamente, se genera aceleración cdn para cubrir esta demanda: ahora no solicita servidores en Estados Unidos.
Coloque nodos directamente en China (nodo es un término relativamente general, puede entenderse como un servidor, o puede entenderse como una sala de computadoras, solo un punto) y solicite nodos que estén cerca entre sí. De esta forma no necesitas una distancia tan larga.
Recuerdo que en el sitio web anterior en Changsha, las compras grupales se hacían en forma de sucursales en la ciudad. Beijing y Changsha utilizan el mismo procedimiento. El servidor está en Changsha. Cuando los usuarios de Beijing visitan el sitio web de Beijing, en realidad necesitan acceder al servidor en Changsha desde una larga distancia. No puedo ir más rápido. No tiene nada que ver con el rendimiento del servidor. No entendí esto en ese momento. No sé cómo meterse con eso. Lea "Habilidades de optimización de front-end" y piense en formas de hacer cosas como la compresión de código js, el almacenamiento en caché del navegador, etc. En realidad, bromeando. Esto no quiere decir que estas optimizaciones iniciales no sean importantes. En filosofía, existen contradicciones primarias y secundarias, y se deben lograr avances dondequiera que esté el cuello de botella. Si no se resuelve la principal contradicción, el problema no se solucionará. En ese momento no era un cuello de botella en la base de datos. Si desea optimizar la base de datos. No mejorará significativamente. Sólo esa cantidad de datos. El cuello de botella simplemente no se alcanza. ¿Dónde podemos hablar de la principal contradicción? Más tarde, cuando fui a trabajar a otras empresas y entré en contacto con algunas cosas, ocurrieron varias veces a mi alrededor ejemplos similares de optimización sin encontrar cuellos de botella, simplemente optimicé ciegamente sin encontrar cuellos de botella. Puede que mis compañeros lo hayan hecho con la mentalidad de que cuantos más, mejor, pero la principal contradicción (técnicamente hablando, el cuello de botella) no se ha encontrado ni se ha mejorado.
Si no pensé que era una cuestión de distancia en ese momento. No habría pensado en CDN. En ese momento, en realidad no sabía nada sobre los servicios de CDN. Todo lo que sé es que sitios web como Google deben tener servidores implementados en China. De lo contrario, si los usuarios chinos aún acceden a servidores en los Estados Unidos, no importa qué tan bueno sea el servidor, la velocidad será lenta.
Dado que cuesta mucho dinero construir su propio entorno CDN y sala de computadoras (lo que requiere una gran cantidad de servidores), también requiere mano de obra para el mantenimiento. De todos modos, las empresas corrientes no pueden permitírselo. De hecho, no es nada rentable. Taobao solía utilizar servicios CDN comerciales, pero luego los comerciales ya no pudieron soportarlo, por lo que construyeron su propia red CDN. No sé si Sina lo construyó ella misma, pero en realidad creo que tiene algo que ver con las características de Taobao. Ya sean productos o registros de transacciones, hay muchas imágenes de los productos. Las imágenes son todas partes estáticas. CDN se usa originalmente para fines estáticos (Imágenes, css, js, etc.) para la distribución de solicitudes.
Vi una frase en Internet antes: la red CDN no es algo que las empresas comunes y corrientes puedan permitirse.
Para las empresas en general es costoso construir sus propias redes CDN, por lo que existen CDN comerciales que brindan servicios de alquiler pagado. Este es un negocio muy maduro. Hay muchas empresas de este tipo y la mayoría de las empresas nacionales de Internet lo harán. Utilice CDN.
Resumen: servicio cdn. Es muy adecuado para contenido estático. Entonces, para las imágenes de productos, a medida que aumenta el número de visitas, puede alquilar un servicio CDN y solo necesita cargar las imágenes en su servidor.
Ejemplo: Cuando Beijing accede al servidor de Changsha, la distancia es demasiado grande. Definitivamente puedo poner las imágenes del producto en el servicio en la nube en Beijing (creo que el almacenamiento en la nube que se proporciona actualmente para los sitios web es en realidad CDN, que proporciona desvío y acceso cercano para los sitios web). De esta manera, cuando los usuarios de Beijing visitan el lugar, las fotografías se obtienen en realidad cerca. No se requiere transmisión de larga distancia.
Utilice un nombre de dominio img.xxxcom para cargar imágenes. Este nombre de dominio está resuelto para el servicio en la nube en Beijing.
Cómo hacerlo: "images/2012/09/25/1343287394783.jpg" se guarda en la base de datos.
Estas imágenes en realidad no se almacenan en el servidor web. Subir al servidor cdn en Beijing.
Lo saqué de la base de datos y directamente "img.xxxcom/" "images/2012/09/25/1343287394783.jpg"
Por ejemplo, si hay más de uno, asígnale el nombre img1 .xxcom, img2.xxcom
De todos modos, puedes hacer lo que quieras. Entonces, si guarda el nombre de dominio directamente. Parece muy problemático. Problemas migratorios.
Sitios web de comercio electrónico como Taobao, Fanke y Amazon, cuando vemos solicitudes, a menudo habrá
img1.xxx.cdncom
img2. xxx.cdncom
De hecho, se almacenan en rutas relativas en la base de datos. Algunos no necesitan guardarse en la base de datos. Los programas pueden generar miniaturas cuando se accede a ellos en tiempo real (ahorrando mucho espacio de almacenamiento).
De hecho, guardar nombres de dominio en la base de datos es muy perjudicial para la salud. migración del sistema. Una vez que se cambia el nombre de dominio, el original guardado en la base de datos es "wwwabc.om/images/xxxxxx" porque la ruta está codificada en la base de datos. Si cambia el nombre de dominio la próxima vez, no podrá utilizarlo. En ese momento, puede escribir declaraciones SQL para actualizar campos en lotes.
Algunos términos:
icp, Proveedor de Contenido de Internet, es decir, un proveedor de contenido de red. ¿Crees que necesitamos la presentación ICP para operar un sitio web? Si usted mismo opera el sitio web, usted es el proveedor de servicios icp
IDC (Centro de datos de Internet), centro de datos de Internet. Actualmente no existe un estándar unificado para el concepto de IDC. En términos sencillos, significa proporcionar alojamiento de sala de ordenadores (alquiler y alojamiento de servidores), registro de nombres de dominio, etc.
Acerca del almacenamiento de imágenes de Taobao
Aprendido: Taobao utilizó almacenamiento comercial en el pasado. Pero no pudo satisfacer la demanda. Se dice que en 2010, el backend de Taobao almacenaba 28,6 mil millones de imágenes. Cuando los sistemas comerciales no pueden satisfacer las necesidades. Ellos mismos desarrollaron un tfs. La lectura de archivos pequeños a gran escala en el disco requiere buscar y cambiar frecuentemente los cabezales del disco. Es realmente problemático en situaciones de gran concurrencia y una gran cantidad de operaciones. De hecho, se basó en el artículo de diseño gfs publicado por Google en ese momento. Google tiene un servicio de álbum de fotos. Proporcionar almacenamiento de imágenes cargadas para cada usuario.
Se estima que Google fue el primero en implementar este pequeño sistema de almacenamiento de archivos en red.
Hay un punto de vista mejor: los jefes a menudo sienten que los problemas que pueden resolverse con dinero no son problemas. Pero el problema es que nadie más ha encontrado el problema que usted encontró. Entonces, en este momento no tienes experiencia para consultar o utilizar directamente. Sólo puedes crear tecnología haciendo referencia a algunas ideas.
3. Acerca del almacenamiento de imágenes en la nube (aceleración cdn)
He visto esto antes y es más adecuado para empresas emergentes. El precio es relativamente barato
/
La introducción mencionó que hemos implementado 55 nodos CDN, más de 500 servidores y ancho de banda de 4 líneas de China Telecom, China Unicom, China Mobile. y Red de Educación en todo el país.
De hecho, el almacenamiento en la nube actual es esencialmente un proveedor de servicios CDN. Usted carga las imágenes estáticas al servidor proporcionado por él (cargue a través de ftp o cargue a través del programa API). Le proporciona acceso al nodo más cercano.
Método de facturación: paga según el tráfico, 99 yuanes por 100 g. Cómo calcular el tráfico. El tamaño del archivo se acumula cada vez que se accede a él. Por ejemplo, para un archivo de 1 m, el tráfico aumentará en 1 m cada vez que se acceda.
Personalmente, entiendo que cuando la cantidad de imágenes no es grande, el beneficio de utilizar este servicio en la nube no es ahorrar espacio de almacenamiento. Es posible que las empresas emprendedoras no utilicen el espacio de 100 g de su propio servidor. No es porque el espacio de almacenamiento sea insuficiente, así que utilice el almacenamiento en la nube. En el pasado, tenía una comprensión vaga de CDN, o pensaba que era para dispersar la presión del flujo del servidor web del sitio web y la descarga del servidor. Los beneficios están ahí. Sin embargo, siempre que comprenda los antecedentes de CDN y los problemas clave que resuelve, comprenderá que el beneficio clave del almacenamiento en la nube es brindar a los usuarios acceso a nodos cercanos y acelerarlo.
Creo que si no fuera por esta consideración no sería capaz de lograr tal propósito. Puede ser reemplazado completamente por otras soluciones. ¿Por qué utilizar el almacenamiento en la nube? Solo si tiene la fuerza para implementar servicios en múltiples nodos en todo el país, necesitará alquilar una CDN para ayudarlo. Después de todo, son los beneficios de la escala y el enfoque en resolver esta área.