MySQL性能优化--数据类型优化

本文探讨了MySQL数据库性能优化的关键策略,包括选择合适的数据类型、避免NULL值、使用整型代替字符型存储特定数据等,通过具体案例展示了这些优化措施的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不要小看 MySQL 数据类型对性能的重要性,当你的系统体量到达一定程度时,就知道这里的性能差异了

 更小的通常越好 

尽量选择使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。如mysql的时间类型有Date,DateTime,TimeStamp和Time类型,应根据需要选择合适的时间类型,

 DateDateTimeTimeStampTime
大小 8个字节4个字节 
取值范围1000-01-01~9999-12-311000-01-01 00:00:00~9999-12-31 23:59:591970-01-01 00:00:01~2038-01-19 03:14:0700:00:00~23:59:59
日期格式YYYY-MM-DDYYYY-MM-DD HH:MM:SSYYYY-MM-DD HH:MM:SSHH:MM:SS

 简单最好 

整型比字符型要好,两个例子,应该使用 MySQL 内建的类型来存储日期而不是字符串;使用整形存储 IP 地址。因为字符的校对、排序规则要复杂。

 尽量避免 NULL 

通常情况下最好指定列为 NOT NULL,除非真的需要存储 NULL 值;如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值比较,都更为复杂。允许为 NULL 的列,存储空间上占用更多,同时 MySQL 还需要对它特殊处理。

通常把可为NULL的列改为NOT NULL带来的性能提升比较小,所有没有必要在现有的schema中查找并修改掉这种情况,注:在InnoDB使用单独的位(bit)存储NULL值,对于稀疏数据(很多值为NULL,只有少数列有非NULL值)有很好的空间效率,但这一点并不适用于MyISAM

 

拓展思维

栗子1:

将IP地址存192.168.53.65为Long类型,将3233352459L转换成IP地址

IP的格式是A.B.C.D,其中A,B,C,D均为0~255内的整数,例如127.0.0.1,192.168.53.65。0~255就是一个8位的2进制的数,00000000(0) - 11111111(255)整个ip就是一个32位的2进制数,而JAVA里面的Long类型刚好是32位二进制数4字节,(Int类型是16位二进制2字节),可以转化为一个Long类型,而MySQL需要bigint存储这个数据;

JAVA代码,将IP转为Long类型和将Long类型的3233352459L转换成IP,如下代码所示:

	 public static Long getIPNum(String IP) {
		 Long IPNum = 0l;
		 String IPStr = IP.trim();
	          if (IP != null && IPStr.length() != 0) {
		           String[] subips = IPStr.split("\\.");
		for (String str : subips) {
		       // 向左移8位
               IPNum = IPNum << 8;
	           IPNum += Integer.parseInt(str);
             }
		  }
	       return IPNum;
	    }
	 public static String getIPString(Long IPNum) {
	    Long andNumbers[] = { 0xff000000L, 0x00ff0000L, 0x0000ff00L, 0x000000ffL };
	    final StringBuilder IPStrSb = new StringBuilder();
	    for (int i = 0; i < 4; i++) {
	      IPStrSb.append(String.valueOf((IPNum & andNumbers[i]) >> 8 * (3 - i)));
	      if (i != 3) {
	         IPStrSb.append(".");
		     }
		   }
	       return IPStrSb.toString();
		 }
	
     public static void main(String[] args) {
	        String IPStr = "192.185.11.11";
	        System.out.println(getIPNum(IPStr));
	
		     Long IPNum = 3233352459L;
		     System.out.println(getIPString(IPNum));
	    }

调试打印的结果是没有问题的。

补充:MySQL有处理IP地址的函数 INET_NTOA(expr) 和 INET_ATON(expr) 

INET_NTOA(expr) ,将IP地址字符串转换成数字存储;

INET_ATON(expr) ,将存储的数字换行成IP地址字符串

在这里就不粘贴代码了,有兴趣的童鞋可以自行测试!

栗子2:

 需要将mysql中表的所有字段为null的替换为空串''

update sys_user set imgurl = (CASE WHEN IFNULL(imgurl, '') = '' THEN '' ELSE imgurl END),
mobile = (CASE WHEN IFNULL(mobile, '') = '' THEN '' ELSE mobile END)

虽然这种优化的效果并不明显,但是如果需要在这个列上建索引,就不得不这样做了,

over

 

参考博客http://www.mamicode.com/info-detail-1437817.html

转载于:https://my.oschina.net/u/3374461/blog/1933021

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值