Pregunta

Estoy trabajando en una red social, como un subconjunto de Facebook. Creo que esto significa que la aplicación será más pesado que lea-escritura-pesado (es decir, más de Selects que inserciones, actualizaciones o eliminaciones)

Estoy pensando en usar MySQL para la base de datos, usando MyISAM. Cada tabla en la base de datos contendrá los siguientes tres campos:

  • CREATED - un campo de fecha que contiene el tiempo se creó el registro
  • UPDATED - un campo de fecha que contiene el momento en que se modificó el registro
  • ROWSTATUS -. Un CHAR (1) campo que contiene una sola bandera carácter para mostrar si el registro está activo, inactivo o eliminados (usando 'A' valores, I, y D, respectivamente)

A través de una clase PHP envoltorio, nos aseguramos de que todas las consultas SELECT incluyen la RowStatus, y las consultas de actualización también actualiza la columna actualizada y consultas INSERT actualizar la columna creada.

Estoy pensando que no elimina realmente ningún registro, optando en cambio por actualización que registra campo RowStatus a D para mostrar que se suprime (es decir, un suave Borrar).

Tenemos un procedimiento de SQL, que elimina físicamente los datos borrados después de 10 días.

Sin embargo, yo estaba pasando por este artículo , que sostiene que no hay necesidad de eliminar físicamente a causa de los gastos generales de bloqueo. Por el contrario, el autor sugirió el uso de este esquema:

SELECT e.eventid,e.title
    FROM events e
   WHERE NOT EXISTS
    (SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid);

Me pregunto cómo mi esquema compara con este mecanismo propuesto, y cuál es mejor? No podía llegar a una respuesta definitiva por mi cuenta.

¿Fue útil?

Solución

Como @ Pentium10 dice, no hay nada intrínsecamente malo en su plan. En realidad es un enfoque bastante estándar.

El problema es que si usted está usando MyISAM sus actualizaciones hacen que toda la tabla de bloqueo mientras se ejecuta la consulta. Que introduce un cuello de botella porque sólo se puede actualizar o borrar un solo registro a la vez.

A menos que tenga una razón para usar MyISAM, me gustaría recomendar la conmutación a InnoDB como motor de base de datos. InnoDB emplea bloqueo de filas, por lo que sus consultas de actualización no bloquearán otras actualizaciones. También tiene alguna otra agradable características como el soporte para transacciones y restricciones de integridad referencial.

Otros consejos

El único problema que veo aquí, en comparación con ese artículo, que está manejando sólo bloquea la llamada ELIMINAR.

Usted debe saber que UPDATE y DELETE siempre tiene que emitir un bloqueo exclusivo en una tabla MyISAM.

Es por eso que el artículo recomienda el uso de un INSERT en lugar de un RowStatus UPDATE. Hay que ir como dice el artículo. Crear una tabla dedicada a almacenar los identificadores eliminados, y el uso de la cantidad recomendada de unirse a los selecciona para recuperar no borra los registros. De esta manera en la acción de eliminación del usuario final, que se acaba de insertar en la tabla, y que no causará bloqueo de actualización en la tabla. Si agrega las claves adecuadas a las dos tablas, la unión se hará sólo en los índices, Si va a ser rápido en el SELECT.

También están introduciendo sobrecarga si almacena el momento de la actualización. Usted debe dejar esa idea, ya que no tiene ningún uso, y no se va a utilizar para decir cuando se actualiza un registro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top