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