Personalmente creo haber tenido mucha suerte ya que por una cosa o por otra he participado en varios proyectos que manejan grandes bases de datos, actualmente con Resultados de fútbol y BeSoccer trabajo a diario con un gran volumen de datos que me ayuda a ir cogiendo experiencia a la hora de afrontar el planteamiento de nuevas funcionalidades o mejoras para el proyecto.

A mi manera de ver lo más importante es llegar a comprender que el problema al final se reduce en conocer perfectamente la tecnología utilizada y cuáles son sus ventajas y desventajas.

Un ejemplo claro está en el uso de MySQL, seguro que alguna vez has escuchado aquello de que MySQL no es recomendado para ser utilizado con grandes tablas. Pero realmente MySQL no es lento con grandes tablas sino que para conseguir un gran rendimiento con MySQL es necesario diseñar la base de datos siendo consciente de lo que puede y no puede hacer el motor de base de datos, tampoco digo con esto que MySQL es mejor que Oracle o PostgreSQL sino que lo que funciona y es eficaz en una no tiene porque serlo en las otras.

Claves en la escalabilidad de MySQL

Veamos algunas de las posibles claves a la hora de mejorar la escalabilidad de una base de datos MySQL:

1. Motor de base de datos
Acertar en la elección del motor de base de datos (MyISAM ó InnoDB)

Cómo comentamos hace unos días hay que ser conscientes de las ventajas y desventajas de cada uno de ellos.

2. Buffers
Cuando no hay memoria suficiente para el manejo de la base de datos notaremos un descenso gradual del rendimiento, la solución sería asegurarnos que tenemos memoria suficiente para el volumen de datos que estamos utilizando.

3. Índices
Es muy sencillo comprender la importancia de los índices, sin un índice, MySql tiene que iniciar una búsqueda por el primer registro y leer toda la tabla para encontrar los registros relevantes.

4. Consultas lentas
Si los anteriores puntos no nos dan la solución probablemente nos tengamos que centrar en la optimización de las consultas, una tarea complicada con la que podemos ahorrar mucho tiempo si conseguimos desde el principio detectar las consultas lentas (slow queries).

Si ninguno de estos puntos soluciona nuestro problema de escalabilidad tendremos que intentarlo con alguno de las siguientes soluciones que son algo más complicadas.

Llegado a este punto en el que necesitamos escalar nuestra base de datos y ninguna de las anteriores soluciones ya nos sirven tendremos que decidir entre:

Escalar verticalmente

Añadir más recursos a un nodo del sistema para mejorar el rendimiento de la base de datos, se trataría de hacer una inversión en hardware.

Pros:
Casi todos los sistemas escalan bien verticalmente.
Fácil de implementar
Fácil de administrar

Contras:
Alto coste del hardware

Escalar horizontalmente

Agregar más nodos al sistema. Se puede escalar horizontalmente con mejoras de hardware (agregar nuevas computadoras al sistema) ó con mejoras de software (Replicación de datos ó “Sharding” por ejemplo)

Pros:
Coste lineal

Contras:
Difícil de implementar
Difícil de administrar

Escalar horizontalmente y verticalmente

Se puede optar por está opción, habitualmente se escala de manera verticalmente mientras el presupuesto lo permita y cuando ya aumentan excesivamente los costos se escala horizontalmente.

Leer el resto de esta entrada »

Los errores más habituales al usar MySQL

Por Manuel Gutiérrez el 6 de diciembre de 2010

En: Bases de datos| Desarrollo Web

Las bases de datos son un componente indespensable en el desarrollo de páginas web, a menudo los desarrolladores se pueden decantar por diferentes lenguajes de programación (PHP, Python, Ruby on Rails, etc) pero al final casi todos utilizan MySql como elemento principal e indispensable para el manejo de los datos.

Personalmente pienso que es relativamente fácil escribir código funcional en pocas horas y unirlo a un buen diseño que en conjunto formen una aplicación útil, sin embargo este tipo de combinaciones tienden a no escalar bien debido a su alta dependencia a la base de datos, por ello en la gran mayoría de ocasiones nos vendría bien invertir tiempo en el análisis y optimización de la estructura de datos que estemos utilizando.

Estos son algunos de los errores más comunes que se suelen cometer en MySql.

Usar MyISAM en lugar de InnoDB

Son los dos motores de base de datos más famosos y el uso de uno u otro es una decisión bastante importante.

MyISAM es usada por defecto pero no por ello es la mejor opción, si estamos pensando en un proyecto experimental es una buena opción, sin embargo en la mayoría de ocasiones no es la mejor solución, vamos a citar alguna de las claves por las que es más recomendado el uso de InnoDB.

1. MyISAM no soporta las claves foráneas
2. Integridad de datos
3. En MyISAM con cada escritura se bloquea la tabla entera por lo que en cada “INSERT” o “UPDATE” estaremos bloqueando la tabla, a pequeña escala no se suele notar pero a medida que la exigencia de la base de datos sea mayor la disminución de rendimiento es considerable.

No filtrar la entrada de datos

Nunca debes confiar en el usuario en cuánto a la entrada de datos se refiere, para ello hay que asegurarse de filtrar y limpiar los datos en el lado del servidor y de esa manera evitar errores inesperados y posibles ataques de SQL injection.

No usar UTF-8

UTF-8 nos soluciona muchos problemas en cuanto a internacionalización de aplicaciones se refiere.

Filtrar datos con PHP en lugar de con MySQL

Cuando eres nuevo en MySQL a menudo tratas de solucionar problemas a la hora de sacar y filtrar datos con PHP esto es un grave error ya que es bastante más lento, puede que tengas que perder tiempo en investigar pero seguro que a ese problema que tienes hay una solución con MySQL.

Un ejemplo simple sería sacar la media de un valor en una tabla de la base de datos, si no sabes de MySQL seguramente trates de obtener el total en PHP y dividas las suma por el número de filas que has sacado de la tabla, esto en MySQL se puede hacer fácilmente con el uso de la función AVG().

Recuerda que en casi todos los casos será más efectiva una buena consulta con MySQL.

No optimizar las consultas

Cómo hemos comentado anteriormente la gran mayoría de errores a la hora de escalar un proyecto se encuentran en la base de datos, por ello es muy importante tomar un tiempo en la optimización de consultas, la elección de los índices, el tamaño de los campos y los filtros que vas a utilizar son preguntas necesarias a la hora de enfrentarte a una consulta.

Uso erróneo de tipo de datos

Hay un gran número de tipo de datos, a pequeña escala seguramente de igual una mala elección pero a medida que nuestra base de datos crece si el tipo de datos escogido es erróneo los problemas que vamos a tener van a ser grandes. Por eso antes de usar un DATETIME piensa si en ese caso específico sería más recomendable el uso de un DATE, o siel valor de un campo sabes que no va a sobrepasar cierta cantidad de cifras mira si te interesa utilizar un TINYINT en lugar de un INTEGER.

Usar * en las consultas SELECT

En muy pocos casos se tiene que recurrir al uso del * en las consultas SELECT, por varios motivos, el primer y principal motivo es que estás seguramente recogiendo más datos de los que necesitas, otro motivo es que realmente no sabes con exactitud que campos estás recuperando de la base de datos y si la consulta tiene algún JOIN la cosa se complica considerablemente.

Lo más recomendable es no recurrir nunca a este recurso salvo en casos excepcionales y tratar en todo momento exactamente los datos que necesitas.

Leer el resto de esta entrada »

Utilizar API de Twitter con PHP

Por Manuel Gutiérrez el 6 de diciembre de 2010

En: Api| Desarrollo Web

Twitter es una de las redes sociales de mayor crecimiento, como ya todos sabemos permite a los usuarios postear mensajes de una longitud reducida en número de caracteres. A través de las API de Twitter cualquiera puede crear aplicaciones que comuniquen con el servicio de la mencionada red social.

Hay un gran número de posibilidades si nos planteamos comunicar nuestro sitio web con Twitter, no me refiero a la implementación sino a las diferentes funcionalidades que podemos integrar en nuestro sitio web si decidimos comunicarlo con Twitter.

En este caso vamos a ver la opción más sencilla pero a su vez también la más utilizada, actualizar el estado de una cuenta de Twitter desde un script PHP.

Si hacemos una búsqueda en Google seguramente encontremos tutoriales que nos explican como utilizar la API de Twitter gracias al uso de la librería CURL, pero este método quedo obsoleto hace unos meses y si intentamos implementarlo recibiremos el siguiente error: “basic authentication is not supported”


< ?php
include '../../twitter.php';
$message = 'New movie ...';
$url = 'http://twitter.com/statuses/update.xml';
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, "$url");
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_POST, 1);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, "status=$message");
curl_setopt($curl_handle, CURLOPT_USERPWD, "$username:$password");
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
if (empty($buffer)) {
echo "error!";
} else {
echo 'success!';
}
?>

Cómo acabamos de comentar este método ya no funciona ya que ahora es necesario el uso de Oauth

Para aquellos interesados en trabajar con la API de Twitter por primera vez y para aquellos que necesitan actualizar el código que ha quedado obsoleto en estos últimos meses debido al cambio, os recomiendo el siguiente artículo (en inglés).

Resumiendo un poco hay que realizar tres sencillos pasos:

1. Registrar una aplicación en: http://dev.twitter.com/apps/new. Tienes que dar a esta aplicación permisos de lectura y escritura para poder actualizar el estado de tu cuenta de Twitter.

2. Tienes que obtener 4 claves para conseguir actualizar el estado de la cuenta, estas son las claves necesarias: Consumer key, Consumer secret, Access Token (oauth_token), Access Token Secret (oauth_token_secret)

3. Descarga twitteroauth.

Leer el resto de esta entrada »

Ya se puede jugar a la nueva versión del Desafío Manager

Por Manuel Gutiérrez el 12 de agosto de 2010

En: Internet| Redes Sociales

Desafio Manager es un manager de fútbol online en el que puedes registrarte y controlar tu propio equipo virtual de fútbol. Tu equipo puede estar compuesto por jugadores reales de distintos equipos, jugadores que compras en un mercado de fichajes dónde que tendrás que negociar con los usuarios de tu propia liga.

Esta nueva temporada como novedad se ha incluido la posibilidad de además de jugar en otras ligas ya está disponible para: Primera División y Segunda División (España), Premier League (Inglaterra)

A diferencia de otros managers de fútbol es totalmente gratuito y no hay ningún tipo de versión de pago por lo que todo el mundo accederá a las mismas opciones y posee una profundidad de datos no disponible en otros manager ya que los datos del juego los suministra la potente base de datos de resultados de fútbol.

Novedades del Desafio Manager

Visto el éxito del juego la pasada temporada con más de 20.000 managers en menos de tres meses y con la temporada ya iniciada la nueva versión trae suculentas novedades que hacen el juego aún más adicitivo.

La principal novedad es un cambio en el sistema de clasificación, la anterior temporada se jugaba para conseguir el mayor número de puntos posible, esta temporada cada jornada tú equipo se enfrenta a un equipo de la misma liga y de los puntos obtenidos saldrá el resultado del enfrentamiento, con esto se genera una tabla de clasificación completa con puntos, goles a favor, goles en contra y resto de apartado estadísticos.

Esta novedad permite incorporar numerosas opciones que se irán añadiendo a lo largo de la tempora.

¿En qué consiste Desafio Manager?

El reto parece simple, crear el mejor equipo y conseguir más puntos que el resto de los usuarios de tu liga, para ello se te asignará una plantilla con jugadores reales, de tu habilidad para gestionarla depende el futuro de tu equipo.

Cada jugador es único es decir sólo hay un Messi y un Ronaldo de tí depende que juegue en tu equipo, sólo los mejores pueden aglutinar a las grandes estrellas en un mismo equipo.

Los precios de los jugadores fluctuan durante la temporada basándose en la oferta y la demanda. Tu presupuesto se incrementará si un jugador sube de valor y luego eliges venderlo. Sin embargo, también puede bajar.

Nginx, la alternativa a Apache

Por Manuel Gutiérrez el 5 de julio de 2010

En: Desarrollo Web| Internet| Sistemas

Nginx es un servidor web de alto rendimiento escrito por Igor Sysoev, desarollado para una de las web más visitadas de Rusia (Rambler), además se trata de una de las mejores alternativas a Apache, líder indiscutible del mercado. Actualmente se calcula que el 7% de páginas web corren bajo Nginx. Algunas de esas páginas son muy conocidas: Badoo, WordPress, Hulu, Github, Ohloh, SourceForge y TorrentReactor.

El uso de Nginx está aumentando y su cuota de mercado en los sitios web con gran tráfico es muy alta. Además Nginx es realmente fácil de configurar y su rendimiento y consumo de memoria son excepcionales.

Web oficial Nginx
Wiki Nginx
Foro Nginx

Nginx vs Apache

Alguna vez te has preguntado… ¿Cómo gana dinero Google?

Por Manuel Gutiérrez el 25 de mayo de 2010

En: Google

Es una pregunta que muchas personas se hacen, hay que comprender que el imperio de Google y la gran mayoría de sus ingresos provienen de AdSense y Adwords o lo que es lo mismo de la publicidad.

Adwords es el sistema con el que los anunciantes dicen dónde y cómo quieren mostrar sus anuncios y AdSense es el sistema con el que los administradores de las páginas administran como se deben mostrar los anuncios, todo esto genera grandes beneficios a Google.

¿Por qué ofrece Google servicios gratuitos?

Pues no es de manera altruista pueden estar seguros, sino que todo se conecta a la publicidad.

Por ejemplo, GMail es gratuito, pero a cambio Google coloca anuncios en diferentes partes de la navegación. En esencia no es que GMail sea gratuito, sino que Google ha hecho un negocio en donde ellos te ofrecen un servicio de correo gratuito.

Este sistema lo podemos aplicar a la gran mayoría de servicios: google.com, Google Maps, Google News, etc.

Resumiendo. Todo lo que Google ofrece “gratis” está en realidad bastante bien justificado comercialmente, ya que Google vive de “Servicios” y no de “Productos”.