2010-02-11 15 views
6

Estoy trabajando en un sistema de gestión de contenido PHP y, al probarlo, he notado que bastantes de las tablas MySQL del sistema se consultan en casi todas las páginas pero rara vez se escriben a. Lo que me pregunto es si esto comenzará a pesar mucho en la base de datos a medida que aumente el tráfico del sitio, y ¿cómo puedo resolverlo/prevenirlo?Almacenamiento de datos de acceso frecuente en un archivo en lugar de MySQL

Mis pensamientos iniciales eran comenzar a almacenar algunos de los datos más estáticos en los archivos (utilizando la serialización de PHP), pero ¿esto realmente reduce la carga del servidor? Lo que me preocupa es que simplemente estaría transfiriendo la alta carga de la base de datos al sistema de archivos.

Si alguien pudiera darme una pista sobre el mejor enfoque, sería genial. En caso de que el volumen de datos en sí tiene un gran efecto, he detallado algunos de los datos que voy a almacenar a continuación:

  • lista completa de países (incluyendo código de país ISO)
  • opciones del sitio (piel , correo electrónico del administrador, las direcciones URL de apoyo, etc.)
  • de Usuarios (incluyendo permisos)

Respuesta

13

Hay que recordar que la lectura de una tabla de una base de datos en un servidor de gran alcance y en una conexión rápida es probable que sea más rápido que su lectura desde el disco en su local, máquina. La base de datos almacenará en caché la totalidad de estas pequeñas tablas de acceso regular en la memoria.

Al implementar la misma funcionalidad usted mismo en el sistema de archivos, solo hay una pequeña aceleración posible, pero una gran posibilidad de estropearla y hacerla más lenta.

Probablemente sea mejor seguir usando la base de datos.

+1

Genial, gracias. ¡Creo que fue bastante unánime que debería seguir usando MySQL! – Rowan

2

las bases de datos son mucho mejores en el manejo de grandes volúmenes de datos que el sistema de archivos nativo.

No se preocupe por optimizar su sitio para reducir la carga del servidor, hasta que tenga un problema de carga del servidor. :-)

1

Si su base de datos está indexada correctamente, será mucho más rápido consultar los datos de la base de datos. Si quieres acelerar eso, mira en memcached o similar.

2

Las tablas que usted mencionó (países y usuarios) normalmente serán almacenadas en la memoria caché por MySQL a menos que espere unos pocos millones de registros en estas tablas.

En caso de que estas tablas no quepan en la memoria, es posible que desee considerar un sistema de memoria caché de memoria distribuida de uso general, como memcached.

5
  1. Optimice sus consultas (utilizando el registro de consultas lentas mysql) y la función EXPLAIN.

  2. Si las tablas rara vez se escriben en usted puede utilizar el almacenamiento en caché MySQL nativo. No tiene nada que cambiar en su código, simplemente habilite el almacenamiento en caché de mysql en my.conf.

  3. Pruebe usar el motor de plantillas como Smarty (smarty.net). Tiene su propio sistema de caché que funciona bastante bien y REALMENTE reducirá la carga del servidor.

  4. También puede usar Memcache, pero realmente vale la pena usarlo solo con sitios web con mucha carga. (Creo que Smarty será suficiente.)

+1

Definitivamente, eche un vistazo al caché de mysql, si la misma consulta se realiza a menudo, se puede mantener en RAM, que es mejor que cualquier sistema de archivos. Siempre deje que los profesionales hagan este tipo de cosas. – Karl

+0

Es mejor usar un motor de plantilla, que simplemente compila una plantilla para PHP simple y deja que el DB haga el trabajo –

1

Las bases de datos son exactamente para este propósito .. Para almacenar y proporcionar datos. El sistema de archivos es para scripts y programación.

Si encuentra problemas de carga, considere el uso de Memcached u otra utilidad para la base de datos.

También puede considerar tratando de caché diferentes partes de su página directamente en la base de datos como secciones enteras (por ejemplo, una barra lateral., Que no cambia demasiado, la sección de cabecera generado, ..)

+0

No creo que poner algo de HTML generado a DB sea una buena idea (sí, a veces es bueno, pero depende de ello). La mejor manera es almacenar en caché las secciones generadas en el disco (ver mi respuesta). – Kirzilla

+0

Depende .. A veces es mejor utilizar la base de datos y su caché interna (+ memcache), a veces es mejor usar el sistema de archivos con la ayuda de APC u otro acelerador. También estoy de acuerdo con la respuesta de 'Mark Byers, que usar bases de datos es una apuesta segura –

0

se podría almacenar en caché la salida (flush(), ob_flush() etc.) en un archivo y include que en lugar de tener múltiples lecturas de MySQL. el almacenamiento en caché es definitivamente más rápido que acceder a MySQL varias veces.

leer un archivo estático es mucho más rápido que agregar sobrecarga mediante el procesamiento de php y mysql.

0

Debe evaluar el rendimiento mediante la prueba de carga para evitar prematurely optimising.

Sería insensato y muy posiblemente aumentar la carga general para almacenar datos en archivos con serialización, las bases de datos son realmente buenas para recuperar datos.

Si después del análisis hay un verdadero golpe de rendimiento (que dudo a menos que esté hablando de carga masiva), entonces el almacenamiento en caché es una mejor solución.

Es más importante tener un sistema bien diseñado que facilite los cambios a medida que surjan las necesidades.

0

Aquí hay un enlace a un guión pareja que esencialmente hará lo que dusoft está hablando y caché de la memoria intermedia de salida a un archivo:

http://www.addedbytes.com/articles/caching-output-in-php/

utiliza de esta manera, es más de un perno-situ tipo de solución después de los hechos, pero este mismo comportamiento ciertamente puede implementarse de una manera más integrada si se lo considera anteriormente en el proceso. Muchos frameworks también tienen este tipo de cosas incorporadas.

Cuestiones relacionadas