MySQL性能優化--數據類型優化

不要小看 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

 

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

相關文章
相關標籤/搜索