0.if巢狀的層數最好不要超過3層

 

  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.  
  4.  
  5. public class Qiantao {  
  6.       
  7.     /*  
  8.      * 巢狀太多層if,閱讀性非常差,和看遞迴程式碼一樣  
  9.      * @author yifangyou  
  10.      * @since 2011-08-16 09:35:00  
  11.      */ 
  12.     int example1(int a,String path,String account,String user){  
  13.         int result=0;  
  14.         if(account!=null){  
  15.             if(a==1){  
  16.                 if("/createAccount".equals(path)){  
  17.                     if(createAccount(account)){  
  18.                         result=1;  
  19.                     }else{  
  20.                         return -4;  
  21.                     }  
  22.                 }else if("/createUser".equals(path)){  
  23.                     if(isExistsAccount(account)){  
  24.                         if(createUser(account,user)){  
  25.                             result=2;  
  26.                         }else{  
  27.                             return -6;  
  28.                         }  
  29.                     }else{  
  30.                         return -5;  
  31.                     }  
  32.                 }else{  
  33.                     result=-3;  
  34.                 }  
  35.             }else{  
  36.                 result=-2;  
  37.             }  
  38.         }else{  
  39.             result=-1;  
  40.         }  
  41.           
  42.         return result;  
  43.     }  
  44.  
  45.     Map<String,Integer> paths=new HashMap<String,Integer>(){{  
  46.         this.put("/createAccount"1);  
  47.         this.put("/createUser"2);  
  48.     }};  
  49.       
  50.  
  51.     /*  
  52.      * 採用return減少巢狀層數,層次分明,便於修改,增加和刪除判斷比較容易  
  53.      * @author yifangyou  
  54.      * @since 2011-08-16 09:35:00  
  55.      */ 
  56.     int example2(int a,String path,String account,String user){  
  57.         if(account==null){  
  58.             return -1;  
  59.         }  
  60.           
  61.         if(a!=1){  
  62.             return -2;  
  63.         }  
  64.         Integer pathId=paths.get(path);  
  65.         if(pathId==null){  
  66.             return -3;  
  67.         }  
  68.         switch(pathId){  
  69.         case 1:  
  70.             if(!createAccount(account)){  
  71.                 return -4;  
  72.             }  
  73.             return 1;  
  74.         case 2:  
  75.             if(!isExistsAccount(account)){  
  76.                 return -5;  
  77.             }  
  78.             if(!createUser(account,user)){  
  79.                 return -6;  
  80.             }  
  81.             return 2;  
  82.         default:  
  83.             return 0;  
  84.         }  
  85.           
  86.     }  
  87.       
  88.     private boolean isExistsAccount(String account) {  
  89.         // TODO Auto-generated method stub  
  90.         return false;  
  91.     }  
  92.  
  93.     private boolean createUser(String account, String user) {  
  94.         // TODO Auto-generated method stub  
  95.         return false;  
  96.     }  
  97.  
  98.     private boolean createAccount(String account) {  
  99.         // TODO Auto-generated method stub  
  100.         return false;  
  101.     }  
  102. }  

  1.儘量重用資料庫連線或者檔案控制程式碼
  2.過分的建立物件會消耗系統的大量記憶體,嚴重時,會導致記憶體洩漏,因此,保證過期的物件的及時回收具有重要意義。
    JVM的GC並非十分智慧,因此建議在物件使用完畢後,手動設定成null。
  3.採用在需要的時候才開始建立的策略。
  4.array(陣列)和ArrayList的使用。
    array 陣列效率最高,但容量固定,無法動態改變,ArrayList容量可以動態增長,但犧牲了效率。 
  5.儘量使用基本資料型別代替物件。
  6.使用具體類比使用介面效率高,但結構彈性降低了
  7.讀取配置檔案內容,最好放在static變數裡,不要用到時再解析配置檔案
  8.避免在同一個類中動過呼叫函式或方法(get或set)來設定或呼叫變數
  9.輸入和輸出(I/O),避免多次讀寫同一個檔案,讀時最好儘量一次讀取完需要的資料,寫時,先把要寫的內容全部放到變數裡,一次寫入檔案
  10.資料庫查詢最好使用PrepStatement防止SQL隱碼攻擊,提高效能,prepStatement減少解析sql語句時間

 

  1. drop table IF EXISTS t1;  
  2.             create table t1(id int NOT NULL AUTO_INCREMENT,name varchar(10),PRIMARY KEY (`id`));  
  3.             drop table IF EXISTS t2;  
  4.             create table t2(id int NOT NULL AUTO_INCREMENT,name varchar(10),PRIMARY KEY (`id`));  
  5.             DROP PROCEDURE IF EXISTS test;  
  6.             DELIMITER ;;  
  7.             CREATE PROCEDURE test()  
  8.             BEGIN 
  9.                 truncate t1;  
  10.                 truncate t2;  
  11.                 set @start_time=UNIX_TIMESTAMP();  
  12.                 set @id=1;  
  13.                 SET @sql_str = "insert into t1 values(?,`a`)";  
  14.                     PREPARE stmt FROM @sql_str;  
  15.                 REPEAT  
  16.                      EXECUTE stmt USING @id;  
  17.                      set @id=@id+1;  
  18.                 UNTIL @id>100000 END REPEAT;  
  19.                 DEALLOCATE PREPARE stmt;      
  20.                 select UNIX_TIMESTAMP()-@start_time as span;  
  21.                 set @start_time=UNIX_TIMESTAMP();  
  22.                 set @id=1;    
  23.                 REPEAT  
  24.                      insert into t2 values(@id,`a`);  
  25.                      set @id=@id+1;  
  26.                 UNTIL @id>100000 END REPEAT;     
  27.                 select UNIX_TIMESTAMP()-@start_time as span;  
  28.             END;;  
  29.             DELIMITER ;  
  30.         call test(); 

11.能夠在資料庫裡做的操作,儘量在資料庫裡做,因為資料是集合運算
12.帶索引的inner join 比in效率高得多

 

  1. select count(*) from region;  
  2.            select count(*) from cidr;  
  3.            select SQL_NO_CACHE count(*) from cidr where region_id in(select id from region);  
  4.            select SQL_NO_CACHE count(*) from cidr inner join region on cidr.region_id=region.id; 

13.經常查詢的欄位加上索引,這個能夠提高20倍
14. 當只要一行資料時使用 LIMIT 1,這樣mysql查詢到1條後可以馬上返回結果;
15.避免 SELECT *,查詢哪個欄位就寫哪個,這樣可以減少查詢時間和網路傳輸;
16. 拆分大的 DELETE 或 INSERT 語句
        如果你需要在一個線上的網站上去執行一個大的 DELETE 或 INSERT 查詢,你需要非常小心,要避免你的操作讓你的整個網站停止相應。
        因為這兩個操作是會鎖表的,表一鎖住了,別的操作都進不來了。
17.隱式提交

在事務執行過程中,執行下面語句相當於執行COMMIT

 

  1. ALTER FUNCTIONALTER PROCEDUREALTER TABLEBEGINCREATE DATABASECREATE FUNCTIONCREATE INDEXCREATE PROCEDURECREATE TABLEDROP DATABASEDROP FUNCTIONDROP INDEXDROP PROCEDUREDROP TABLELOAD MASTER DATA, LOCK TABLES, RENAME TABLESET AUTOCOMMIT=1, START TRANSACTIONTRUNCATE TABLE, UNLOCK TABLES. 

truncate 或者drop臨時表會引起隱式提交

CREATE TEMPORARY TABLE 臨時表不會引起隱式提交

delete from 臨時表不會引起隱式提交

CREATE VIEW 會引起隱式提交

18.事務並行問題,按照誰先執行事務的順序生效
     兩個事務同時delete,update,insert操作同一行時,或者含有自增id時會引起掛起

  1. create table t(id int NOT NULL AUTO_INCREMENT,name varchar(10),PRIMARY KEY (`id`));    
  2. create table t(id int NOT NULL,name varchar(10));     
  3. --客戶端A    
  4. SET AUTOCOMMIT =0;    
  5. insert into t values (1,`a`);    
  6. --客戶端 B    
  7. SET AUTOCOMMIT =0;    
  8. insert into t values (1,`b`);                 
  9. ----------------------------------------  
  10. --客戶端A    
  11. SET AUTOCOMMIT =0;    
  12. insert into t values (2,`a`);    
  13. --客戶端 B    
  14. SET AUTOCOMMIT =0;    
  15. delete from t where id=2;      
  16. --或者    
  17. update t set name=`c` where id=2;                                   
  18. ----------------------------------------  
  19. --客戶端A    
  20. SET AUTOCOMMIT =0;    
  21. delete from t where id=2;    
  22. --客戶端 B    
  23. SET AUTOCOMMIT =0;    
  24. update t set name=`c` where id=2;    
  25. --或者         
  26. delete from t where id=2;