Borrar queries lentas en MySQL5.1

MySQL 5.1 añade la posibilidad de programar eventos, pudiendo así ejecutar tareas de forma automática. Una de las tareas más comunes es la de eliminar consultas lentas que aún no han acabado de ejecutarse.
Esta tarea se puede realizar mediante un prodecimiento almacenado que realiza un PROCESS LIST y que comprueba las sentencias con más de 200s (configurable) que están en estado executing o las que está en Spleep.
Purge process list from slow queries/idle connections
Vía / The Data Charmer

__autoload en PHP5

En PHP5 existe una funcionalidad muy interesante a la hora de crear una aplicación o un framework. Se trata del método __autoload que nos permite ejecutar código cuando se intenta instanciar a una clase que aún no ha sido definida aún.

Esto nos permitiría hacer un include del fichero de la clase cuando se vaya a ejecutar, así nos ahorramos muchos includes al principio de cada script.

function __autoload($class_name) {
require_once $class_name . '.php';
}
// El código anterior deberá ir en la clase y cuando vayamos a instanciarlo, como a continuación, se ejecutará
$obj  = new MyClass1();
$obj2 = new MyClass2();

El código se puede mejorar para que coja el código de distintas partes o librerías.

__autoload

Propel: ORM para PHP

Propel es un ORM para PHP que facilita la labor de desarrollo de aplicaciones web, gracias a la capa que transforma el tratamiento de la BD mediante objetos, con la que se puede recuperar, insertar y modificar datos.

No es necesario preocuparse por las conexiones de la BD y escribir SQL. Tampoco es necesario escapar datos o realizar casting. Tan solo es necesario definir la base de datos en formato XML u obtener la definición desde una base de datos ya existente.

Propel

Artículos sobre BD

Buena recopilación de artículos sobre bases de datos, en inglés, pero interesantes:

10 Useful articles about Database design

Revision Engine: engine para MySQL con control de cambios

Revision Engine es un motor para MySQL que permite llevar el control de cambios en los datos de las tablas. Cuando se necesita llevar un registro de las modificaciones realizadas por los inserts y updates, normalmente se realiza mediante programación. Este engine permite que esa tarea sea ajena al programador y que se realice automáticamente por la base de datos.

Existen tres formas de realizar el control de versiones:

  • Uso de dos tablas: una para los datos actuales y otra para el histórico. Las consultas son rápidas pero los updates lentos, ya que hay que quitar de una tabla y ponerla en otra.
  • Usando una tabla en la que se guardan los datos actuales y los históricos, la escritura es más rápida que la anterior, pero la lectura es más lenta porque hay que buscar en un volumen de datos mayor.
  • Usando tablas internas para guardar los cambios realizados en las columnas, no a nivel de la fila completa. Este caso aún no está disponible y lo realizarán en versiones posteriores.

Revision Engine

Vía / The Data Charmer

Enlaces rápidos (30-09-08)

Últimos enlaces rápidos:

Laboratorio: eliminar HTML en cajas de texto con jQuery

Trasteando un poco con jQuery me ha dado por hacer una función que elimina las etiquetas HTML de una caja de texto de un formulario. Esto puede ser necesario cuando no se quiere que se introduzca HTML en un campo. Lógicamente, esto es la parte cliente, en el servidor debería haber una función similar que lo hiciera.

La función es sencilla, en cada input:text añadimos el evento change para que cuando se modifique el contenido, se ejecute la función de strip_tag, la cual crea un elemento DIV auxiliar, hago que su contenido sea el valor de la caja de texto, me quedo son con el texto e inserto este valor en el input:

$('document').ready(function() {
$(':text').change(function() {
$(this).attr('value', $('document').add('<div></div>').html($(this).attr('value')).text());
});
});

¿Dudas?, alguna. Si entre el texto pongo un <script>alert(1);</script> me ejecuta el script, algo no muy elegante. ¿Qué pasa con el elemento DIV creado?, ¿se queda en el limbo o se destruye?.

Bueno, para mis primeras pruebas con jQuery no está mal del todo.

Mejora en las consultas anidadas en MySQL6

Buena noticia de rendimiento en la futura versión de MySQL. En este caso se trata de las consultas anidadas dentro de MySQL, pongamos un ejemplo.

Si tenemos esta consulta:

select title, from_date, to_date
from titles
where emp_no in
(select emp_no
from employees
where first_name = 'Mary'
and last_name = 'Sluis'
)

En MySQL5 (usando estos datos) obtendríamos el resultado (1 fila) en 7.88 segundos, mientras que en MySQL6 tardaría 0.13 segundos.

El motivo parece ser que MySQL transforma la subconsulta en un join.

Drizzling MySQL

Crea redes sociales con Elgg

Elgg es una aplicación open source que permite crear redes sociales de forma sencilla y con bastantes características que completarán nuestra web.
elgg.png
Entre las características del administrador nos encontramos con administración de usuarios, objetos, ficheros y del sitio, gráficas con relaciones de los usuarios, múltiples sitios por instalación, internacionalización, sistema de etiquetas, ACL, vistas, eventos, plugins y API para widgets.
Además permite RSS, FOAF, XFN, OpenId, OpenSocial, OAuth, JSON, Ajax con jQuery, sistema de caché que permite memcached.
Lógicamente, el usuario final dispondrá de su perfil, panel, feeds de su actividad, preferencias, blog, aplicaicones OpenSocial, repositorio de ficheros, foros y mucho más.
Elgg necesita PHP 5.2+, Apache, GD, MySQL 5+ y mod_rewrite. A parte OpenSocial necesita Mcrypt y la librería PHP SOAP.
Elgg
Vía / WebAppers

Consejos para mejorar la paginación

La paginación es algo de lo más costoso a la hora de realizar una búsqueda. Si nos ponemos en el caso de miles de registros con ordenación por cierto campo, la búsqueda puede ser una query muy costosa. Si además unimos el cálculo total de registros encontrados, la página puede tardar mucho en devolverse.

Debido a ello, para agilizar este tipo de páginas existen unos consejos a tener en cuenta:

  • Cachea todo lo que se pueda: el caché evita que se realicen consultas a la BD.
  • No muestres todos los resultados: Google no lo hace y nadie se queja por ello. Limita el total de registros a 100 o 500, nadie visita más de 10 páginas normalmente.
  • No muestres el total de páginas o páginas intermedias: ofrece tan solo en enlace a “página siguiente”, para lo cual puedes obtener 21 registros y mostrar solo 20, así si la consulta te devuelve menos de 21 es que no hay página siguiente.
  • Estima el número de resultados: esto también lo hace Google, en vez de calcular el número exacto, se trata de estimar el número aproximado de resultados. Usa EXPLAIN para obtener ese número, puedes usar el campo rows como aproximación.

Four ways to optimize paginated displays