1、用程式中,
保證在實現功能的基礎上,儘量減少對資料庫的訪問次數;
通過搜尋引數,儘量減少對錶的訪問行數
最小化結果集,從而減輕網路負擔;
夠分開的操作盡量分開處理,提高每次的響應速度;
在資料視窗使用
sql 時,盡量把使用的索引放在選擇的首列;
演算法的結構盡量簡單;
在查詢時,不要過多地使用萬用字元如
select * from t1 語句,要用到幾列就選擇幾列如:
select col1,col2 from t1 ;
在可能的情況下盡量限制盡量結果集行數如:
select top 300 col1,col2,col3 from t1,
因為某些情況下使用者是不需要那麼多的資料的。
不要在應用中使用資料庫游標,游標是非常有用的工具,但比使用常規的、面向集的sql語句需要更大的開銷;
按照特定順序提取資料的查詢。
2、避免使用不相容的資料型別。例如
float和int、char和varchar、binary和varbinary是不相容的。資料型別的不相容可能使優化器無法執行一些本來可以進行的優化操作。
例如:select name from employee where salary >60000
在這條語句中,如salary欄位是money型的,則優化器很難對其進行優化,因為60000是個整型數。
我們應當在程式設計時將整型轉化成為錢幣型,而不要等到執行時轉化。
3、盡量避免在where子句中對字段進行函式或表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:
select * from t1 where f1/2=100 應改為
select * from t1 where f1=100*2
select * from record where substring(card_no,1,4)=』5378』
應改為:
select * from record where card_no like 『5378%』
select member_number, first_name, last_name
from members
where datediff(yy,datofbirth,getdate()) > 21
應改為:
select member_number, first_name, last_name
from members
where dateofbirth< dateadd(yy,-21,getdate())
即:任何對列的操作都將導致表掃瞄,它包括資料庫函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊。
4、避免使用!=或<>、is null或is not null、in ,not in等這樣的操作符因為這會使系統無法使用索引,
而只能直接搜尋表中的資料。例如:
select id from employee where id != 'b%'
優化器將無法通過索引來確定將要命中的行數,因此需要搜尋該錶的所有行。
5、盡量使用數字型字段,一部分開發人員和資料庫管理人員喜歡把包含數值資訊的字段設計為字元型,
這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線回逐個比較字串中每乙個字元,
而對於數字型而言只需要比較一次就夠了。
6、合理使用exists,not exists子句。如下所示:
1.select sum(t1.c1)from t1
where( (select count(*)from t2 where t2.c2=t1.c2>0)
2.select sum(t1.c1) from t1 where exists(
select * from t2 where t2.c2=t1.c2)
兩者產生相同的結果,但是後者的效率顯然要高於前者。因為後者不會產生大量鎖定的表掃瞄或
是索引掃瞄。
如果你想校驗表裡是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費伺服器資源。
可以用exists代替。如:
if (select count(*) from table_name where column_name = '***')
可以寫成:
if exists (select * from table_name where column_name = '***')
經常需要寫乙個t_sql語句比較乙個父結果集和子結果集,
從而找到是否存在在父結果集中有而在子結果集中沒有的記錄,如:
1.select a.hdr_key from hdr_tbl a
---- tbl a 表示 tbl 用別名a代替
where not exists (select * from dtl_tbl b where a.hdr_key = b.hdr_key)
2.selecta.hdr_key from hdr_tbl a left join dtl_tbl b on a.hdr_key = b.hdr_key
where b.hdr_key is null
3.select hdr_key from hdr_tbl where hdr_key not in (select hdr_key from dtl_tbl)
三種寫法都可以得到同樣正確的結果,但是效率依次降低。
7、盡量避免在索引過的字元資料中,使用非打頭字母搜尋。這也使得引擎無法利用索引。
見如下例子:select * from t1 where name like 『%l%』
select * from t1 where substing(name,2,1)=』l』
select * from t1 where name like 『l%』
即使name欄位建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不對全表所
有資料逐條操作來完成任務。而第三個查詢能夠使用索引來加快操作。
8、充分利用連線條件,在某種情況下,兩個表之間可能不只乙個的連線條件,這時在
where 子句中將連線條件完整的寫上,有可能大大提高查詢速度。例:
select sum(a.amount) from account a,card b where a.card_no = b.card_no
select sum(a.amount) from account a,card b where a.card_no = b.card_no
and a.account_no=b.account_no
第二句將比第一句執行快得多。
9、消除對大型錶行資料的順序訪問,儘管在所有的檢查列上都有索引,但某些形式的
where子句強迫優化器使用順序訪問。如:
select * from orders where (customer_num=104 and order_num>1001) or
order_num=1008 解決辦法可以使用並集來避免順序訪問:
select *from orders where customer_num=104 and order_num>1001
union select *from orders where order_num=1008 這樣就能利用索引路徑處理查詢。
10、避免困難的正規表示式。
like關鍵字支援萬用字元匹配,技術
如何將你的 MySQL 查詢速度提公升 300 倍
在進行效能分析前,需要先定位耗時查詢。mysql提供了內建的耗時查詢日誌。使用前,開啟my.cnf檔案,將slow query log設定為 on 同時將long query time設定為乙個對一次查詢來說比較慢的時間 秒數 比如0.2。slow query log file設定為你想儲存日誌檔案...
如何將你的 MySQL 查詢速度提公升 300 倍
在進行效能分析前,需要先定位耗時查詢。mysql提供了內建的耗時查詢日誌。使用前,開啟 my.cnf 檔案,將 slow query log 設定為 on 同時將 long query time 設定為乙個對一次查詢來說比較慢的時間 秒數 比如0.2。slow query log file 設定為你...
如何提公升編碼速度
2016 07 10 一 為什麼程式設計速度慢 敲 的速度 這個不僅僅侷限於swift語言。個人覺得,導致程式開發者,開發速度慢,主要有三點原因。1 對這門語言不熟悉 語言運用不熟練,主要體現在,對程式語言,沒有乙個大體的結構框架。說白了,就是不知道,這們程式語言都是能幹什麼。也不了解這門開發語言的...