提高資料庫併發效能概要

2021-06-06 20:11:03 字數 2793 閱讀 5332

3 多資料來源(多庫)

4 樂觀鎖

5 臨時表

6 快取

7 資料庫集群

8 讀寫分離策略

9 sql優化

10 正確使用索引

減少大事物操作 (乙個包含很多sql語句、牽涉很多表的大事物操作鎖住的資源也會多);

盡量不使用表級排他鎖,而是用行級鎖;又因為鎖一般是由資料庫根據你的 sql自動分配,所以要注意sql的寫法。比如

select * into b from a
該操作會建立b表,並對b表加表鎖。

與降低鎖的粒度異曲同工。

水平拆分: 把不同行記錄分開放進不同表中。比如男性放入一張表中,女性放入另一張表。

垂直拆分: 把不同列分別放入不同表中。比如主使用者資訊放入一張表,附加資訊放入另一張表。

混合拆分(水平拆分+垂直拆分)

按範圍拆分,比如所有zipcode列的值 between 70000 and 79999的記錄拆成乙個表.

分組拆分,比如country列為冰島、挪威、瑞典、丹麥這些北歐國家的記錄拆成乙個表

混合拆分,以上幾種拆分方式的綜合。

可建立查詢表以方便對拆分的子表進行登記、查詢、定位。

什麼是合適演算法?那要根據庫的切分方式、效能需要以及業務需要來定奪。

可以降低資料庫長事物。只在提交的那一剎那判斷自己提交的資料是否已經被別人修改過了,如是,則認為自己要提交的資料是過期資料,取消提交,否則,提交成功。避免長事物帶來的等待。通常採用版本號來判斷是否過期資料。過程如下:

a、b兩人同時讀取同一條銀行賬戶記錄,記錄版本號為1。

a修改此記錄:增加100元,版本號加1。

b修改此記錄:減少50元,版本號加1。

a提交。假設提交sql如下:

update account set money=money+50,version=version+1 where id=10 and version=1
提交成功。id=10的這條記錄version為2.

b提交。提交sql如下:

update account set money=money-50,version=version+1 where id=10 and version=1
因為version已經等於2了,所以這條更新語句會影響0行。這樣,誰先提交,誰成功。後來者的不會因為先到者讀取後遲遲不提交而等待等待。減少了站著茅坑不拉屎的情況。提高了併發效能。

使用區域性臨時表提高併發效能。區域性臨時表特點是多使用者操作互不干擾。乙個區域性臨時表只對乙個session可見、有效。多使用者併發實際是各操作各自的臨時表,不會產生資料表鎖的問題。提高併發效率。

sql server建立臨時表語句:

create table #mytemptable (cola int primary key)
oracle:

create global temporary table mytemptable
把主表(頻繁使用又資料量大)中的部分資料放入區域性臨時表,然後在臨時表裡進行計算、統計等工作,然後同步到主表中去(同步過程可用樂觀鎖機制),減少了主表在併發時鎖等待的開銷。

臨時表效能提公升原理和拆分表原理相同:通過把乙個大集合拆成小集合,然後在小集合上進行計算。

原理同臨時表。先在記憶體裡折騰(計算、update等),然後把折騰的結果一次性的同步給db(同步過程可使用樂觀鎖機制).

演算法優化。 有的操作,雖然沒有更新過程,但頻繁的複雜查詢也會使資料庫效能降低。這種情況下,可採取把一些查詢後的結果且不輕易變的資料儲存在快取中供後續使用。

例如:不同使用者登入後的選單顯示可能要根據不同部門、不同許可權以及委託、兼職等複雜邏輯來確定選單的顯示項,資料庫的查詢可能非常消耗效能,這種情況下,可快取所有選單形成選單池,再採用亨元模式,快取每個使用者的可見選單,這樣減少了資料庫查詢次數,避免了顯示選單時每次都要查詢資料庫的效能損耗。

與多庫(拆庫)區別: 集群是每個庫上都有乙份相同的資料;拆庫是每個庫只有全集的部分資料。

多資料庫冗餘可以減少單個資料庫的負載,總體上提高了效能。它有3個技術關鍵點:

資料庫查詢路由

資料庫同步

負載均衡演算法

在讀操作遠多於寫操作的大型應用中,可採用讀寫分離策略。用來讀的資料庫叫從資料庫,用來寫或者事務性查詢的叫主資料庫。主資料庫的資料變化會通過某些策略(比如資料庫複製)同步到從資料庫,從而保證主從資料庫資料一致性。其本質是空間換時間,即:通過增加資料庫冗餘,降低資料庫對鎖的複雜排程。但另一方面,增加了應用架構的複雜度 (這種複雜性可以通過使用第三方中介軟體來降低)。

sql語句是資料庫資源消耗的主要**,它往往都是可以進一步優化的,sql優化在時間成本和風險上代價低。

我們寫的sql語句都會被查詢優化器自動優化,它的優化原則是這樣的:

1. 選擇運算優先執行。(即優先通過條件過濾記錄集)

2. 投影運算與選擇運算同時進行。

3. 將笛卡爾積與隨後的選擇運算合併為連線運算

4. 投影運算與其他運算同時進行

5. 尋找公共子表示式並將結果加以儲存

6. 對檔案進行預處理

由於有了以上優化,所以下面兩種sql的寫法效率一樣

select * from a,b where a.id=b.id and a.name='jake'

select * from a,b were a.name='jake' and a.id=b.id

隨著資料庫的進化,原來效率低的語句現在不一定低,需要實際測試。

索引列

經常查詢的列

經常排序的列

經常連線的列

非索引列

不經常使用的列

重覆記錄太多的列(比如性別)

image text型別的列

提高資料庫併發效能概要

1 減少大事物操作 乙個包含很多sql語句 牽涉很多表的大事物操作鎖住的資源也會多 盡量不使用表級排他鎖,而是用行級鎖 又因為鎖一般是由資料庫根據你的 sql自動分配,所以要注意sql的寫法。比如select into b from a該操作會建立b表,並對b表加表鎖。2 與降低鎖的粒度異曲同工。2...

資料庫高併發效能問題診斷思路總結

一 高併發的dml引發問題 1,itl等待 重建索引 增加init trans 加大pct free 索引只是重建後當時有效 2,右增長索引的enq index contention 重建索引減少碎片進而減少找空塊的時間 控制併發 刪除無用索引 或者改造為hash分割槽索引 通過以下方法啟用索引 增...

提高資料庫效能

一 問題的提出 在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面就是sql語句的優化。...