Red de conocimiento informático - Aprendizaje de código fuente - Descubra cómo almacenar bases de datos Oracle

Descubra cómo almacenar bases de datos Oracle

Imágenes de productos, avatares subidos por usuarios y otras imágenes. Actualmente existen dos métodos de almacenamiento de imágenes en la industria:

1. Almacenar imágenes directamente en formato binario en la base de datos.

Las bases de datos generales proporcionan campos binarios para almacenar datos binarios. Por ejemplo, hay un campo blob en MySQL. La base de datos Oracle es de 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. Utilice el programa PHP para convertir las imágenes leídas a formato binario. Luego use la instrucción insertar en para insertarlo en el campo de tipo blob de la tabla de datos.

3. Al tomar fotografías de la base de datos para mostrarlas. Luego envíe el contenido de la imagen directamente.

4.

$ fila = MySQL _ fetch _ object($ resultado

encabezado(" Tipo de contenido: imagen/gif "); /p>

echo $ row- gt; this _ image

El código de implementación es el siguiente:

$ PicturePath = '/tmp/xxxjgjgj jpg'; Supongamos que se trata de una imagen cargada, PHP la coloca en una carpeta temporal. El script se elimina automáticamente después de la ejecución.

$ img stream = fread(fopen($ PicturePath, "r));

$ blob _ img = fread(fopen($ img stream, "r"), tamaño de archivo( $PicturePath));

$ SQL = "INSERT INTO Images(this_image)VALUES($blob_img)";

Nota: this_image es un blob en el campo de la tabla de datos

= = = = = = = = = Saque el código para mostrar la imagen

$ resultado = MySQL _ Query(" SELECT * FROM Images WHERE PicNum = $ PicNum. ") o morir(" No puedo realizar la consulta ");

$ fila = MySQL _ fetch _ object($ resultado

header(" Tipo de contenido: imagen/gif ");

echo $ row- gt; this _ image

Resumen: Parece que es realmente problemático procesar el código. De hecho, nunca he usado el almacenamiento binario de imágenes en la base de datos. Usamos más rutas para almacenar imágenes, y las imágenes reales se guardan en el disco (poner el binario de la imagen en la base de datos es muy pesado para la base de datos)

Hasta donde yo sé, en el entorno de Internet. , se almacena una gran cantidad de imágenes en el disco. El acceso, la velocidad de la base de datos y el rendimiento son muy importantes. Generalmente, el método para almacenar imágenes en la base de datos es almacenar la ruta de la imagen en la base de datos. para conectar la ruta del disco para cargar la imagen. Pertenece a un campo grande. Una imagen puede tener entre 1 y varios metros.

Existe un principio: trate de no almacenar imágenes en la base de datos (es decir, no). guárdelos en formato binario, solo la ruta de la imagen). Los datos de campo aumentarán la carga de la base de datos y reducirán la velocidad de ejecución de la base de datos. Esto es muy importante en el caso de una gran cantidad de accesos simultáneos.

Es una experiencia. Eche un vistazo al análisis de DBA sobre el ajuste del rendimiento de la base de datos para obtener esta 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 de los artículos suele ser relativamente largo. Los campos de texto se utilizan a menudo para el almacenamiento. El contenido del artículo pertenece a un campo amplio. Generalmente, el contenido del artículo se puede dividir en una tabla. No lo almacene en la misma tabla que la información del artículo.

El principio que entiendo es que los datos de una tabla en mysql están en un archivo de datos. Si los datos de campos grandes también se almacenan en él. Lista de presentaciones de programas, como lista de artículos. No es necesario mostrar el contenido del artículo en este momento. Sin embargo, seguirá afectando la velocidad. La búsqueda de datos en una base de datos es en realidad escanear los archivos de datos. Cuanto menor sea el tamaño del archivo, más rápido (por qué la capacidad de una sola tabla se divide básicamente en 1g-2g). Divídalo en una tabla separada, que es un archivo separado. Creo que la idea de hacer inferencias a partir de un ejemplo y la separación independiente no solo se utiliza en el desarrollo de sistemas, sino que también existe a menudo en la vida real. Cuando se mezclan entre sí, se influyen mutuamente. Lo pequeño y lo simple es una filosofía.

Puedes leer este artículo traducido.

/art/201211/364472 .htm

El autor recomienda nunca poner tres cosas en la base de datos: imágenes, archivos y datos binarios. La razón del autor es que la velocidad de lectura/escritura de la base de datos nunca puede seguir el ritmo de la velocidad de procesamiento del sistema de archivos.

Las copias de seguridad de las bases de datos se vuelven grandes y consumen mucho tiempo

El acceso a los archivos debe pasar por la capa de aplicación y la capa de base de datos.

¿Guardar miniaturas en la base de datos? Genial, entonces no puedes manejarlo con nginx u otro tipo de servidor liviano.

Hágase un favor y simplemente almacene las rutas relativas a sus archivos en un disco en su base de datos, o use un servicio como S3 (Nota: Amazon Cloud Service) o una CDN.

============================================ = =================

Tipo de blob en mysql

Al igual que el tipo int, bolb también se divide en blob, MEDIUMBLOB y LONGBLOB . De hecho, desde pequeño,

Blob tiene una capacidad de 64 KB, MEDIUMBLOB tiene una capacidad de 16 M y LONGBLOB tiene una capacidad de 4G.

Para ser honesto, las imágenes rara vez se almacenan de esta manera. Utilice la función php serializar para serializar el valor. Vi que alguien lo puso en este campo.

Manual de PHP: serializar devuelve una cadena que contiene un flujo de bytes que representa el valor y se puede almacenar en cualquier lugar.

La imagen almacenada en el campo blob en mysql tiene una configuración de tamaño de comunicación:

Si la imagen se va a transferir al almacenamiento de mysql, 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.

Max_allowed_packet está en el archivo de configuración my.conf y el valor predeterminado de mysql es 1M.

Muchas imágenes, especialmente las originales, pueden tener más de 1 m. Los datos transferidos (es decir, la imagen) exceden el tamaño establecido. El resultado será incorrecto.

Jaja, hay muchas restricciones. Se siente tan problemático. Obviamente, esto requiere tiempo de comunicación con MySQL. La respuesta extendida lleva mucho tiempo. Simplemente lanzo una ruta de imagen "images/xxxx" a mysql. No consumir tantos recursos.

De hecho, lo más crítico sobre el rendimiento es el rendimiento de la base de datos. Porque a medida que aumentan los datos de la base de datos, la mayor parte del tiempo se pasa esperando 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 visitantes, el idioma específico no es el cuello de botella, el cuello de botella está todo en 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 en realidad las diferencias son muy pequeñas. Al menos no creo que sea obvio para los usuarios. La diferencia de ejecución es de 0,0001 segundos y no existe una diferencia obvia en la experiencia del usuario. Se puede decir que en momentos de gran concurrencia (muchos usuarios acceden al mismo tiempo), la diferencia se reflejará. 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. Realmente no puede reflejar la diferencia si no alcanza cierto nivel. La cantidad de datos de la base de datos alcanza un cierto nivel. Una diferencia de idioma de 0,001 s generará diferencias en la experiencia del usuario. Creo que es por eso que php es muy adecuado para el desarrollo web. Análisis rápido de páginas (lenguaje interpretado, no se requiere compilación). Puede utilizar Java para procesar 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. Esta es una ventaja de aprovechar la velocidad de ejecución de la página de PHP.

Realice una copia de seguridad de los datos de imágenes y migre datos cómodamente.

Las imágenes se almacenan en la base de datos en formato binario, lo que tiene una ventaja: una cómoda 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, migrar entornos es fácil.

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 realizar una copia de seguridad de las imágenes del disco.

Pero creo que los beneficios de la copia de seguridad no son obvios. El gráfico está en el disco y hacer una copia de seguridad del disco no es gran cosa. También es posible el embalaje y la 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 muy común intercambiar espacio por tiempo a cambio de velocidad, por lo que al diseñar una base de datos, a menudo no es necesario seguir los tres paradigmas principales del diseño de bases de datos tradicionales.

Si la ruta de la imagen se almacena en la base de datos, en realidad existe una mejor ventaja en el entorno de desarrollo web, que es la aceleración CDN. Aquí es donde se resume a continuación.

2. La ruta para guardar imágenes en la base de datos

Por lo general, se ve así:

La ruta se genera según el año, mes y día. . La posibilidad de generar rutas basadas en año, mes, día y año depende de sus propias necesidades (no necesariamente según la fecha).

Al comprender por qué la distribución en varias carpetas es clave, comprenderá un principio:

El sistema operativo tiene un límite en la cantidad de archivos en un solo directorio. Cuando hay muchos archivos. Obtener archivos del directorio será cada vez más lento. Por lo tanto, para mantener la velocidad, es necesario distribuirlo en varios directorios de acuerdo con reglas fijas.

Las imágenes están dispersas por la ruta del disco. Almacenado en el campo de la base de datos es "images/2012/09/25/1343287394783. jpg" similar a este.

El nombre del archivo de imagen cargado original se cambiará y se guardará, por ejemplo, generado según la marca de tiempo, 1343287394783.jpg. Esto es para evitar que aparezcan nombres de archivos duplicados cuando varias personas suben imágenes. al mismo directorio.

No importa qué reglas uses para nombrar las imágenes, siempre y cuando el nombre de la imagen sea único.

Por ejemplo, si el sitio web tiene un gran número de visitas simultáneas, mejor será crear un directorio con detalles mensuales. 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 guardarán las imágenes 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 sin sobrescribirlo, la generación puede continuar agregando milisegundos y microsegundos después de la marca de tiempo. La regla general es que cuanto mayor sea el número de accesos concurrentes. Cuanto más preciso sea.

Nunca me había encontrado con algo que requiriera tanta delicadeza. La probabilidad es relativamente pequeña.

En resumen, ¿por qué la ruta del disco guardado es "images/2012/09/25/1343287394783 . jpg" en lugar de "/images/2012/09/25/13483"?

Mi entendimiento:

Ni siquiera hay una barra. Esto también facilita la futura expansión del sistema.

Cuando necesites sacar la ruta de la imagen de la página para mostrarla, si es una ruta relativa, puedes usar ".// " images/2012/09/25/1343287394783 jpg. " para ensamblar.

p>

Si necesita un nombre de dominio separado (como cuando realiza la aceleración CDN), IMG1.xxx.com, IMG2.xxx.com y otros nombres de dominio

Ensamblar directamente "/ " images/2012/09/ 25/1343287394783 jpg "

Por supuesto, la base de datos se puede guardar con barras. /images/2012/09/25/1343287394783.jpg.

De hecho, no conviene unificar. Por ejemplo, al cargar una imagen en una ruta relativa, es "." "/images/2012/09/25/1343287394783 . jpg "

Tal vez aún no me he dado cuenta de la desventaja y la encontraré. problemas en el futuro. Pero es correcto seguir la convención sin agregar una barra diagonal "images/2012/09/25/1343287394783 . jpg".

Esto implica una nueva pregunta: ¿Por qué la mayoría de los sistemas no guardan nombres de dominio en la base de datos, como este /images/2012/09/25/1343287394783 jpg?

Una vez charlé con un internauta en Shanghai. Estaba acostumbrado a no guardar nombres de dominio en la base de datos. Pero cuando hablamos en ese momento, no tenía claros los pros y los contras de "guardar el nombre de dominio" y "no guardar el nombre de dominio". Sintió que no había ninguna diferencia discernible.

Cuanto más conocimiento sepamos, mejor será para nosotros tomar decisiones. Puede ser que bajo la influencia de "el sentimiento no es muy grande", tomar una decisión tenga un mayor impacto en el futuro. Al menos aumenta tu carga de trabajo.

De hecho, guardar nombres de dominio no es un crimen atroz. Pero ningún desarrollador experimentado haría esto. Se trata de una acumulación de experiencia, por lo que es normal que los internautas de Shanghai no tengan una idea clara de ello. Dijo que no sabía nada sobre CDN (por supuesto, no es 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 las operaciones, servidores y otros conocimientos. Pero ayuda saber algunas cosas.

Esto implica aceleración de CDN.

Sobre el principio de CDN (red de distribución de contenidos)

Cdn, entiendo que su esencia es solucionar el problema de velocidad provocado por la larga distancia y el uso de servicios cercanos.

Solicitar imágenes desde China a un servidor en Estados Unidos. En términos generales, es más lento porque la distancia es muy larga y hay pérdidas en la transmisión de la red. Cuanto mayor es la distancia, mayor es el tiempo de transmisión. Generalmente, verá "Respondido, transfiriendo datos..." en la esquina inferior izquierda del navegador. Esto no es un problema con el servidor en sí. De hecho, el servidor respondió a la solicitud y envió los datos al cliente. Pero por problemas de red sigue transmitiendo.

En China, esta es la 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 China Telecom y la mayoría de los usuarios del norte utilizan China Netcom. Las dos líneas deben cruzarse y habrá un retraso. Distancia de Beijing a Guangzhou, si se solicita directamente.

La aceleración de Cdn se ha adaptado a esta demanda: ahora no hay necesidad de un servidor estadounidense. Coloque directamente un nodo en China (nodo es un término general, puede entenderse como un servidor o sala de computadoras, solo un punto) y solicite un nodo cercano. De esta forma no habrá una distancia tan larga.

Recuerdo que en el pasado, en el sitio web de Changsha, las compras grupales se realizaban en forma de sucursales en la ciudad. Beijing y Changsha utilizan el mismo procedimiento. El servidor está en Changsha. Los usuarios de Beijing en realidad necesitan acceder al servidor de Changsha de forma remota cuando acceden al sitio de Beijing. No puede 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 el libro "Técnicas de optimización de front-end" e intente comprimir el código js, ​​almacenar en caché el navegador, etc. Realmente perder el tiempo.

Esto no quiere decir que estas optimizaciones frontales no sean importantes. Hay una contradicción en la filosofía y superaremos dondequiera que esté el cuello de botella. Si no se resuelve la principal contradicción, el problema no se solucionará. En ese momento, el cuello de botella de la base de datos aún no existía. Si optimiza la base de datos. No habrá ninguna mejora significativa. Son muchos datos. No es posible alcanzar el cuello de botella en absoluto. No hay una gran contradicción. Luego me fui a trabajar a otra empresa y entré en contacto con algunas cosas. Me han ocurrido varias veces ejemplos de optimización similares en los que no se descubrieron cuellos de botella. Optimicé a ciegas sin encontrar primero el cuello de botella. Puede que mis compañeros trabajen con la mentalidad de que cuanto 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 hubiera pensado que era una cuestión de distancia. No habría pensado en cdn. De hecho, no sabía nada sobre los servicios CDN en ese momento. Todo lo que sé es que Google debe haber implementado servidores en China. De lo contrario, cuando los usuarios chinos accedan a servidores en los Estados Unidos, no importa qué tan bueno sea el servidor, será muy lento.

Porque el costo de construir un entorno CDN y una sala de computadoras es relativamente grande (se requiere una gran cantidad de servidores) y también se requiere mantenimiento humano. La mayoría de las empresas no pueden permitírselo de todos modos, pero no es nada rentable. Taobao solía utilizar servicios CDN comerciales, pero luego ya no pudo soportarlos y construyó su propia red CDN. No sé si fue construido por la propia Sina. De hecho, creo que tiene algo que ver con las características de Taobao. Hay muchas tiendas. Ya sea un producto o un registro de transacción, hay muchas imágenes del producto y todas las imágenes son partes estáticas. CDN se utilizó originalmente para solicitudes de distribución estáticas (imágenes, css, js, etc.).

Vi una frase en Internet antes: la red CDN no es asequible para las empresas comunes.

El costo para las empresas comunes de construir sus propias redes CDN es alto, por lo que las CDN comerciales brindan servicios de alquiler pagado, que es un negocio muy maduro. Muchas de estas empresas y la mayoría de las empresas nacionales de Internet utilizan CDN.

Resumen: servicio cdn. Ideal para contenido estático. Al igual que las imágenes de productos, a medida que aumenta el tráfico, solo necesita cargar las imágenes en su servidor para alquilar un servicio CDN.

Ejemplo: Beijing está demasiado lejos para acceder al servidor de Changsha. Puedo poner imágenes de productos en servicios en la nube en Beijing (creo que el almacenamiento en la nube que se proporciona a los sitios web ahora es en realidad CDN, que proporciona desvío de tráfico y acceso a sitios web cercanos). De esta manera, cuando los usuarios de Beijing visitan, las fotografías se obtienen en realidad cerca. No hay necesidad de transmisión de larga distancia.

Utiliza el nombre de dominio img.xxxcom para cargar imágenes. Este nombre de dominio está resuelto para el servicio en la nube en Beijing.

Método: Lo que se guarda en la base de datos es "images/2012/09/25/1343287394783 . jpg".

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/134328794783 . jpg".

Por ejemplo, si hay varios, asígneles el nombre img1.xxcom e img2.xxcom.

No importa qué. Entonces, si guarda el nombre de dominio directamente. Muy problemático. La migración es engorrosa.

Cuando vemos solicitudes de sitios web de comercio electrónico como Taobao, Kefan y Amazon, normalmente tienen el siguiente contenido.

img1.xxx.cdncom

img2.xxx.cdncom

De hecho, se almacenan en la base de datos como rutas relativas. Algunos no necesitan guardarse en la base de datos y pueden ser miniaturas generadas por el programa cuando se accede a ellas en tiempo real (ahorrando mucho espacio de almacenamiento).

De hecho, mantener los nombres de dominio en la base de datos no favorece la 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. Simplemente cambie el nombre de dominio la próxima vez. En este punto, escriba su propia declaración SQL para actualizar los campos en lotes.

Algunos términos:

Icp, proveedor de contenidos de Internet, también es un proveedor de contenidos de red.

¿Crees que necesitamos la presentación ICP para operar un sitio web? Usted mismo opera el sitio web y es un proveedor de servicios icp.

IDC (Centro de Datos de Internet), Centro de Datos de Internet. No existe un estándar unificado para el concepto de IDC. El punto popular es proporcionar alojamiento de sala de ordenadores (alquiler y alojamiento de servidores), registro de nombres de dominio y similares.

Acerca del almacenamiento de imágenes de Taobao

Aprendí que Taobao usaba almacenamiento comercial antes. Pero no puede satisfacer la demanda. Se dice que en 2010, había 28,6 mil millones de imágenes en el backend de Taobao. Cuando los sistemas comerciales no satisfacen la demanda. Ellos mismos desarrollaron un tfs. La lectura de archivos pequeños de gran escala en el disco requiere que el cabezal magnético busque y cambie de pista con frecuencia. Tener muchas operaciones simultáneas puede resultar realmente problemático. 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 en red de archivos.

Una cosa está bien dicha: los jefes a menudo sienten que no hay nada que pueda resolverse con el dinero como problema. 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. Tuve que consultar algunas ideas para crear la técnica.

En tercer lugar, almacenamiento de imágenes en la nube (aceleración CDN)

He visto esto antes y es más adecuado para empresas de nueva creación. El precio es relativamente barato.

/

Como se mencionó en la introducción, 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 Education. Red en todo el país.

De hecho, la esencia del almacenamiento en la nube es un proveedor de servicios CDN. Usted carga las imágenes estáticas al servidor proporcionado por él (carga ftp o carga de programación API). Visita el nodo más cercano por usted.

Método de carga: paga según el tráfico, 99 yuanes por 100 g. Cómo calcular el tráfico. El tamaño de cada archivo al que se accede es acumulativo. Por ejemplo, para un archivo de 1 m, cada acceso aumentará el tráfico en 1 m.

Personalmente, entiendo que cuando la cantidad de imágenes no es grande, la ventaja de utilizar este servicio en la nube es que no ahorra espacio de almacenamiento. Es posible que la nueva empresa no pueda utilizar los 100 g de espacio de su propio servidor. No es porque el espacio de almacenamiento sea insuficiente, por lo que utiliza el almacenamiento en la nube. Antes era vago sobre CDN y lo entendía un poco, o pensé que era para distribuir la presión del tráfico del servidor web y desviar el 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: permitir a los usuarios acceder al nodo más cercano con velocidad acelerada.

Creo que si no fuera por esta consideración, este objetivo no se alcanzaría. También se pueden sustituir completamente otras opciones. ¿Por qué utilizar el almacenamiento en la nube? Es decir, siempre que tenga la capacidad de implementar servicios en múltiples nodos en todo el país, puede alquilar una CDN para que lo ayude. Después de todo, son los beneficios de escalar y centrarse en resolver esta área.