如何提高資料庫查詢速度 (摘錄)

2021-05-21 19:33:54 字數 3598 閱讀 2294

如何提高資料庫查詢速度

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 t1where 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.select a.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資料庫的查詢統計速度

如何提高mysql資料庫的查詢統計速度 資料庫系統是管理資訊系統的核心,基於資料庫的聯機事務處理 oltp 以及聯機分析處理 olap 是銀行 企業 等部門最為重要的計算機應用之 一。從大多數系統的應用例項來看,查詢操作在各種資料庫操作中所佔據的比重最大,而查詢操作所基於的select語句在sql語...

怎樣提公升mysql查詢速度 如何提高資料庫查詢速度

1 用程式中,保證在實現功能的基礎上,儘量減少對資料庫的訪問次數 通過搜尋引數,儘量減少對錶的訪問行數 最小化結果集,從而減輕網路負擔 夠分開的操作盡量分開處理,提高每次的響應速度 在資料視窗使用 sql 時,盡量把使用的索引放在選擇的首列 演算法的結構盡量簡單 在查詢時,不要過多地使用萬用字元如 ...

如何提高ORACLE資料庫的查詢統計速度

如何提高oracle資料庫的查詢統計速度 我們在開發大型oracle資料庫系統時結合專案的特點,本著安全 高效的原則對資料庫進行了一些物理設計,從而大大提高了資料庫的查詢統計速度。總結為如下幾點 1 擴大資料表空間到500m,用於存放本系統的資料 oracle培訓 2 段盤區的初始大小為10k,增長...