資料庫的優化方法

2021-07-07 09:18:55 字數 3201 閱讀 8579

常見的資料庫優化方法:索引(資料庫),快取,分表,分庫,

sql優化。

索引:建立索引一般有以下兩個目的:維護被索引列的唯一性和提供快速訪問表中資料的策略。

95%

的資料庫能

問題都可以採用索引技術得到解決。索引有助於提高檢索效能,但過多或不當的索引也會導致系統低

效。因為使用者在表中每加進乙個索引,資料庫就要做更多的工作。過多的索引甚至會導致索引碎片。

快取:hibernate

,spring3

有快取模組

分表:針對每個時間週期產生大量的資料,可以考慮採用一定的策略將資料存到多個資料表中。

sql優化:

1.in

和not in

也要慎用,因為

in會使系統無法使用索引

,而只能直接搜尋表中的資料。如:

select id from t where num in(1,2,3)

對於連續的數值,能用

between

就不要用

in 了:

select id from t where num between 1 and3 2.

當判斷真假是,如果帶

and

或者or :

(當存在

「where

條件1and

條件2」

時,資料庫先執行右邊的語句)

and盡量把假的放到右邊(乙個為假就為假)

or盡量把為真的放到右邊(乙個為真就為真)

3.應盡量避免在

where

子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:

select * from t1 where f1/2=100 

應改為: 

select * from t1 where f1=100*2

select * from record wheresubstring(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

即:任何對列的操作都將導致表掃瞄,它包括資料庫函式、計算表示式等等,查詢時

要盡可能將操作移至等號右邊。

4.很多時候用

exists

是乙個好的選擇:

elect num from a where num in(select numfrom b)

用下面的語句替換:

select num from a where exists(select 1from b where num=a.num)

select sum(t1.c1)from t1 where( 

(select count(*)from t2 wheret2.c2=t1.c2>0) 

select sum(t1.c1) from t1whereexists( 

select * from t2 wheret2.c2=t1.c2) 

兩者產生相同的結果,但是後者的效率顯然要高於前者。因為後者不會產生大量鎖定

的表掃瞄或是索引掃瞄。

如果你想校驗表裡是否存在某條紀錄,不要用

count(*)

那樣效率很低,而且浪費服務

器資源。可以用

exists

代替。如:

if (select count(*) from table_namewhere column_name = '***') 

可以寫成:

if exists (select * from table_namewhere column_name = '***') 5.

充分利用連線條件,在某種情況下,兩個表之間可能不只乙個的連線條件,這時在

where

子句中將

連線條件完整的寫上,有可能大大提高查詢速度。 例:

select sum(a.amount) from account a,cardb where a.card_no = b.card_no 

select sum(a.amount) from account a,cardb where a.card_no = b.card_no and a.account_no=b.account_no 

第二句將比第一句執行快得多。 6.

使用檢視加速查詢

把錶的乙個子集進行排序並建立檢視,有時能加速查詢。它有助於避免多重排序

操作,而且在其他方面還能簡化優化器的工作。例如:

select cust.name

,rcvbles.balance

,……othercolumns 

from cust

,rcvbles 

where cust.customer_id =rcvlbes.customer_id 

and rcvblls.balance>0 

and cust.postcode>「98000」 

order by cust.name

如果這個查詢要被執行多次而不止一次,可以把所有未付款的客戶找出來放在乙個視

圖中,並按客戶的名字進行排序:

create view dbo.v_cust_rcvlbes 

as select cust.name

,rcvbles.balance

,……othercolumns 

from cust

,rcvbles 

where cust.customer_id =rcvlbes.customer_id 

and rcvblls.balance>0 

order by cust.name 

然後以下面的方式在檢視中查詢:

select

*fromv_cust_rcvlbes 

where postcode>「98000」 

檢視中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁碟

i/o,所以查詢工作量可以得到大幅減少。

資料庫優化的方法

常見的資料庫優化方法 索引 資料庫 快取,分表,分庫,sql優化。索引 建立索引一般有以下兩個目的 維護被索引列的唯一性和提供快速訪問表中資料的策略。95 的資料庫能問題都可以採用索引技術得到解決。索引有助於提高檢索效能,但過多或不當的索引也會導致系統低效。因為使用者在表中每加進乙個索引,資料庫就要...

資料庫的優化方法

資料庫的優化方法 索引 建立索維護並保持索引列的唯一性 索引有助於提高檢索效能,但過多或不當的索引也會導致系統低 效。因為使用者在表中每加進乙個索引,資料庫就要做更多的工作。過多的索引甚至會導致索引碎片。當存在 where 條件1 and 條件2 時,資料庫先執行右邊的語句,故 and盡量把假的放到...

優化MYSQL資料庫的方法

1 資料庫設計方面,這是dba和architect的責任,設計結構良好的資料庫,必要的時候,去正規化 英文是這個 denormalize,中文翻譯成啥我不知道 允許部分資料冗餘,避免join操作,以提高查詢效率 2 系統架構設計方面,表雜湊,把海量資料雜湊到幾個不同的表裡面.快慢表,快表只留最新資料...