usuarios usar una txt tipos texto tabla registro plano mostrar guardar formulario enviar ejemplo datos crear como archivo php mysql logging append fwrite

php - usar - tipos de datos en base de datos sql



¿Qué es más eficiente: almacenar registros en bases de datos o archivos de SQL? (9)

Comentando sobre sus hallazgos.

Respecto a la escritura en el archivo probablemente tengas razón.
Respecto a la lectura estás muy equivocado.

Escribir en una base de datos:

  1. MyISAM bloquea toda la tabla en las inserciones, lo que provoca una contención de bloqueo. Utilice InnoDB, que tiene bloqueo de fila.
  2. Contrario a 1. Si desea realizar búsquedas de texto completo en el registro. Usa MyISAM, soporta índices de texto completo.
  3. Si quieres ser realmente rápido puedes usar el motor de memory , esto escribe la tabla en la memoria RAM. Transfiera los datos a una tabla basada en disco cuando la carga de la CPU sea baja.

Leyendo de la base de datos

Aquí es donde la base de datos realmente brilla.
Puede combinar todo tipo de información de diferentes entradas, mucho más rápido y más fácil que nunca de un archivo plano.

SELECT logdate, username, action FROM log WHERE userid = ''1'' /*root*/ AND error = 10;

Si tiene índices en los campos utilizados en la cláusula where el resultado se recuperará casi instantáneamente, intente hacerlo en un archivo plano.

SELECT username, count(*) as error_count FROM log WHERE error <> 0 GROUP BY user_id WITH ROLLUP

No importa el hecho de que la tabla no esté normalizada, esto será mucho más lento y difícil de hacer con un archivo plano.
Es un pan comido realmente.

Tengo algunos scripts cargados por cron muy a menudo. En este momento no almaceno ningún registro, por lo que si un script no se carga, no lo sabré hasta que vea los resultados, e incluso cuando me doy cuenta de que los resultados no son correctos, no puedo hacer nada porque no lo hago. No sé qué script falló.

He decidido almacenar registros, pero todavía no estoy seguro de cómo hacerlo. Entonces, mi pregunta es: ¿qué es más eficiente, almacenar registros en bases de datos o archivos de SQL?

Puedo crear la tabla de "registros" en mi base de datos mysql y almacenar cada registro en una fila separada, o simplemente puedo usar file_put_contents de php o fopen / fwrite para almacenar registros en archivos separados.

Mis scripts agregarían aproximadamente 5 registros (en total) por minuto mientras trabajaba. He hecho algunas pruebas para determinar qué es más rápido: fopen / fwrite o el inserto de mysql. Hice un bucle con una declaración de "inserción" 3000 veces para hacer 3000 filas y un bucle fopen / fwrite 3000 veces para hacer 3000 archivos con texto de ejemplo. Fwrite ejecutó 4-5 veces más rápido que el inserto de SQL. Hice un segundo bucle: hice un bucle con una declaración de ''selección'' y la asigné a una cadena 3000 veces. También abrí 3000 archivos con ''fopen'' y asigné los resultados a la cadena. El resultado fue el mismo: fopen / fwrite terminó la tarea 4-5 veces más rápido.

Entonces, para todos los programadores experimentados, ¿cuál es su experiencia con el almacenamiento de registros? ¿Algún consejo?

// 04.09.2011 EDITAR - Gracias a todos por sus respuestas, me ayudaron mucho. Cada publicación era valiosa, por lo que fue bastante difícil aceptar solo una respuesta ;-)


Creo que almacenar registros en la base de datos no es una buena idea. La ventaja de almacenar registros en bases de datos sobre archivos es que puede analizarlos mucho más fácilmente con el poder de SQL. Sin embargo, las desventajas son que debe pagar mucho más tiempo para el mantenimiento de la base de datos. Es mejor que configure un servidor de base de datos independiente para almacenar sus registros o puede que obtenga demasiado INSERT registro, lo que disminuirá el rendimiento de su base de datos al uso de producción; Además, no es fácil migrar, archivar registros en la base de datos, en comparación con archivos (logrotate, etc.).

Hoy en día, debe usar algún sistema de registro especial con muchas características para manejar sus registros, por ejemplo, logstash ( http://logstash.net/ ) tiene un recopilador de registros, un filtro, y puede almacenar el registro en sistemas externos como elasticsearch, combinado con Una hermosa interfaz para visualizar y analizar sus registros.

Árbitro:


Depende del tamaño de los registros y del nivel de concurrencia. Debido a lo último, su prueba es completamente inválida: si hay 100 usuarios en el sitio, y tiene que decir 10 hilos al mismo archivo, fwrite no será tan rápido. Una de las cosas que proporciona RDBMS es el control de concurrencia.

Depende de los requisitos y del lote de análisis que desee realizar. Solo leer registros es fácil, pero ¿qué hay de agregar algunos datos durante un período definido?

Los sitios web a gran escala utilizan sistemas como Scribe para escribir sus registros.

Sin embargo, si está hablando de 5 registros por minuto, esta es una carga realmente baja, por lo que la pregunta principal es cómo los va a leer. Si el archivo es adecuado para sus necesidades, vaya con el archivo. En general, las escrituras de solo apéndice (generalmente para los registros) son muy rápidas.


El registro de errores es mejor limitarlo a los archivos, en mi opinión, porque si hay un problema con la base de datos, todavía puede registrarlo. Obviamente, esa no es una opción si su registro de errores requiere una conexión a la base de datos.

Sin embargo, lo que también diré es que el registro general es algo que dejo dentro de la base de datos, sin embargo, esto solo se aplica si está haciendo un montón de registros para pistas de auditoría, etc.


Escribir el sistema de archivos siempre debe ser más rápido.

Que sin embargo debe ser su preocupación. Tanto hacer una inserción simple como escribir en un sistema de archivos son operaciones rápidas. Lo que debe preocuparle es lo que sucede cuando su base de datos falla. Personalmente me gusta escribir en ambos para que siempre haya un registro si algo sale mal, pero también tiene la facilidad de buscar desde una base de datos.


La velocidad no lo es todo. Sí, es más rápido escribir en archivos, pero es mucho más rápido para usted encontrar lo que necesita en los registros si están en una base de datos. Hace varios años convertí nuestro CMS de un registro basado en archivos a una tabla Mysql. La mesa es mejor


Los registros que usan archivos son más eficientes, sin embargo, los registros almacenados en la base de datos son más fáciles de leer, incluso de forma remota (por ejemplo, puede escribir una interfaz web si es necesario).

Sin embargo, tenga en cuenta que la conexión e inserción de filas en la base de datos es propensa a errores (servidor de base de datos inactivo, contraseña incorrecta, falta de recursos). ¿Dónde registraría esos errores si decidiera usar la base de datos?


Personalmente, prefiero los archivos de registro, así que he creado dos funciones:

<?php function logMessage($message=null, $filename=null) { if (!is_null($filename)) { $logMsg=date(''Y/m/d H:i:s'').": $message/n"; error_log($logMsg, 3, $filename); } } function logError($message=null, $filename=null) { if (!is_null($message)) { logMessage("***ERROR*** {$message}", $filename); } } ?>

Defino una o dos constantes (uso ACTIVITY_LOG y ERROR_LOG, ambas configuradas en el mismo archivo, por lo que no es necesario referirse a dos archivos en paralelo para obtener una vista general de la ejecución) y llamar según corresponda. También he creado una carpeta dedicada (/ var / log / phplogs) y cada aplicación que escribo tiene su propio archivo de registro. Finalmente, roto los registros para tener un historial al que referirme para los clientes.

El uso liberal de las funciones anteriores significa que puedo rastrear la ejecución de aplicaciones con bastante facilidad.


Puede usar un componente como Zend_Log que admite de forma nativa el concepto de escritores adjuntos a la misma instancia de registro. De esa manera, puede registrar el mismo mensaje en uno o más lugares diferentes sin necesidad de cambiar su código de registro. Y siempre puede cambiar su código para reemplazar el sistema de registro o agregar uno nuevo de una manera simple.

Para su pregunta, creo que el registro en archivos es más simple y más apropiado si usted (el desarrollador) es el único que necesita leer los mensajes de registro.

En su lugar, inicie sesión en db si necesita que otras personas lean los registros en una interfaz web o si necesita la capacidad de buscar a través de los registros. Como alguien más ha señalado, también es importante la concurrencia, si tiene muchos usuarios, el registro a db podría escalar mejor.

Finalmente, una frecuencia de registro de 5 mensajes por minuto no requiere casi ningún CPU para su aplicación, por lo que no necesita preocuparse por las interpretaciones. En su caso, comenzaría con los archivos de registro y luego cambiaría (o agregaría más escritores) si sus requisitos cambiarían.