不要小看 MySQL 数据类型对性能的重要性,当你的系统体量到达必定程度时,就知道这里的性能差别了html
更小的一般越好 java
尽可能选择使用能够正确存储数据的最小数据类型。更小的数据类型一般更快,由于它们占用更少的磁盘、内存和 CPU 缓存,而且处理时须要的 CPU 周期也更少。如mysql的时间类型有Date,DateTime,TimeStamp和Time类型,应根据须要选择合适的时间类型,mysql
Date | DateTime | TimeStamp | Time | |
大小 | 8个字节 | 4个字节 | ||
取值范围 | 1000-01-01~9999-12-31 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 1970-01-01 00:00:01~2038-01-19 03:14:07 | 00:00:00~23:59:59 |
日期格式 | YYYY-MM-DD | YYYY-MM-DD HH:MM:SS | YYYY-MM-DD HH:MM:SS | HH:MM:SS |
简单最好 sql
整型比字符型要好,两个例子,应该使用 MySQL 内建的类型来存储日期而不是字符串;使用整形存储 IP 地址。由于字符的校对、排序规则要复杂。缓存
尽可能避免 NULL app
一般状况下最好指定列为 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