Entradas etiquetadas ‘navegador

Cómo crear 8 millones de registros en una tabla de MySQL

8 de diciembre de 2008

en: Sin categoría

En algunas ocasiones necesitamos recurrir a tablas con un gran número de registros para probar el rendimiento del servidor de base de datos.

Es una operación que rara vez tenemos que realizar por lo que no hay demasiada información sobre cómo crear un gran número de registros sin tener que recurrir a un lenguaje de programación.

Para hacer tests fiables sobre “tablas grandes” lo más recomendable es utilizar una tabla con un buen número de registros (más de 5.000.000 serán suficientes).

Para poder crear esta cantidad de datos sin problemas podemos hacerlo de la siguiente forma.

Creamos la tabla en la base de datos:

CREATE TABLE `t` (
`a` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Y ejecutamos esta consulta las veces que sea necesaria, con unas 23 veces será necesario ya que cada vez que se ejecuta la consulta se va multiplicando exponencialmente el número de registros y 2^23 = 8.388.608 que son suficientes registros para nuestras pruebas.

INSERT INTO t(a) VALUES(current_date);
INSERT INTO t SELECT * FROM t;

Si hemos repetido las suficientes veces la consulta tendremos 8.388.608 de registros que ocuparán aproximadamente unos 240 MB y con la que podremos experimentar con consultas simples y ver su rendimiento, y sólo habremos necesitado un minuto para crear la tabla de pruebas.

Es un problema poco habitual ya que no siempre se trabaja con coordenadas geográficas en las aplicaciones web, pero en estos últimos años con la irrupción de Google Maps y servicios similares es muy habitual encontrarnos con Mashup que giran en torno a mapas.

Antes de comenzar a desarrollar y solucionar el problema veamos sus posibles funciones dentro de las aplicaciones web:

  • Encontrar localizaciones cercanas a un punto dado
  • Red Social: encontrar amigos cercanos a ti
  • Mapas sociales: encontrar puntos de interes cercanos
  • Páginas Amarillas: encontrar servicios cercanos a un punto dado

Distancia entre dos puntos

En la superficie de la Tierra no nos movemos por un plano recto por lo que en todos los cálculos de distancia debemos tener en cuenta el arco que describe el recorrido entre dos puntos, es pura trigonometria.

Para entender la solución al problema es muy importante entender la formula Haversine, es una ecuación muy importante para la navegación en la que podemos obtener la distancia entre dos puntos geográficos (longitud y latitud) dados.

En este tipo de cálculos omitimos el hecho de que la Tierra no es perfectamente redonda lo que haría aún más complejo el cálculo, en principio este hecho no nos debe afectar y con la solución dada nos será más que suficiente.

Distancia entre dos puntos geográficos con MySql

Aquí tenemos la solución para calcular la distancia entre dos puntos con MySql:

Habitualmente cuando trabajamos con mapas en nuestra aplicación web utilizamos dos campos en la base de datos para almacenar la geolocalización de un punto, estos dos datos son la latitud (su línea de base es el Ecuador) y la longitud (su línea de base es el Meridiano de Greenwich).

Cogemos dos puntos aleatorios, por ejemplo Catedral de Málaga y Plaza de Colón de Madrid.

Catedral Málaga Plaza de Colón
latitud 36.720139 40.425797
longitud -4.419422 -3.690462



Radio de la Tierra: 6378 km.

SELECT (acos(sin(radians(36.720139)) * sin(radians(40.425797)) + 
cos(radians(36.720139)) * cos(radians(40.425797)) *
cos(radians(-4.419422) - radians(-3.690462))) * 6378) as
distanciaMalagaMadrid;
+-----------------------+
| distanciaMalagaMadrid |
+-----------------------+
|       417.34812304175 |
+-----------------------+

El resultado es de 417,348 Kilómetros.

Veamos la soluciónd e una manera más limpia:

PUNTO 1 PUNTO 2
latitud LATITUD_1 LATITUD_2
longitud LONGITUD_1 LONGITUD_2


SELECT (acos(sin(radians(LATITUD_1)) * sin(radians(LATITUD_2)) + 
cos(radians(LATITUD_1)) * cos(radians(LATITUD_2)) *
cos(radians(LONGITUD_1) - radians(LONGITUD_2))) * 6378) as
distanciaPunto1Punto2;

A menudo antes de empezar un proyecto no tenemos claro cúal es el objetivo del mismo o qué pretendemos alcanzar por eso esta pequeña lista te puede ayudar a la hora de planificar un proyecto.

Planificar una aplicación web implica pensar y definir muchas cuestiones de importancia:

1. Planificar el futuro

Puede sonar un poco duro que nos tengamos planear el futuro de algo que aún no existe pero es así, que pasa si en un futuro tuvieramos problemas de escalabilidad, y sí tuvieramos que migrar las bases de datos de MySql a Oracle, de una buena planificación depende la dificultad en un futuro de realizar cambios en la plataforma que sostiene nuestra aplicación.

2. Documentación

Documenta todo lo que puedas tu aplicación en especial aquellas partes de la misma que hayan requerido un mayor tiempo de desarrollo, en un futuro cercano te librará de más de un quebradero de cabeza.

3. No empiezes por los pequeños detalles

A menudo es más sencillo plantearse el desarrollo de pequeños servicios cómo pueden ser los RSS o una galería de imágenes, pero es fundamental comenzar por lo que vendrá a ser la base de nuestra aplicación, de este modo podremos ir completando nuestra aplicación en un orden lógico, primero los cimientos…

4. Diseño de la interfaz

Esta entrada puede que te ayude en esta parte, es importante conseguir un buen diseño para nuestra interfaz, es importante conseguir un interfaz que se atractivo y útil para la gran mayoria de los usuarios, lo más importante es llegar a conectar con el usuario y la mejor manera es ofrecerle la mayor cantidad de información posible para que se llegue a sentir parte del proyecto pero todo esto muchas veces no lo llegamos a conseguir por una mala elección en la combinación de los colores que se integran en nuestra interfaz.

5. Evita construirte librerías o frameworks innecesarios

Muchas personas siempre sostienen que es mejor que cada desarrollador utilize sus propias librerías, pero la realidad es que en muchas ocasiones esto supone una gran pérdida de tiempo, es mejor buscar una librería o framework que se parezca lo más posible a lo deseado que desarrollarlo por ti mismo.

6. Ten un plan de proyecto

Asegúrate de que cada desarrollador que trabaje en el proyecto sepa qué es lo que debe de hacer y cuándo tiene que hacerlo, teniendo todo esto redactado en un documento te ayudará a identificar problemas.

Hace unos días leí esta genial entrada que nos enumera diez principios básicos (dados por expertos en PHP) a la hora de programar en PHP.

Usa PHP sólo cuando lo necesites (Rasmus Lerdorf)

Usa bastantes tablas de MySql para darle escalabilidad a la aplicación web (Matt Mullenweg)

Nunca confies en los usuarios (Dave Child)

La posibilidad de generar imágenes de mapas a modo de gráficas con Google Chart es posiblemente una de las funcionalidades más interesantes que trae este genial servicio, para ello únicamnete tenemos que hacer llamadas a Google Chart API con los datos necesarios.

Documentación Google Chart API | Mapas

Gracias a esta funcionalidad por fin podemos crear de una sencilla manera gráficos que muestren estadísticas globales por países.

Para la realización de los ejemplos que vamos a ver a continuación vamos a hacer uso de esta estructura de tablas que podemos conseguir en el apartado de descargas de MySQL.

Descarga World.sql

Esta entrada es un poco larga por lo que voy a adelantar el resultado de los ejemplos para que aquellos a los que no le interesa la programación de los mismos pueda acceder rápidamente a los datos.

Distribución de la población mundial

Distribución población mundial


Densidad de la población mundial

Mapa de densidad de población mundial


Esperanza de la población mundial

Mapa de esperanza de vida de la población mundial


GNP de la población mundial

Mapa de GNP de la población mundial


Area de superficie por países

Mapa de área de superficie de los países


¿Porqué MySQL es lento con grandes tablas?

23 de abril de 2008

en: Sin categoría

Si trabajas habitualmente con MySQL probablemente habrás escuchado que MySql no es la elección acertada para manejar tablas con mas de 1,000.000 de registros.

Pero entonces porque MySql es el motor de compañías como Google, Yahoo o Technorati, además estas compañías manejan algunos cientos de millones de registros y consiguen un gran rendimiento.

El motivo de este gran rendimiento es que estas tablas que tienen cientos de millones de registros están diseñadas y entendidas para trabajar con MySql, si diseñamos considerando lo que puede y no puede hacer el motor de base de datos probablemente consigamos un buen rendimiento, cualquier sistema de administración de Bases de Datos es distinto con respecto a los otros, lo que funciona bien y es eficaz en Oracle ó PostgreSQL no debe ser lo que mayor rendimiento ofrezca en Mysql.

Por ello para trabajar con tablas muy grandes debemos tener en cuenta tres claves: Buffers, Índices y Consultas.