MySQL存储整数ip地址的优势

ipv4的地址字符串分布为0.0.0.0->255.255.255.255,其中最小长度为7,最大长度为15。
假设其均匀分布,则需要平均占用13.28125字符,计算方法如下,如果将这些字符串存储在数据库中,则还需要一个字符记录字符串的长度,则平均需要占用14.28字符。
相比使用无符号的int(4个字符),其需要多占用10个字符,而且这个只是先对一条记录的情况下,这是一个累积的过程。

public class AddUtil {

    public static void main(String[] args) {

        List<Long> list = new ArrayList<>();

        // 4 1111
        list.add(10L * 10 * 10 * 10 * 7);

        // 5 2111(4)
        list.add(90L * 10 * 10 * 10 * 4 * 8);

        // 6 3111(4) 2211(6)
        list.add(156L * 10 * 10 * 10 * 4 * 9);
        list.add(90L * 90 * 10 * 10 * 6 * 9);

        // 7 3211(12) 2221(4)
        list.add(156L * 90 * 10 * 10 * 12 * 10);
        list.add(90L * 90 * 90 * 10 * 4 * 10);

        // 8 2222 3311(6) 3221(12)
        list.add(90L * 90 * 90 * 90 * 11);
        list.add(156L * 156 * 10 * 10 * 6 * 11);
        list.add(156L * 90 * 90 * 10 * 12 * 11);

        // 9 2223(4) 1233(12)
        list.add(90L * 90 * 90 * 156 * 4 * 12);
        list.add(10L * 90 * 156 * 156 * 12 * 12);

        // 10 2233(6) 1333(4)
        list.add(90L * 90 * 156 * 156 * 6 * 13);
        list.add(10L * 156 * 156 * 156 * 4 * 13);

        // 11 2333(4)
        list.add(90L * 156 * 156 * 156 * 4 * 14);

        // 12 3333
        list.add(156L * 156 * 156 * 156 * 15);

        Long result = 0L;
        for (Long temp : list) {
            //System.out.println(temp);
            result += temp;
        }

        long target = 256L * 256 * 256 * 256;

        System.out.println(result);
        System.out.println(target);
        System.out.println(average(result, target));

    }

    public static BigDecimal average(long result, long times){

        BigDecimal dividend = new BigDecimal(result);
        BigDecimal divisor = new BigDecimal(times);

        for (int i = 0; i < 7; i++) {
            System.out.println(i + " : " + dividend.divide(divisor.negate(),2,i));
            System.out.println(i + " : " + dividend.divide(divisor,2,i));
        }

        return dividend.divide(divisor,2,5);
    }
}

在这里插入图片描述
BigDecimal保留小数的计算格式

roundingMode作用
0去掉后面的直接+1
1直接截断指定的小数位,例如1.555保留2位,结果为1.55
2去掉后面(向大舍入),+1或不变取决于值的正负,正+1,负不变
3去掉后面(向小舍入),+1或不变取决于值的正负,正不变,负+1
4标准的四舍五入
5只有当舍去的部分>0.5时,才会+1,例如1.555的保留2位小数的结果时1.55
6当最后一位为奇数时,走4的舍入逻辑;当最后一位为偶数时,走5的逻辑,例如1.555、1.545保留2位小数的结果是:1.56、1.54
7计算的结果是确切的,会有指定的小数结果,否则抛出异常

执行性能分析

原文:https://bafford.com/2009/03/09/mysql-performance-benefits-of-storing-integer-ip-addresses/
在这里插入图片描述
MySQL的INET_ATON会将ipv4字符串分为4个整数,再依次将这些整数转换成对应的8位二进制,将这个4个8位二进制按照顺序连接起来,形成一个32位的二进制,一个无符号整数。
192.168.1.1
1100 0000
1010 1000
0000 0001
0000 0001
11000000101010000000000100000001
3232235777
在这里插入图片描述
在这里插入图片描述

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值