Tamaño de una BD MySQL.

Resumen.

Con este artículo vamos a finalizar el curso de MySQL, y para ello vamos a presentar un código muy importante para llevar el control de cómo evoluciona nuestro sitio Web. Conocer el tamaño de nuestra base de datos y sus respectivas tablas es muy importante, en este artículo veremos cómo hacerlo y cómo podemos enviar avisos cuando el volumen de nuestra base de datos o tablas específicas alcancen cierto tamaño.

Artículo.

Cuando contratamos un hosting para nuestro sitio Web nos ofrecen un determinado espacio, que según que proveedores puede variar que ocurre cuando llegamos al limite. En términos generales un buen proveedor te enviará un e-mail avisándote que estas próximo al límite de lo contratado o que lo acabas de superar, en otros casos, simplemente no se te permite subir mas archivos o agregar nuevos contenidos en nuestras bases de datos.

En este último caso puede ocurrir que dejemos de ver que no se hacen comentarios en nuestras publicaciones o no hay participación en nuestros foros. Cuando nos damos cuenta del motivo, falta de espacio, vemos que hemos perdido un tiempo maravilloso y nos tenemos que apresurar a realizar acciones para solventar este problema. Por tanto, lo mejor es saber cuanto espacio estamos consumiendo y poder prever cuando llegaremos al límite para realizar las acciones pertinentes.

Como bien sabemos, el espacio Web no es solo lo que ocupan nuestras bases de datos, es también lo que ocupan los archivos, pero en este artículo nos dedicaremos exclusivamente al volumen de nuestras bases de datos.

Mediante la sentencia SHOW TABLE STATUS podemos conocer el volumen total de nuestra base de datos de la siguiente manera:

$_Volumen_BD = "SHOW TABLE STATUS"; $Vol_Base_Datos = mysqli_query($Conex_BD, $_Volumen_BD);
// Calculamos el volumen de todas las tablas $bytes = 0; while ($tabla = mysqli_fetch_assoc($Vol_Base_Datos)){ $bytes += ($tabla['Data_length'] + $tabla['Index_length']); } // Transformamos y redondeamos a dos decimales $kilobytes = round($bytes/1024, 2); $megabytes = round($kilobytes/1024, 2);

Este código te devuelve el tamaño de la base de datos en bytes y para hacerlo manejable a mi me gusta transformarlo en kilobytes (Kb) o megabytes (Mb), cada cual puede usar la opción de transformación que mas le guste en función del tamaño de sus bases de datos.

Para extraer el volumen de las tablas podemos usar la siguiente sintaxis:

$_Tablas_BD = "SHOW TABLE STATUS"; $Vol_Tablas = mysqli_query($Conex_BD, $_Tablas_BD); while($row = mysqli_fetch_array($Vol_Tablas)) { $total_size = ($row[ "Data_length" ] + $row[ "Index_length" ]) / 1024; // Lo pasamos a kilobytes $tablas["<a href=\"detalle_tabla.php?dtb=".$row['Name']."\" title=\"Ver campos\">".$row['Name']."</a>"] = sprintf("%.2f", $total_size); }

Que nos devuelve un array con el nombre de las tablas y su respectivo tamaño en kilobytes. Algo así como esto:

Array ( [blog] => 11653.37 [comentarios] => 3985.55 [regis_usuarios] => 16.87 )

Si quisiéramos expresarlo en Mb solo tendríamos que dividir en lugar de por 1024, por 1048576 la variable $total_size.

Llegados a este punto, podemos hacer una reflexión, si tenemos el volumen de todas las tablas en un array podemos sumar esos valores y así obtener el tamaño de nuestra base de datos de la siguiente manera:

$suma = round(array_sum($tablas)/1024, 2);

Y lo hemos dividido entre 1024 y redondeado a dos decimales para que nos de el resultado en Mb. Si comparamos este resultado con el que nos da el primer código, veremos que es idéntico, por lo que el primero puede ser prescindible, no obstante es mas simple que el segundo (volumen de las tablas) si todo lo que precisamos es el volumen de la base de datos en su conjunto. Dejo a vuestro criterio la elección del método, que según que casos, pueda ser la mas adecuada. El código completo seria el siguiente:

<?php // Volumen base datos MySQL include('archivos/func_conexionBD.php'); $base_datos = 'curso_mysql'; // Nombre de la base de datos $Conex_BD = ConectaBD(); // ========== Extraemos el tamaño total de la base de datos $_Volumen_BD = "SHOW TABLE STATUS"; $Vol_Base_Datos = mysqli_query($Conex_BD, $_Volumen_BD); // Calculamos el volumen de todas las tablas $bytes = 0; while ($tabla = mysqli_fetch_assoc($Vol_Base_Datos)){ $bytes += ($tabla['Data_length'] + $tabla['Index_length']); } // Transformamos y redondeamos a dos decimales $kilobytes = round($bytes/1024, 2); $megabytes = round($kilobytes/1024, 2); // ========== Extraemos el volumen de cada tabla $_Tablas_BD = "SHOW TABLE STATUS"; $Vol_Tablas = mysqli_query($Conex_BD, $_Tablas_BD); while($row = mysqli_fetch_array($Vol_Tablas)) { $total_size = ($row[ "Data_length" ] + $row[ "Index_length" ]) / 1024; // Lo pasamos a kilobytes $tablas["<a href=\"detalle_tabla.php?dtb=".$row['Name']."\" title=\"Ver campos\">".$row['Name']."</a>"] = sprintf("%.2f", $total_size); } DesconectaBD($Conex_BD); // ========== Imprimimos los resultados echo "<p>Base de datos: <font color='#0000FF'>$base_datos</font></p>"; echo "<h3>Volumen Base de datos.</h3> Volumen: $kilobytes Kb <br /> Volumen: $megabytes Mb "; echo "<h3>Relación de tablas con su tamaño en KiloBytes</h3>"; echo "<pre>"; print_r($tablas); echo "</pre>"; // Sumamos el volumen de las tablas, lo pasamos a Mb y lo recondeamos a dos decimales $suma = round(array_sum($tablas)/1024, 2); echo "<p>Suma tablas: $suma Mb</p>"; ?>

Si nos fijamos, el nombre de las tablas tiene un enlace a una nueva página “detalle_tabla.php”, en la que vamos a extraer información detallada sobre las respectivas tablas como los campos que la componen, sus tipos, el número de caracteres que admiten, etc.

Mostrar los campos y las propiedades de estos en una tabla también nos puede ser muy útil cuando trabajamos en remoto, ya que nos ahorra acceder a la base de datos para saber el nombre exacto de un campo y sus propiedades, nos devuelve algo así como esto:

[2] => Array ( [Field] => email [Type] => varchar(75) [Null] => NO [Key] => UNI [Default] => [Extra] => )

Siendo este el resultado de un elemento del array bidimensional de la tabla de registro de usuarios referenciada donde se recoge el campo “email”. El código completo para hacer esto seria el siguiente:

detalle_tabla.php <?php // Informacion sobre una tabla y propiedades de los campos include('archivos/func_conexionBD.php'); $volver = '<script> window.location="javascript:history.go(-1)"; </script>'; $N_tabla = $_GET['dtb']; // Validamos el nombre de la tabla if (!preg_match("/^[a-z0-9_]{2,75}$/i", $N_tabla)) die ($volver); $Conex_BD = ConectaBD(); // Extraemos las propiedades de los campos $Tabla_BD = "SHOW COLUMNS FROM $N_tabla"; $Detalle_Tabla = mysqli_query($Conex_BD, $Tabla_BD); if (mysqli_num_rows($Detalle_Tabla) > 0) { while ($campo = mysqli_fetch_assoc($Detalle_Tabla)) { $nombres_campo[] = $campo['Field']; // Sacamos los nombres de campo del bucle $campos[] = $campo; // Sacamos los campos del bucle } $campos_fila = implode(', ',$nombres_campo); $campos_columna = implode('<br />',$nombres_campo); $n_campos = count($nombres_campo); // ------ Contamos numero de registros $_Reg_tbl = "SELECT COUNT(id) AS Nregis FROM $N_tabla"; $_Cuenta_Reg = mysqli_query($Conex_BD, $_Reg_tbl); $T_regis = mysqli_fetch_assoc($_Cuenta_Reg); $Tot_regis = $T_regis['Nregis']; DesconectaBD($Conex_BD); echo "<p>Nº de campos: $n_campos. <br /> Contiene <b>$Tot_regis</b> registros.<br /><br /> $campos_fila <br /><br /> $campos_columna</p> <hr>"; echo '<pre>'; print_r($campos); echo '</pre>'; } ?>

En el código podemos ver cómo no nos hemos limitado a extraer las propiedades de los campos, aprovechando que ya teníamos esta información en el array $nombres_campo, hemos aprovechado para crear una fila separada por “,” que nos evitará escribir uno a uno los nombres de estos en el código de registro de datos, también hemos creado una columna con los nombres de los campos y hemos hecho un recuento del número de campos.

Seguidamente hemos contado el número de registros de la tabla, pero esta vez no lo hemos hecho mediante mysqli_num_rows(), lo hemos hecho mediante COUNT(), dado que el recuento de resultados es mas económico en términos de consumo de recursos de servidor (le dedicaremos un artículo a esto).

Por último, con un simple condicional podemos por ejemplo guardar un aviso en una tabla y enviar un e-mail al interesado sobre los recursos consumidos, algo así como esto:

$limite_mb_servidor = 1000; // Maximo de espacio en servidor 1000 MB segun contrato if($megabytes < 950){ $disponible = $limite_mb_servidor - $megabytes; $mensaje = "Espacio disponible: $disponible Mb"; }else{ $disponible = $limite_mb_servidor - $megabytes; $mensaje = "ALERTA, espacio web proximo a agotarse o agotado: $disponible Mb"; // Aqui podemos guardar el aviso en BD e incluso enviar un email al interesado } echo "<p>$mensaje</p>";

Dicho esto, esperamos os haya gustado este curso de MySQL donde hemos tratado de desvelar los aspectos mas importantes de esta magnifica base de datos y su interacción con PHP.
Tags: Volumen BD || SHOW TABLE STATUS || SHOW COLUMNS || tablas

Comentarios.

Sin comentarios, publica el tuyo.