資料庫優化的方法

2021-06-25 17:38:23 字數 3008 閱讀 2118



常見的資料庫優化方法:索引(資料庫),快取,分表,分庫,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 and 3

2.當判斷真假是,如果帶and 或者 or :

(當存在 「where 條件1 and 條件2」 時,資料庫先執行右邊的語句)

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

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

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.很多時候用 exists是乙個好的選擇:

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

用下面的語句替換:

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

select sum(t1.c1)from t1 where( 

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

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 = '***')

5.充分利用連線條件,在某種情況下,兩個表之間可能不只乙個的連線條件,這時在 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 

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

6.使用檢視加速查詢 

把錶的乙個子集進行排序並建立檢視,有時能加速查詢。它有助於避免多重排序 操作,而且在其他方面還能簡化優化器的工作。例如:

select cust.name,rcvbles.balance,……other columns 

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,……other columns 

from cust,rcvbles 

where cust.customer_id = rcvlbes.customer_id 

and rcvblls.balance>0 

order by cust.name 

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

select * from v_cust_rcvlbes 

where postcode>「98000」 

檢視中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁碟i/o,所以查詢工作量可以得到大幅減少。

大部分來自

資料庫的優化方法

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

資料庫的優化方法

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

優化MYSQL資料庫的方法

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