jueves, 30 de octubre de 2014

Obtener el tamaño de las tablas de una base de datos MySQL

En el anterior post hablábamos sobre cómo obtener el tamaño de las base de datos. En esta ocasión nos centramos en el tamaño de las tablas de una base de datos.

Lo que haremos será una SQL que nos devuelva todas las tablas de la base de datos test ordenadas de la que ocupa más tamaño a la que ocupa menos, expresada la información en MB.

La SQL sería así:

mysql> SELECT  table_name, table_rows,
        ROUND(data_length / (1024 * 1024), 2) AS `data_size`,
        ROUND(index_length / (1024 * 1024), 2) AS `index_size`,
        ROUND((data_length + index_length) / (1024 * 1024), 2) AS `total_size`,
    FROM information_schema.TABLES
    WHERE table_schema = 'test'
    ORDER BY 5 DESC;

Obtener el tamaño de una base de datos MySQL

Hace unos días me pidieron en una aplicación web en la que estaba trabajando que mostrase el tamaño que tenía la base de datos MySQL.

Como no tenía ninguna función a mano se me ocurrió investigar un poco y con esta simple SQL pude obtener la información que solicitaban.


Los datos del tamaño los muestro en MB y en la consulta me devuelve la información de todas las bases de datos a las que tiene acceso el usuario con el que lanzamos la query.

mysql> SELECT table_schema AS `name_bd`, sum( data_length + index_length ) / 1024 / 1024 AS `size`
    ->   FROM information_schema.TABLES
    ->   GROUP BY table_schema;

Lo que devuelve esta función es lo siguiente:

+--------------------+--------------+
| name_bd            | size         |
+--------------------+--------------+
| information_schema |   0.00390625 |
| test               | 173.52998352 |
+--------------------+--------------+
2 rows in set (0.80 sec)

Si quisiéramos obtener únicamente una base de datos en concreto, deberíamos añadir a la consulta una condición WHERE.

mysql> SELECT table_schema AS `name_bd`, sum( data_length + index_length ) / 1024 / 1024 AS `size`
    ->   FROM information_schema.TABLES
    ->   WHERE table_schema='test'
    ->   GROUP BY table_schema;

Y el resultado es:

+----------------+--------------+
| name_bd        | size         |
+----------------+--------------+
| test           | 173.52998352 |
+----------------+--------------+
1 row in set (0.84 sec)

miércoles, 29 de octubre de 2014

Función GROUP_CONCAT de MySQL

En esta ocasión os presento una función muy útil para mostrar datos agrupados cuyo valor de agrupación no es un count() o un sum() o las típicas funciones agregadas. De lo que se trata es de concatenar todos los valores de un campo que cumplan el criterio de un GROUP BY pero separados por el separador que elijamos. Para entenderlo mejor veamos un ejemplo.

Tenemos una tabla llamada ESTUDIANTES con la siguiente estructura:

mysql> select * from estudiantes;
+--------+-------------+------+
| nombre | asignatura  | nota |
+--------+-------------+------+
| María  | Matemáticas |  5.5 |
| María  | Inglés      |    8 |
| María  | Física      | 3.75 |
| Carlos | Matemáticas | 4.25 |
| Carlos | Inglés      |   10 |
| Carlos | Física      |  7.5 |
+--------+-------------+------+
6 rows in set (0.00 sec)

Sobre estos registros queremos extraer por cada estudiante la lista de asignaturas que ha aprobado, es decir, en las que ha sacado más de un 5.

mysql> select nombre, group_concat(asignatura separator '-') from estudiantes where nota>=5 group by nombre;
+--------+----------------------------------------+
| nombre | group_concat(asignatura separator '-') |
+--------+----------------------------------------+
| Carlos | Inglés-Física                          |
| María  | Matemáticas-Inglés                     |
+--------+----------------------------------------+
2 rows in set (0.00 sec)

En este caso hemos indicado que el separador sería un guión pero podríamos haber indicado cualquier otro. Si no indicamos ningún separador nos lo va a devolver separado por comas.

mysql> select nombre, group_concat(asignatura) from estudiantes where nota>=5 group by nombre;
+--------+--------------------------+
| nombre | group_concat(asignatura) |
+--------+--------------------------+
| Carlos | Inglés,Física            |
| María  | Matemáticas,Inglés       |
+--------+--------------------------+
2 rows in set (0.01 sec)

Esto es muy útil y ahora simplemente si recorriésemos los resultados mediante PHP podrías crear fácilmente una tabla HTML

Esta función group_concat() puede devolver como máximo 1024 caracteres que es el límite por defecto tal y como explican en la documentación de MySQL. Sin embargo esto se puede cambiar editando el fichero my.cnf de configuración y modificando el valor de la variable.

group_concat_max_len=16386

Otra forma es ejecutando previamente la siguiente sentencia.

SET GLOBAL group_concat_max_len=4096

Fuentes:

Función sleep, delay, pause o wait en Javascript

Hoy mismo hemos necesitado realizar una función que nos permitiese de forma fácil hacer un sleep, delay, pause o wait mediante Javascript.

Esto es realmente sencillo si usamos un setTimeout() pero no quería tener que llamar a otra función al pasar el tiempo especificado así que he buscado un poco en google y he encontrado esta:

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}


Fuente:

http://www.sitepoint.com/delay-sleep-pause-wait/

martes, 28 de octubre de 2014

Ejecutar proceso en background con PHP

Si necesitamos ejecutar algún proceso en segundo plano en algún script de PHP, podemos llamar a una función sencilla que nos diferenciará si lo estamos ejecutando desde Windows o Linux, ya que el comportamiento es diferente.

El código de esta función es el siguiente:

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
}

Espero que les sirva.

Añadir elementos a un array en PHP

Con PHP tenemos varias formas de añadir elementos a un array. El primero de ellos es la función nativa array_push().

La sintaxis y los parámetros que debemos utilizar son los siguientes:

int array_push ( array &$array , mixed $value1 [, mixed $... ] );

Lo que hacemos es pasarle un array por referencia como primer parámetro y a continuación los elementos a añadir. La función nos devolverá un valor entero con el número de elementos del array después de haber insertado lo que hayamos definido.

Un ejemplo lo podemos ver aquí:

<?php
$myarray = array('pera', 'manzana', 'naranja');
array_push($myarray, 'melón', 'sandía');
?>

Esto devolvería lo siguiente:

Array
(
    [0] => pera
    [1] => manzana
    [2] => naranja
    [3] => melón
    [4] => sandía
)

Otra forma mucho más sencilla para añadir un elemento al array sería:

<?php
$myarray[] = 'melón';
?>

Según la documentación oficial de PHP, deberíamos utilizar esta segunda forma si queremos únicamente añadir un elemento, ya que así evitamos la sobrecarga de llamar a una función. Además, esta segunda forma crea el array si no existe, mientras que con la función array_push() nos devolvería un warning.

Una comparativa sobre la velocidad de ejecución la podemos ver con una simple prueba que detallamos:

<?php
$myarray = array();
for ($i=0; $i<100000; $i++){
    array_push($myarray, $i);
} // tarda 1.5962453267801 segundos

$myarray = array();
for ($i=0; $i<100000; $i++){
    $myarray[] = $i;
} // tarda 0.0614528790371 segundos
?>

En este caso la mejora de rendimiento es del orden de 26 veces.