小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

提高數(shù)據(jù)庫(kù)并發(fā)性能概要

 孫中熙——路 2012-02-16
提高數(shù)據(jù)庫(kù)并發(fā)性能概要
2010-09-10 17:42

1 細(xì)粒度鎖表

  1. 減少大事物操作 (一個(gè)包含很多SQL語(yǔ)句、牽涉很多表的大事物操作鎖住的資源也會(huì)多);
  2. 盡量不使用表級(jí)排他鎖,而是用行級(jí)鎖;又因?yàn)殒i一般是由數(shù)據(jù)庫(kù)根據(jù)你的 SQL自動(dòng)分配,所以要注意SQL的寫法。比如
    select * into B from A

    該操作會(huì)創(chuàng)建B表,并對(duì)B表加表鎖。

2 拆表

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

2.1 物理拆分方式

  1. 水平拆分: 把不同行記錄分開(kāi)放進(jìn)不同表中。比如男性放入一張表中,女性放入另一張表。
  2. 垂直拆分: 把不同列分別放入不同表中。比如主用戶信息放入一張表,附加信息放入另一張表。
  3. 混合拆分(水平拆分+垂直拆分)

2.2 邏輯拆分方式

  1. 按范圍拆分,比如所有zipcode列的值 between 70000 and 79999的記錄拆成一個(gè)表.
  2. 分組拆分,比如country列為冰島、挪威、瑞典、丹麥這些北歐國(guó)家的記錄拆成一個(gè)表
  3. 哈希拆分:參見(jiàn)數(shù)據(jù)庫(kù)的哈希設(shè)計(jì):http://hi.baidu.com/dapplehou/blog/item/471a277ff8eafc0529388ac4.html
  4. 混合拆分,以上幾種拆分方式的綜合。
  5. 可建立查找表以方便對(duì)拆分的子表進(jìn)行登記、查詢、定位。

3 多數(shù)據(jù)源(多庫(kù))

本質(zhì)是拆庫(kù)。與拆表異曲同工。數(shù)據(jù)庫(kù)路由(定位),對(duì)于程序員來(lái)說(shuō)就是數(shù)據(jù)源路由(查找、定位),需要定義多個(gè)數(shù)據(jù)源,并采取合適算法進(jìn)行定位??蓞⒖?http://hi.baidu.com/dapplehou/blog/item/6ba8034f5114e038aec3abdb.html 多庫(kù)部分.

什么是合適算法?那要根據(jù)庫(kù)的切分方式、性能需要以及業(yè)務(wù)需要來(lái)定奪。

4 樂(lè)觀鎖

可以降低數(shù)據(jù)庫(kù)長(zhǎng)事物。只在提交的那一剎那判斷自己提交的數(shù)據(jù)是否已經(jīng)被別人修改過(guò)了,如是,則認(rèn)為自己要提交的數(shù)據(jù)是過(guò)期數(shù)據(jù),取消提交,否則,提交成功。避免長(zhǎng)事物帶來(lái)的等待。通常采用版本號(hào)來(lái)判斷是否過(guò)期數(shù)據(jù)。過(guò)程如下:

  1. A、B兩人同時(shí)讀取同一條銀行賬戶記錄,記錄版本號(hào)為1。
  2. A修改此記錄:增加100元,版本號(hào)加1。
  3. B修改此記錄:減少50元,版本號(hào)加1。
  4. A提交。假設(shè)提交SQL如下:
    update account set money=money+50,version=version+1 where id=10 and version=1

    提交成功。id=10的這條記錄version為2.

  5. B提交。提交SQL如下:
    update account set money=money-50,version=version+1 where id=10 and version=1

    因?yàn)関ersion已經(jīng)等于2了,所以這條更新語(yǔ)句會(huì)影響0行。這樣,誰(shuí)先提交,誰(shuí)成功。后來(lái)者的不會(huì)因?yàn)橄鹊秸咦x取后遲遲不提交而等待等待。減少了站著茅坑不拉屎的情況。提高了并發(fā)性能。

5 臨時(shí)表

使用局部臨時(shí)表提高并發(fā)性能。局部臨時(shí)表特點(diǎn)是多用戶操作互不干擾。一個(gè)局部臨時(shí)表只對(duì)一個(gè)session可見(jiàn)、有效。多用戶并發(fā)實(shí)際是各操作各自的臨時(shí)表,不會(huì)產(chǎn)生數(shù)據(jù)表鎖的問(wèn)題。提高并發(fā)效率。

SQL Server創(chuàng)建臨時(shí)表語(yǔ)句:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)

Oracle:

CREATE GLOBAL TEMPORARY TABLE MyTempTable

把主表(頻繁使用又?jǐn)?shù)據(jù)量大)中的部分?jǐn)?shù)據(jù)放入局部臨時(shí)表,然后在臨時(shí)表里進(jìn)行計(jì)算、統(tǒng)計(jì)等工作,然后同步到主表中去(同步過(guò)程可用樂(lè)觀鎖機(jī)制),減少了主表在并發(fā)時(shí)鎖等待的開(kāi)銷。

臨時(shí)表性能提升原理和拆分表原理相同:通過(guò)把一個(gè)大集合拆成小集合,然后在小集合上進(jìn)行計(jì)算。

6 緩存

  1. 原理同臨時(shí)表。先在內(nèi)存里折騰(計(jì)算、update等),然后把折騰的結(jié)果一次性的同步給db(同步過(guò)程可使用樂(lè)觀鎖機(jī)制).
  2. 算法優(yōu)化。

    有的操作,雖然沒(méi)有更新過(guò)程,但頻繁的復(fù)雜查詢也會(huì)使數(shù)據(jù)庫(kù)性能降低。這種情況下,可采取把一些查詢后的結(jié)果且不輕易變的數(shù)據(jù)保存在緩存中供后續(xù)使用。

    例如:不同用戶登錄后的菜單顯示可能要根據(jù)不同部門、不同權(quán)限以及委托、兼職等復(fù)雜邏輯來(lái)確定菜單的顯示項(xiàng),數(shù)據(jù)庫(kù)的查詢可能非常消耗性能,這種情況下,可緩存所有菜單形成菜單池,再采用亨元模式,緩存每個(gè)用戶的可見(jiàn)菜單,這樣減少了數(shù)據(jù)庫(kù)查詢次數(shù),避免了顯示菜單時(shí)每次都要查詢數(shù)據(jù)庫(kù)的性能損耗。

    亨元模式可參見(jiàn):http://hi.baidu.com/dapplehou/blog/item/aeca1d958268e1047bf48089.html

7 數(shù)據(jù)庫(kù)集群

與多庫(kù)(拆庫(kù))區(qū)別: 集群是每個(gè)庫(kù)上都有一份相同的數(shù)據(jù);拆庫(kù)是每個(gè)庫(kù)只有全集的部分?jǐn)?shù)據(jù)。

多數(shù)據(jù)庫(kù)冗余可以減少單個(gè)數(shù)據(jù)庫(kù)的負(fù)載,總體上提高了性能。它有3個(gè)技術(shù)關(guān)鍵點(diǎn):

  1. 數(shù)據(jù)庫(kù)查詢路由
  2. 數(shù)據(jù)庫(kù)同步
  3. 負(fù)載均衡算法

8 讀寫分離策略

在讀操作遠(yuǎn)多于寫操作的大型應(yīng)用中,可采用讀寫分離策略。用來(lái)讀的數(shù)據(jù)庫(kù)叫從數(shù)據(jù)庫(kù),用來(lái)寫或者事務(wù)性查詢的叫主數(shù)據(jù)庫(kù)。主數(shù)據(jù)庫(kù)的數(shù)據(jù)變化會(huì)通過(guò)某些策略(比如數(shù)據(jù)庫(kù)復(fù)制)同步到從數(shù)據(jù)庫(kù),從而保證主從數(shù)據(jù)庫(kù)數(shù)據(jù)一致性。其本質(zhì)是空間換時(shí)間,即:通過(guò)增加數(shù)據(jù)庫(kù)冗余,降低數(shù)據(jù)庫(kù)對(duì)鎖的復(fù)雜調(diào)度。但另一方面,增加了應(yīng)用架構(gòu)的復(fù)雜度 (這種復(fù)雜性可以通過(guò)使用第三方中間件來(lái)降低)。

9 SQL優(yōu)化

SQL語(yǔ)句是數(shù)據(jù)庫(kù)資源消耗的主要來(lái)源,它往往都是可以進(jìn)一步優(yōu)化的,SQL優(yōu)化在時(shí)間成本和風(fēng)險(xiǎn)上代價(jià)低。

我們寫的SQL語(yǔ)句都會(huì)被查詢優(yōu)化器自動(dòng)優(yōu)化,它的優(yōu)化原則是這樣的:

1. 選擇運(yùn)算優(yōu)先運(yùn)行。(即優(yōu)先通過(guò)條件過(guò)濾記錄集)
2. 投影運(yùn)算與選擇運(yùn)算同時(shí)進(jìn)行。
3. 將笛卡爾積與隨后的選擇運(yùn)算合并為連接運(yùn)算
4. 投影運(yùn)算與其他運(yùn)算同時(shí)進(jìn)行
5. 尋找公共子表達(dá)式并將結(jié)果加以存儲(chǔ)
6. 對(duì)文件進(jìn)行預(yù)處理

由于有了以上優(yōu)化,所以下面兩種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

隨著數(shù)據(jù)庫(kù)的進(jìn)化,原來(lái)效率低的語(yǔ)句現(xiàn)在不一定低,需要實(shí)際測(cè)試。

10 正確使用索引

  1. 索引列
    1. 經(jīng)常查詢的列
    2. 經(jīng)常排序的列
    3. 經(jīng)常連接的列
  2. 非索引列
    1. 不經(jīng)常使用的列
    2. 重復(fù)記錄太多的列(比如性別)
    3. Image text類型的列

Author: Dapple Hou

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多