0.if巢狀的層數最好不要超過3層
- import java.util.HashMap;
- import java.util.Map;
- public class Qiantao {
- /*
- * 巢狀太多層if,閱讀性非常差,和看遞迴程式碼一樣
- * @author yifangyou
- * @since 2011-08-16 09:35:00
- */
- int example1(int a,String path,String account,String user){
- int result=0;
- if(account!=null){
- if(a==1){
- if("/createAccount".equals(path)){
- if(createAccount(account)){
- result=1;
- }else{
- return -4;
- }
- }else if("/createUser".equals(path)){
- if(isExistsAccount(account)){
- if(createUser(account,user)){
- result=2;
- }else{
- return -6;
- }
- }else{
- return -5;
- }
- }else{
- result=-3;
- }
- }else{
- result=-2;
- }
- }else{
- result=-1;
- }
- return result;
- }
- Map<String,Integer> paths=new HashMap<String,Integer>(){{
- this.put("/createAccount", 1);
- this.put("/createUser", 2);
- }};
- /*
- * 採用return減少巢狀層數,層次分明,便於修改,增加和刪除判斷比較容易
- * @author yifangyou
- * @since 2011-08-16 09:35:00
- */
- int example2(int a,String path,String account,String user){
- if(account==null){
- return -1;
- }
- if(a!=1){
- return -2;
- }
- Integer pathId=paths.get(path);
- if(pathId==null){
- return -3;
- }
- switch(pathId){
- case 1:
- if(!createAccount(account)){
- return -4;
- }
- return 1;
- case 2:
- if(!isExistsAccount(account)){
- return -5;
- }
- if(!createUser(account,user)){
- return -6;
- }
- return 2;
- default:
- return 0;
- }
- }
- private boolean isExistsAccount(String account) {
- // TODO Auto-generated method stub
- return false;
- }
- private boolean createUser(String account, String user) {
- // TODO Auto-generated method stub
- return false;
- }
- private boolean createAccount(String account) {
- // TODO Auto-generated method stub
- return false;
- }
- }
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語句時間
- drop table IF EXISTS t1;
- create table t1(id int NOT NULL AUTO_INCREMENT,name varchar(10),PRIMARY KEY (`id`));
- drop table IF EXISTS t2;
- create table t2(id int NOT NULL AUTO_INCREMENT,name varchar(10),PRIMARY KEY (`id`));
- DROP PROCEDURE IF EXISTS test;
- DELIMITER ;;
- CREATE PROCEDURE test()
- BEGIN
- truncate t1;
- truncate t2;
- set @start_time=UNIX_TIMESTAMP();
- set @id=1;
- SET @sql_str = "insert into t1 values(?,`a`)";
- PREPARE stmt FROM @sql_str;
- REPEAT
- EXECUTE stmt USING @id;
- set @id=@id+1;
- UNTIL @id>100000 END REPEAT;
- DEALLOCATE PREPARE stmt;
- select UNIX_TIMESTAMP()-@start_time as span;
- set @start_time=UNIX_TIMESTAMP();
- set @id=1;
- REPEAT
- insert into t2 values(@id,`a`);
- set @id=@id+1;
- UNTIL @id>100000 END REPEAT;
- select UNIX_TIMESTAMP()-@start_time as span;
- END;;
- DELIMITER ;
- call test();
11.能夠在資料庫裡做的操作,儘量在資料庫裡做,因為資料是集合運算
12.帶索引的inner join 比in效率高得多
- select count(*) from region;
- select count(*) from cidr;
- select SQL_NO_CACHE count(*) from cidr where region_id in(select id from region);
- 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
- ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE TABLE, UNLOCK TABLES.
truncate 或者drop臨時表會引起隱式提交
CREATE TEMPORARY TABLE 臨時表不會引起隱式提交
delete from 臨時表不會引起隱式提交
CREATE VIEW 會引起隱式提交
18.事務並行問題,按照誰先執行事務的順序生效
兩個事務同時delete,update,insert操作同一行時,或者含有自增id時會引起掛起
- create table t(id int NOT NULL AUTO_INCREMENT,name varchar(10),PRIMARY KEY (`id`));
- create table t(id int NOT NULL,name varchar(10));
- --客戶端A
- SET AUTOCOMMIT =0;
- insert into t values (1,`a`);
- --客戶端 B
- SET AUTOCOMMIT =0;
- insert into t values (1,`b`);
- ----------------------------------------
- --客戶端A
- SET AUTOCOMMIT =0;
- insert into t values (2,`a`);
- --客戶端 B
- SET AUTOCOMMIT =0;
- delete from t where id=2;
- --或者
- update t set name=`c` where id=2;
- ----------------------------------------
- --客戶端A
- SET AUTOCOMMIT =0;
- delete from t where id=2;
- --客戶端 B
- SET AUTOCOMMIT =0;
- update t set name=`c` where id=2;
- --或者
- delete from t where id=2;