主頁 > 知識(shí)庫 > 數(shù)據(jù)庫性能優(yōu)化二:數(shù)據(jù)庫表優(yōu)化提升性能

數(shù)據(jù)庫性能優(yōu)化二:數(shù)據(jù)庫表優(yōu)化提升性能

熱門標(biāo)簽:南京電銷外呼系統(tǒng)運(yùn)營商 威海智能語音外呼系統(tǒng) 重慶防封電銷機(jī)器人供應(yīng)商 西安青牛防封電銷卡 400電話申請(qǐng)需要開戶費(fèi)嗎 溫州語音外呼系統(tǒng)代理 智能語音外呼系統(tǒng)哪個(gè)牌子好 北京辦理400電話多少 山西語音外呼系統(tǒng)價(jià)格
數(shù)據(jù)庫優(yōu)化包含以下三部分,數(shù)據(jù)庫自身的優(yōu)化,數(shù)據(jù)庫表優(yōu)化,程序操作優(yōu)化.此文為第二部分 

優(yōu)化①:設(shè)計(jì)規(guī)范化表,消除數(shù)據(jù)冗余
數(shù)據(jù)庫范式是確保數(shù)據(jù)庫結(jié)構(gòu)合理,滿足各種查詢需要、避免數(shù)據(jù)庫操作異常的數(shù)據(jù)庫設(shè)計(jì)方式。滿足范式要求的表,稱為規(guī)范化表,范式產(chǎn)生于20世紀(jì)70年代初,一般表設(shè)計(jì)滿足前三范式就可以,在這里簡單介紹一下前三范式
先給大家看一下百度百科給出的定義:
第一范式(1NF)無重復(fù)的列
所謂第一范式(1NF)是指在關(guān)系模型中,對(duì)域添加的一個(gè)規(guī)范要求,所有的域都應(yīng)該是原子性的,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。
第二范式(2NF)屬性
在1NF的基礎(chǔ)上,非碼屬性必須完全依賴于碼[在1NF基礎(chǔ)上消除非主屬性對(duì)主碼的部分函數(shù)依賴]
第三范式(3NF)屬性
在1NF基礎(chǔ)上,任何非主屬性不依賴于其它非主屬性[在2NF基礎(chǔ)上消除傳遞依賴]
通俗的給大家解釋一下(可能不是最科學(xué)、最準(zhǔn)確的理解)
第一范式:屬性(字段)的原子性約束,要求屬性具有原子性,不可再分割;
第二范式:記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),每條記錄需要有一個(gè)屬性來做為實(shí)體的唯一標(biāo)識(shí)。
第三范式:屬性(字段)冗余性的約束,即任何字段不能由其他字段派生出來,在通俗點(diǎn)就是:主鍵沒有直接關(guān)系的數(shù)據(jù)列必須消除(消除的辦法就是再創(chuàng)建一個(gè)表來存放他們,當(dāng)然外鍵除外)
如果數(shù)據(jù)庫設(shè)計(jì)達(dá)到了完全的標(biāo)準(zhǔn)化,則把所有的表通過關(guān)鍵字連接在一起時(shí),不會(huì)出現(xiàn)任何數(shù)據(jù)的復(fù)本(repetition)。標(biāo)準(zhǔn)化的優(yōu)點(diǎn)是明顯的,它避免了數(shù)據(jù)冗余,自然就節(jié)省了空間,也對(duì)數(shù)據(jù)的一致性(consistency)提供了根本的保障,杜絕了數(shù)據(jù)不一致的現(xiàn)象,同時(shí)也提高了效率。
優(yōu)化②:適當(dāng)?shù)娜哂?,增加?jì)算列
數(shù)據(jù)庫設(shè)計(jì)的實(shí)用原則是:在數(shù)據(jù)冗余和處理速度之間找到合適的平衡點(diǎn)
滿足范式的表一定是規(guī)范化的表,但不一定是最佳的設(shè)計(jì)。很多情況下會(huì)為了提高數(shù)據(jù)庫的運(yùn)行效率,常常需要降低范式標(biāo)準(zhǔn):適當(dāng)增加冗余,達(dá)到以空間換時(shí)間的目的。比如我們有一個(gè)表,產(chǎn)品名稱,單價(jià),庫存量,總價(jià)值。這個(gè)表是不滿足第三范式的,因?yàn)椤翱們r(jià)值”可以由“單價(jià)”乘以“數(shù)量”得到,說明“金額”是冗余字段。但是,增加“總價(jià)值”這個(gè)冗余字段,可以提高查詢統(tǒng)計(jì)的速度,這就是以空間換時(shí)間的作法。合理的冗余可以分散數(shù)據(jù)量大的表的并發(fā)壓力,也可以加快特殊查詢的速度,冗余字段可以有效減少數(shù)據(jù)庫表的連接,提高效率。
其中"總價(jià)值"就是一個(gè)計(jì)算列,在數(shù)據(jù)庫中有兩種類型:數(shù)據(jù)列和計(jì)算列,數(shù)據(jù)列就是需要我們手動(dòng)或者程序給予賦值的列,計(jì)算列是源于表中其他的數(shù)據(jù)計(jì)算得來,比如這里的"總價(jià)值"
在SQL中創(chuàng)建計(jì)算列:
復(fù)制代碼 代碼如下:

create table table1
(
number decimal(18,4),
price money,
Amount as number*price --這里就是計(jì)算列
)

也可以再表設(shè)計(jì)中,直接手動(dòng)添加或修改列屬性即可:如下圖
 
是否持久性,我們也需要注意:
如果是'否',說明這列是虛擬列,每次查詢的時(shí)候計(jì)算一次,而且那么它是不可以用來做check,foreign key或not null約束。
如果是'是',就是真實(shí)的列,不需要每次都計(jì)算,可以再此列上創(chuàng)建索引等等。
優(yōu)化③:索引
索引是一個(gè)表優(yōu)化的重要指標(biāo),在表優(yōu)化中占有極其重要的成分,所以將單獨(dú)寫一章”SQL索引一步到位“去告訴大家如何建立和優(yōu)化索引
優(yōu)化④:主鍵和外鍵的必要性
主鍵與外鍵的設(shè)計(jì),在全局?jǐn)?shù)據(jù)庫的設(shè)計(jì)中,占有重要地位。 因?yàn)椋褐麈I是實(shí)體的抽象,主鍵與外鍵的配對(duì),表示實(shí)體之間的連接。
主鍵:根據(jù)第二范式,需要有一個(gè)字段去標(biāo)識(shí)這條記錄,主鍵無疑是最好的標(biāo)識(shí),但是很多表也不一定需要主鍵,但是對(duì)于數(shù)據(jù)量大,查詢頻繁的數(shù)據(jù)庫表,一定要有主鍵,主鍵可以增加效率、防止重復(fù)等優(yōu)點(diǎn)。
主鍵的選擇也比較重要,一般選擇總的長度小的鍵,小的鍵的比較速度快,同時(shí)小的鍵可以使主鍵的B樹結(jié)構(gòu)的層次更少。
主鍵的選擇還要注意組合主鍵的字段次序,對(duì)于組合主鍵來說,不同的字段次序的主鍵的性能差別可能會(huì)很大,一般應(yīng)該選擇重復(fù)率低、單獨(dú)或者組合查詢可能性大的字段放在前面。
外鍵:外鍵作為數(shù)據(jù)庫對(duì)象,很多人認(rèn)為麻煩而不用,實(shí)際上,外鍵在大部分情況下是很有用的,理由是:外鍵是最高效的一致性維護(hù)方法
數(shù)據(jù)庫的一致性要求,依次可以用外鍵、CHECK約束、規(guī)則約束、觸發(fā)器、客戶端程序,一般認(rèn)為,離數(shù)據(jù)越近的方法效率越高。
謹(jǐn)慎使用級(jí)聯(lián)刪除和級(jí)聯(lián)更新,級(jí)聯(lián)刪除和級(jí)聯(lián)更新作為SQL SERVER 2000當(dāng)年的新功能,在2005作了保留,應(yīng)該有其可用之處。我這里說的謹(jǐn)慎,是因?yàn)榧?jí)聯(lián)刪除和級(jí)聯(lián)更新有些突破了傳統(tǒng)的關(guān)于外鍵的定義,功能有點(diǎn)太過強(qiáng)大,使用前必須確定自己已經(jīng)把握好其功能范圍,否則,級(jí)聯(lián)刪除和級(jí)聯(lián)更新可能讓你的數(shù)據(jù)莫名其妙的被修改或者丟失。從性能看級(jí)聯(lián)刪除和級(jí)聯(lián)更新是比其他方法更高效的方法。
優(yōu)化⑤:存儲(chǔ)過程、視圖、函數(shù)的適當(dāng)使用
很多人習(xí)慣將復(fù)雜操作都放在應(yīng)用程序?qū)?,但如果你要?yōu)化數(shù)據(jù)訪問性能,將SQL代碼移植到數(shù)據(jù)庫上(使用存儲(chǔ)過程,視圖,函數(shù)和觸發(fā)器)也是一個(gè)很大的改進(jìn)原因如下:
1. 存儲(chǔ)過程減少了網(wǎng)絡(luò)傳輸、處理及存儲(chǔ)的工作量,且經(jīng)過編譯和優(yōu)化,執(zhí)行速度快,易于維護(hù),且表的結(jié)構(gòu)改變時(shí),不影響客戶端的應(yīng)用程序
2、使用存儲(chǔ)過程,視圖,函數(shù)有助于減少應(yīng)用程序中SQL復(fù)制的弊端,因?yàn)楝F(xiàn)在只在一個(gè)地方集中處理SQL
3、使用數(shù)據(jù)庫對(duì)象實(shí)現(xiàn)所有的TSQL有助于分析TSQL的性能問題,同時(shí)有助于你集中管理TSQL代碼,更好的重構(gòu)TSQL代碼
優(yōu)化⑥:傳說中的‘三少原則'
①:數(shù)據(jù)庫的表越少越好
②:表的字段越少越好
③:字段中的組合主鍵、組合索引越少越好
當(dāng)然這里的少是相對(duì)的,是減少數(shù)據(jù)冗余的重要設(shè)計(jì)理念。
優(yōu)化⑦:分割你的表,減小表尺寸
如果你發(fā)現(xiàn)某個(gè)表的記錄太多,例如超過一千萬條,則要對(duì)該表進(jìn)行水平分割。水平分割的做法是,以該表主鍵的某個(gè)值為界線,將該表的記錄水平分割為兩個(gè)表。
如果你若發(fā)現(xiàn)某個(gè)表的字段太多,例如超過八十個(gè),則垂直分割該表,將原來的一個(gè)表分解為兩個(gè)表
優(yōu)化⑧:字段設(shè)計(jì)原則
字段是數(shù)據(jù)庫最基本的單位,其設(shè)計(jì)對(duì)性能的影響是很大的。需要注意如下:
A、數(shù)據(jù)類型盡量用數(shù)字型,數(shù)字型的比較比字符型的快很多。
B、 數(shù)據(jù)類型盡量小,這里的盡量小是指在滿足可以預(yù)見的未來需求的前提下的。
C、 盡量不要允許NULL,除非必要,可以用NOT NULL+DEFAULT代替。
D、少用TEXT和IMAGE,二進(jìn)制字段的讀寫是比較慢的,而且,讀取的方法也不多,大部分情況下最好不用。
E、 自增字段要慎用,不利于數(shù)據(jù)遷移
您可能感興趣的文章:
  • 海量數(shù)據(jù)庫的查詢優(yōu)化及分頁算法方案
  • SQL Server 數(shù)據(jù)庫優(yōu)化
  • mysql 數(shù)據(jù)庫中my.ini的優(yōu)化 2G內(nèi)存針對(duì)站多 抗壓型的設(shè)置
  • 開啟SQLSERVER數(shù)據(jù)庫緩存依賴優(yōu)化網(wǎng)站性能
  • MySQL 聯(lián)合索引與Where子句的優(yōu)化 提高數(shù)據(jù)庫運(yùn)行效率
  • asp.net程序優(yōu)化 盡量減少數(shù)據(jù)庫連接操作
  • 服務(wù)器維護(hù)小常識(shí)(硬盤內(nèi)容增加、數(shù)據(jù)庫優(yōu)化等)
  • 數(shù)據(jù)庫性能優(yōu)化一:數(shù)據(jù)庫自身優(yōu)化提升性能
  • Oracle SQL tuning 數(shù)據(jù)庫優(yōu)化步驟分享(圖文教程)
  • oracle數(shù)據(jù)庫sql的優(yōu)化總結(jié)
  • 優(yōu)化Mysql數(shù)據(jù)庫的8個(gè)方法
  • Postgre數(shù)據(jù)庫Insert 、Query性能優(yōu)化詳解
  • mysql中優(yōu)化和修復(fù)數(shù)據(jù)庫工具mysqlcheck詳細(xì)介紹
  • Codeigniter操作數(shù)據(jù)庫表的優(yōu)化寫法總結(jié)
  • MySQL數(shù)據(jù)庫優(yōu)化詳解
  • 用實(shí)例詳解Python中的Django框架中prefetch_related()函數(shù)對(duì)數(shù)據(jù)庫查詢的優(yōu)化
  • 數(shù)據(jù)庫學(xué)習(xí)建議之提高數(shù)據(jù)庫速度的十條建議

標(biāo)簽:新余 貸款群呼 宜春 河源 黃山 中衛(wèi) 金昌 濟(jì)寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《數(shù)據(jù)庫性能優(yōu)化二:數(shù)據(jù)庫表優(yōu)化提升性能》,本文關(guān)鍵詞  數(shù)據(jù)庫,性能,優(yōu)化,二,表,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《數(shù)據(jù)庫性能優(yōu)化二:數(shù)據(jù)庫表優(yōu)化提升性能》相關(guān)的同類信息!
  • 本頁收集關(guān)于數(shù)據(jù)庫性能優(yōu)化二:數(shù)據(jù)庫表優(yōu)化提升性能的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章