日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

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

1 細粒度鎖表

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

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

2 拆表

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

2.1 物理拆分方式

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

2.2 邏輯拆分方式

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

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

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

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

4 樂觀鎖

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

  1. A、B兩人同時讀取同一條銀行賬戶記錄,記錄版本號為1。
  2. A修改此記錄:增加100元,版本號加1。
  3. B修改此記錄:減少50元,版本號加1。
  4. A提交。假設提交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

    因為version已經(jīng)等于2了,所以這條更新語句會影響0行。這樣,誰先提交,誰成功。后來者的不會因為先到者讀取后遲遲不提交而等待等待。減少了站著茅坑不拉屎的情況。提高了并發(fā)性能。

5 臨時表

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

SQL Server創(chuàng)建臨時表語句:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)

Oracle:

CREATE GLOBAL TEMPORARY TABLE MyTempTable

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

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

6 緩存

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

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

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

    亨元模式可參見:http://hi.baidu.com/dapplehou/blog/item/aeca1d958268e1047bf48089.html

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

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

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

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

8 讀寫分離策略

在讀操作遠多于寫操作的大型應用中,可采用讀寫分離策略。用來讀的數(shù)據(jù)庫叫從數(shù)據(jù)庫,用來寫或者事務性查詢的叫主數(shù)據(jù)庫。主數(shù)據(jù)庫的數(shù)據(jù)變化會通過某些策略(比如數(shù)據(jù)庫復制)同步到從數(shù)據(jù)庫,從而保證主從數(shù)據(jù)庫數(shù)據(jù)一致性。其本質是空間換時間,即:通過增加數(shù)據(jù)庫冗余,降低數(shù)據(jù)庫對鎖的復雜調度。但另一方面,增加了應用架構的復雜度 (這種復雜性可以通過使用第三方中間件來降低)。

9 SQL優(yōu)化

SQL語句是數(shù)據(jù)庫資源消耗的主要來源,它往往都是可以進一步優(yōu)化的,SQL優(yōu)化在時間成本和風險上代價低。

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

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

由于有了以上優(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ù)庫的進化,原來效率低的語句現(xiàn)在不一定低,需要實際測試。

10 正確使用索引

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

Author: Dapple Hou

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多