一、varchar 與 nvarchar 的區別?數據庫
varchar(n):長度爲 n 個字節的可變長度且非 Unicode 的字符數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小爲輸入數據的字節的實際長度,而不是 n 個字節。nvarchar(n):包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。字節的存儲大小是所輸入字符個數的兩倍。數據庫設計
通俗的說:通常若是包含中文或者其它特殊字符,我就會使用n開頭的類型,不然的話直接使用var開頭的。性能
順便介紹下Unicode字符:Unicode字符集就是爲了解決字符集這種不兼容的問題而產生的,它全部的字符都用兩個字節表示,即英文字符也是用兩個字節表示。優化
附表:spa
char(n)設計 |
定長指針 |
索引效率高 程序裏面使用trim去除多餘的空白code |
n 的值必須介於1 和 8,000 之間,存儲大小爲 n 個字節排序 |
nchar(n)索引 |
定長 |
處理Unicode數據類型(全部的字符使用兩個字節表示) |
n 的值必須介於 1 與 4,000 之間,存儲大小爲 n 字節的兩倍 |
varchar(n) |
變長 |
效率沒char高 但靈活 |
n 的值必須介於 1 和 8,000 之間,存儲大小爲輸入數據的字節的實際長度,而不是 n 個字節 |
nvarchar(n) |
變長 |
處理Unicode數據類型(全部的字符使用兩個字節表示) |
n 的值必須介於 1與 4,000 之間,字節的存儲大小是所輸入字符個數的兩倍,所輸入的數據字符長度能夠爲零 |
text |
變長 |
|
|
ntext |
變長 |
處理Unicode數據類型(全部的字符使用兩個字節表示) |
|
針對上表所屬類型我作一個簡單的分析:
char:儲定長數據很方便,char字段上的索引效率級高,好比定義char(10),那麼不論你存儲的數據是否達到了10個字節,都要佔去10個字節的空間,不足的自動用空格填充,因此在讀取的時候可能要屢次用到trim()。
varchar:存儲變長數據,但存儲效率沒有char高。若是一個字段可能的值是不固定長度的,咱們只知道它不可能超過10個字符,把它定義爲varchar (10)是最合算的。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際狀況找到權衡點。
歸納一下就是:
char,nchar定長,速度快,佔空間大,需處理
varchar,nvarchar,text不定長,空間小,速度慢,無需處理
nchar、nvarchar、ntext處理Unicode碼
二、 數據庫索引
要點:索引關鍵目的是爲了加快檢索速度而創建的,因此,怎麼用索引是數據庫系統自己的事情,做爲數據庫設計或使用者,設計並建立好索引而後體驗加上索引後的查詢變快的感受就好了。因此,索引怎麼用就變爲了「怎麼建立合適的索引」。
是什麼:索引是與表或視圖關聯的磁盤上結構,能夠加快從表或視圖中檢索行的速度。索引包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構中,使 SQL Server 能夠快速有效地查找與鍵值關聯的行。
索引的分類:
彙集索引:將表中記錄在物理數據頁中的位置按索引字段值從新排序,再將重排後的結果寫會到磁盤上,每一個表只能有一個彙集索引。
非彙集索引:與表中數據行的實際存儲結構無關,不會改變數據表中記錄的實際存儲順序,每一個表均可以有多個非彙集索引;
惟一索引:要求建立索引的關鍵字段值在表中不能有重複值。
複合索引:對錶建立的索引是基於多個字段對錶中的記錄排序的。
做用:與 書中的索引同樣,數據庫中的索引使您能夠快速找到表或索引視圖中的特定信息。索引包含從表或視圖中一個或多個列生成的鍵,以及映射到指定數據的存儲位置的 指針。經過建立設計良好的索引以支持查詢,能夠顯著提升數據庫查詢和應用程序的性能。索引能夠減小爲返回查詢結果集而必須讀取的數據量。索引還能夠強制表 中的行具備惟一性,從而確保表數據的數據完整性。
設計良好的索引能夠減小磁盤 I/O 操做,而且消耗的系統資源也較少,從而能夠提升查詢性能。對於包含 SELECT、UPDATE、DELETE 或 MERGE 語句的各類查詢,索引會頗有用。
怎麼用:怎麼用索引是數據庫系統自己的事情,做爲數據庫設計或使用者,設計並建立好索引,而後體驗加上索引後的查詢變快的感受就好了。因此,索引怎麼用就變爲了「怎麼建立合適的索引」。
建立索引的原則:
(1)、在常常用來檢索的列上建立索引(好比常常在where語句中出現的列);
(2)、在表的主鍵、或外鍵上建立索引;
(3)、不在數據類型爲text、ntext或image的列上建立索引;
(4)、只有較少行數的表沒有必要建立索引。
(5)、在常常須要排序的列上建立索引,由於索引已經排序,這樣查詢能夠利用索引的排序,加快排序查詢時間;
(6)、在常常須要根據範圍進行搜索的列上建立索引,由於索引已經排序,其指定的範圍是連續的;
總結概括索引的優勢:
(1)、建立惟一性索引,保證數據庫表中每一行數據的惟一性;
(2)、大大加快數據的檢索速度,這也是建立索引的最主要的緣由;
(3)、加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義;
(4)、在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間;
(5)、經過使用索引,能夠在查詢的過程當中使用優化隱藏器,提升系統的性能。
二)、創建方向索引的不利因素(缺點)
也許會有人要問:增長索引有如此多的優勢,爲何不對錶中的每個列建立一個索引呢?這種想法當然有其合理性,然而也有其片面性。雖然,索引有許多優勢,可是,爲表中的每個列都增長索引,是很是不明智的。這是由於,增長索引也有許多不利的一個方面。
第一, 建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。
第二, 索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。
第三, 當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。
3、如何進行數據庫優化?
如何讓你的數據庫運行的更快,達到最好的性能效果,從多方面入手,好比:字段類型的定位、使用存儲過程、創建索引、關鍵字的使用等等。概要歸結以下:
(1)、使用where子句過濾,而少使用或不使用having;
(2)、使用錶鏈接而不是多個表查詢;
(3)、少創建觸發器,多使用存儲過程;
(4)、字段類型定位,創建索引;
(5)、使用union all 而不是 union;
(6)、使用exists而不是in、distinct;
(7)、提升硬件環境。