天涯明月刀ol|天涯明月刀迅雷下载
  1. 當前所在位置:
  2. 首頁
  3. 打魚捕魚

數據庫入門基礎知識

2018-12-26 admin
 數據庫入門基礎知識 1數據庫索引(順序、B-+、散列)
 
  MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構。在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。
 
  索引分為聚簇索引和非聚簇索引兩種,還有覆蓋索引,聚簇索引是按照數據存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對于單行的檢索很快。
 
  為表設置索引要付出代價的:一是增加了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(因為索引也要隨之變動)。
 
  為什么要創建索引
 
  創建索引可以大大提高系統的性能。
 
  第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
 
  第二,可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
 
  第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
 
  第四,在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
 
  第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
 
  也許會有人要問:增加索引有如此多的優點,為什么不對表中的每一個列創建一個索引呢?因為,增加索引也有許多不利的方面。
 
  第一,創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。
 
  第二,索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
 
  第三,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
 
  在哪建索引
 
  索引是建立在數據庫表中的某些列的上面。在創建索引的時候,應該考慮在哪些列上可以創建索引,在哪些列上不能創建索引。一般來說,應該在這些列上創建索引:
 
  在經常需要搜索的列上,可以加快搜索的速度;
 
  在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;
 
  在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;
 
  在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
 
  在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。
 
  同樣,對于有些列不應該創建索引。一般來說,不應該創建索引的的這些列具有下列特點:
 
  第一,對于那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統的維護速度和增大了空間需求。
 
  第二,對于那些只有很少數據值的列也不應該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行占了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,并不能明顯加快檢索速度。
 
  第三,對于那些定義為text,image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少,不利于使用索引。
 
  第四,當修改性能遠遠大于檢索性能時,不應該創建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改操作遠遠多于檢索操作時,不應該創建索引。
 
  2數據庫事務的特征
 
  數據庫事務是指作為單個邏輯工作單元執行的一系列操作,這些操作要么全做要么全不做,是一個不可分割的工作單位。
 
  數據庫事務的四大特性(簡稱ACID)是:
 
  (1)原子性(Atomicity)
 
  事務的原子性指的是,事務中包含的程序作為數據庫的邏輯工作單位,它所做的對數據修改操作要么全部執行,要么完全不執行。這種特性稱為原子性。
 
  例如銀行取款事務分為2個步驟(1)存折減款(2)提取現金。不可能存折減款,卻沒有提取現金。2個步驟必須同時完成或者都不完成。
 
  (2)一致性(Consistency)
 
  事務的一致性指的是在一個事務執行之前和執行之后數據庫都必須處于一致性狀態。這種特性稱為事務的一致性。假如數據庫的狀態滿足所有的完整性約束,就說該數據庫是一致的。
 
  例如完整性約束a+b=10,一個事務改變了a,那么b也應隨之改變。
 
  (3)分離性(亦稱獨立性Isolation)
 
  分離性指并發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。假如并發交叉執行的事務沒有任何控制,操縱相同的共享對象的多個并發事務的執行可能引起異常情況。
 
  (4)持久性(Durability)
 
  持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數據庫中數據的改變應該是永久性的,即對已提交事務的更新能恢復。持久性通過數據庫備份和恢復來保證。
 
  3數據庫優化
 
  單機:
 
  (1)創建索引:在數據庫設計的時候,要能夠充分的利用索引帶來的性能提升?如何建立索引?建立什么樣的索引?在哪些字段上建立索引?見以上“數據庫索引”
 
  (2)sql語句:設計數據庫的原則就是盡可能少的進行數據庫寫操作(插入,更新,刪除等),查詢越簡單越好(單表查詢>innerjoin>其他)。
 
  (3)配置緩存:配置緩存可以有效的降低數據庫查詢讀取次數,從而緩解數據庫服務器壓力,達到優化的目的。可配置的緩存包括索引緩存(key_buffer),排序緩存(sort_buffer),查詢緩存(query_buffer),表描述符緩存(table_cache),
 
  (4)切表:分表包括兩種方式:橫向分表和縱向分表,其中,橫向分表比較有使用意義,故名思議,橫向切表就是指把記錄分到不同的表中,而每條記錄仍舊是完整的(縱向切表后每條記錄是不完整的),例如原始表中有100條記錄,我要切成2個表,那么最簡單也是最常用的方法就是ID取模切表法,本例中,就把ID為1,3,5,7。。。的記錄存在一個表中,ID為2,4,6,8,。。。的記錄存在另一張表中。雖然橫向切表可以減少查詢強度,但是它也破壞了原始表的完整性,如果該表的統計操作比較多,那么就不適合橫向切表。橫向切表有個非常典型的用法,就是用戶數據:每個用戶的用戶數據一般都比較龐大,但是每個用戶數據之間的關系不大,因此這里很適合橫向切表。最后,要記住一句話就是:分表會造成查詢的負擔,因此在數據庫設計之初,要想好是否真的適合切表的優化
 
  (5)日志分析:通過分析日志(查詢吞吐量,數據量監控;慢查詢分析:索引、IO、CPU),可以找到系統性能的瓶頸,從而進一步尋找優化方案
 
  分布式數據庫集群:這種分布式集群的技術關鍵就是“同步復制”
 
  4數據庫引擎
 
  在MySQL5.1中,MySQLAB引入了新的插件式存儲引擎體系結構,允許將存儲引擎加載到正在運新的MySQL服務器中。
 
  使用MySQL插件式存儲引擎體系結構,允許數據庫專業人員為特定的應用需求選擇專門的存儲引擎,完全不需要管理任何特殊的應用編碼要求。采用MySQL服務器體系結構,由于在存儲級別上提供了一致和簡單的應用模型和API,應用程序編程人員和DBA可不再考慮所有的底層實施細節。因此,盡管不同的存儲引擎具有不同的能力,應用程序是與之分離的。
 
  MySQL支持數個存儲引擎作為對不同表的類型的處理器。MySQL存儲引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:
 
  ·MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默認的存儲引擎,除非你配置MySQL默認使用另外一個引擎。
 
  ·MEMORY存儲引擎提供“內存中”表。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作為一個單獨的表。就像MyISAM一樣,MEMORY和MERGE存儲引擎處理非事務表,這兩個引擎也都被默認包含在MySQL中。
 
  注釋:MEMORY存儲引擎正式地被確定為HEAP引擎。數據庫入門基礎知識
捕魚駕到 天涯明月刀ol