乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

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

      1 細(xì)粒度鎖表

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

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

      2 拆表

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

      2.1 物理拆分方式

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

      2.2 邏輯拆分方式

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

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

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

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

      4 樂觀鎖

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

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

        因為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

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

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

      6 緩存

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

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

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

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

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

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

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

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

      8 讀寫分離策略

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

      9 SQL優(yōu)化

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

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

      1. 選擇運算優(yōu)先運行。(即優(yōu)先通過條件過濾記錄集)
      2. 投影運算與選擇運算同時進(jìn)行。
      3. 將笛卡爾積與隨后的選擇運算合并為連接運算
      4. 投影運算與其他運算同時進(jìn)行
      5. 尋找公共子表達(dá)式并將結(jié)果加以存儲
      6. 對文件進(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ù)庫的進(jìn)化,原來效率低的語句現(xiàn)在不一定低,需要實際測試。

      10 正確使用索引

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

      Author: Dapple Hou

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多