常見的資料庫優化方法:索引(資料庫),快取,分表,分庫,
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 系統架構設計方面,表雜湊,把海量資料雜湊到幾個不同的表裡面.快慢表,快表只留最新資料...