數據庫

常見的關係型數據庫管理系統產品有?
答:Oracle、SQL Server、MySQL、Sybase、DB二、Access等。node

SQL語言包括哪幾部分?每部分都有哪些操做關鍵字?
數據定義語言(DDL: Data Definition Language):Create Table,Alter Table,Drop Table, Craete/Drop Index等
數據操縱語言(DML: Data Manipulation Language):Select ,insert,update,delete,
數據控制語言(DCL: Data Control Language):grant,revoke
數據查詢語言(DQL: Data Query Language):selectmysql

什麼是事務?
事務(Transaction)是一系列的數據庫操做,是數據庫應用的基本邏輯單位。這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。事務是數據庫維護數據一致性的單位,在每一個事務結束時,都能保持數據一致性。web

數據庫事務的四個特性及含義
(1) 原子性:整個事務中的全部操做,要麼所有完成,要麼所有不完成。事務在執行過程當中發生錯誤,會被回滾到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
(2)  一致性:在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。
(3) 隔離性:在事務正確提交以前,不容許把該事務對數據的任何改變提供給任何其餘事務。
(4) 持久性:事務正確提交後,其結果將永久保存在數據庫中,即便在事務提交後有了其餘故障,事務的處理結果也會獲得保存。算法

四種隔離級別
(1) Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
(2) Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
(3) Read committed (讀已提交):可避免髒讀的發生。
(4) Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。sql

存儲過程是一些預編譯的SQL語句,只需建立一次,就能夠在程序中屢次調用。優勢:
(1) 存儲過程是一個預編譯的代碼塊,執行效率比較高
(1) 一個存儲過程替代大量T_SQL語句 ,能夠下降網絡通訊量,提升通訊速率
(1)  能夠必定程度上確保數據安全數據庫

什麼是視圖?以及視圖的使用場景有哪些?
視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,試圖一般是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。緩存

視圖的優勢
(1) 視圖可以簡化用戶的操做
(2) 視圖使用戶能以多種角度看待同一數據;
(3) 視圖爲數據庫提供了必定程度的邏輯獨立性;
(4) 視圖可以對機密數據提供安全保護。安全

索引服務器

索引是對數據庫表中一或多個列的值進行排序的結構,數據庫的搜索引擎能夠利用它加速對數據的檢索。索引容許數據庫程序迅速地找到表中的數據,而沒必要掃描整個數據庫。網絡

爲何使用數據索引能提升效率
(1) 數據索引的存儲是有序的
(2) 在有序的狀況下,經過索引查詢一個數據是無需遍歷索引記錄的
(3) 極端狀況下,數據索引的查詢效率爲二分法查詢效率,趨近於 log2(N)

索引的優勢
(1) 經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性。
(2) 能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由。
(3) 經過使用索引,能夠在查詢的過程當中,使用優化隱藏器,提升系統的性能。

索引的缺點
(1) 建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。
(2) 索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。
(3) 當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。

什麼狀況下應不建或少建索引
一、表記錄太少
二、常常插入、刪除、修改的表
三、數據重複且分佈平均的表字段,例如一個字段A只有T和F兩種值,那麼對A字段建索引通常不會提升數據庫的查詢速度。
四、常常和主字段一塊查詢但主字段索引值比較多的表字段

數據庫幾個基本的索引類型
惟一索引,主鍵索引,彙集索引,非彙集索引。

聚簇索引和非聚簇索引
聚簇索引:該索引中鍵值的邏輯順序決定了表中相應行的物理順序。
非彙集索引:該索引中索引的邏輯順序與磁盤上行的物理存儲順序不一樣。
(1) 使用匯集索引的查詢效率要比非彙集索引的效率要高,可是若是須要頻繁去改變彙集索引的值,寫入性能並不高,由於須要移動對應數據的物理位置。
(2) 非彙集索引在查詢的時候能夠的話就避免二次查詢,這樣性能會大幅提高。
(3) 不是全部的表都適合創建索引,只有數據量大表才適合創建索引,且創建在選擇性高的列上面性能會更好。

B+樹索引和哈希索引的區別
B+樹是一個平衡的多叉樹,從根節點到每一個葉子節點的高度差值不超過1,並且同層級的節點間有指針相互連接,是有序的
哈希索引就是採用必定的哈希算法,把鍵值換算成新的哈希值,檢索時不須要相似B+樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法便可,是無序的。若是大量重複鍵值時,哈希索引的效率很低,由於存在所謂的哈希碰撞問題。

哈希索引不適用的場景
一、不支持範圍查詢
二、不支持索引完成排序
三、不支持聯合索引的最左前綴匹配規則

表分頁查詢

select top @pageSize *
from (
    select row_number() over(order by id asc) as row,* from dbo.data
) tmp where row > ((@pageIndex-1) * @pageSize);

表分區
表分區,是指根據必定規則,將數據庫中的一張表分解成多個更小的,容易管理的部分。從邏輯上看,只有一張表,可是底層倒是由多個物理分區組成。

表分區與分表的區別
分表:指的是經過必定規則,將一張表分解成多張不一樣的表。好比將用戶訂單記錄根據時間成多個表。
分表與分區的區別在於:分區從邏輯上來說只有一張表,而分表則是將一張表分解成多張表。

表分區的好處
一、分區表的數據能夠分佈在不一樣的物理設備上,從而高效地利用多個硬件設備。 2. 和單個磁盤或者文件系統相比,能夠存儲更多數據
二、優化查詢。在where語句中包含分區條件時,能夠只掃描一個或多個分區表來提升查詢效率;涉及sum和count語句時,也能夠在多個分區上並行處理,最後彙總結果。
三、分區表更容易維護。例如:想批量刪除大量數據能夠清除整個分區。
四、可使用分區表來避免某些特殊的瓶頸,例如InnoDB的單個索引的互斥訪問,ext3問價你係統的inode鎖競爭等。

說一說三個範式
第一範式(1NF):數據庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構成,包括整型、實數、字符型、邏輯型、日期型等。
第二範式(2NF):數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴(部分函數依賴指的是存在組合關鍵字中的某些字段決定非關鍵字段的狀況),也即全部非關鍵字段都徹底依賴於任意一組候選關鍵字。
第三範式(3NF):在第二範式的基礎上,數據表中若是不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三範式。所謂傳遞函數依賴,指的是如 果存在"A → B → C"的決定關係,則C傳遞函數依賴於A。所以,知足第三範式的數據庫表應該不存在以下依賴關係: 關鍵字段 → 非關鍵字段 x → 非關鍵字段y

數據庫的優化
1.從結構層: web服務器採用負載均衡服務器,mysql服務器採用主從複製,讀寫分離
2.從儲存層: 採用合適的存儲引擎,採用三範式
3.從設計層: 採用分區分表,索引,表的字段採用合適的字段屬性,適當的採用逆範式,開啓mysql緩存
4.sql語句層:結果同樣的狀況下,採用效率高,速度快節省資源的sql語句執行

SQL語句優化方法
(1)Where子句中:where表之間的鏈接必須寫在其餘Where條件以前,那些能夠過濾掉最大數量記錄的條件必須寫在Where子句的末尾.HAVING最後。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用計算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)對查詢進行優化,應儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引。
(6)應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描
(7)應儘可能避免在 where 子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描

MySQL優化一、開啓查詢緩存,優化查詢二、explain你的select查詢,這能夠幫你分析你的查詢語句或是表結構的性能瓶頸。EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的三、當只要一行數據時使用limit 1,MySQL數據庫引擎會在找到一條數據後中止搜索,而不是繼續日後查少下一條符合記錄的數據四、爲搜索字段建索引,索引最好創建在惟一和非空的字段上,創建太多的索引對後期插入、更新都存在必定的影響(考慮實際狀況來建立);六、Prepared StatementsPrepared Statements很像存儲過程,是一種運行在後臺的SQL語句集合,咱們能夠從使用 prepared statements 得到不少好處,不管是性能問題仍是安全問題。Prepared Statements 能夠檢查一些你綁定好的變量,這樣能夠保護你的程序不會受到「SQL注入式」攻擊七、垂直分表,對於大數據字段,獨立表進行存儲,以便影響性能八、選擇正確的存儲引擎

相關文章
相關標籤/搜索