He hecho una prueba de ver cuanto ocupan 50 millones de registros en la estructura del primer mensaje de este hilo, usando el campo IP como varchar (128). El resultado es que ocupa 4,9 Gb.
Por otro lado acabo de hacer una prueba con una posible solucion que he encontrado. Consiste en que el campo IP sea decimal (39,0) unsigned. La misma cantidad de registros (50 millones) ocupan 2.6 Gb, es decir, practicamente la mitad....
Como he pasado una IP4 o IP6 a decimal? He usado un par de funciones que he encontrado, tb pongo la que devuelve de nuevo a la cadena IP original:
Código PHP:
Ver originalfunction inet_ptod($ip_address)
{
// IPv4 address
if (strpos($ip_address, ':') === false && strpos($ip_address, '.') !== false) { $ip_address = '::' . $ip_address;
}
// IPv6 address
if (strpos($ip_address, ':') !== false) { $network = inet_pton($ip_address);
$parts = unpack('N*', $network); foreach ($parts as &$part) {
if ($part < 0) {
$part = bcadd((string
) $part, '4294967296'); }
$part = (string) $part;
}
}
$decimal = $parts[4];
$decimal = bcadd($decimal, bcmul($parts[3], '4294967296')); $decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616')); $decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336')); return $decimal;
}
// Decimal address
return $ip_address;
}
/**
* Convert an IP address from decimal format to presentation format
*
* @param string $decimal An IP address in IPv4, IPv6 or decimal notation
* @return string The IP address in presentation format
*/
function inet_dtop($decimal)
{
// IPv4 or IPv6 format
if (strpos($decimal, ':') !== false || strpos($decimal, '.') !== false) { return $decimal;
}
// Decimal format
$parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0); $decimal = bcsub($decimal, bcmul($parts[1], '79228162514264337593543950336')); $parts[2] = bcdiv($decimal, '18446744073709551616', 0); $decimal = bcsub($decimal, bcmul($parts[2], '18446744073709551616')); $parts[3] = bcdiv($decimal, '4294967296', 0); $decimal = bcsub($decimal, bcmul($parts[3], '4294967296')); $parts[4] = $decimal;
foreach ($parts as &$part) {
if (bccomp($part, '2147483647') == 1) { $part = bcsub($part, '4294967296'); }
$part = (int) $part;
}
$network = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]); $ip_address = inet_ntop($network);
// Turn IPv6 to IPv4 if it's IPv4
if (preg_match('/^::\d+.\d+.\d+.\d+$/', $ip_address)) { return substr($ip_address, 2); }
return $ip_address;
}
Bueno, eso ahorra la mitad.... Es un buen paso no?, se podrá ahorrar todabia mas?? Parece mentira como un solo campo en solo 50 millones hace que algo ocupe el doble...