1. 數據抽象:物理抽象、概念抽象、視圖級抽象,內模式、模式、外模式html
數據庫系統三級抽象是指:java
三種數據庫模式:外模式、概念模式和內模式:mysql
(1)模式程序員
定義:也稱邏輯模式,是數據庫中全體數據的邏輯結構和特徵的描述,是全部用戶的公共數據視圖。redis
理解:算法
① 一個數據庫只有一個模式;sql
② 是數據庫數據在邏輯級上的視圖;mongodb
③ 數據庫模式以某一種數據模型爲基礎;數據庫
④ 定義模式時不只要定義數據的邏輯結構 (如數據記錄由哪些數據項構成,數據項的名字、類型、取值範圍等),並且要定義與數據有關的安全性、完整性要求,定義這些數據之間的聯繫。緩存
(2)外模式 (External Schema)
定義:也稱子模式 (Subschema) 或用戶模式,是數據庫用戶 (包括應用程序員和最終用戶) 可以看見和使用的局部數據的邏輯結構和特徵的描述,是數據庫用戶的數據視圖,是與某一應用有關的數據的邏輯表示。
理解:
① 一個數據庫能夠有多個外模式;
② 外模式就是用戶視圖;
③ 外模式是保證數據安全性的一個有力措施。
(3)內模式 (Internal Schema)
定義:也稱存儲模式 (Storage Schema),它是數據物理結構和存儲方式的描述,是數據在數據庫內部的表示方式 (例如,記錄的存儲方式是順序存儲、按照 B 樹結構存儲仍是按 hash 方法存儲; 索引按照什麼方式組織; 數據是否壓縮存儲,是否加密; 數據的存儲記錄結構有何規定)。
理解:
① 一個數據庫只有一個內模式;
② 一個表可能由多個文件組成,如:數據文件、索引文件。
它是數據庫管理系統 (DBMS) 對數據庫中數據進行有效組織和管理的方法
其目的有:
① 爲了減小數據冗餘,實現數據共享;
② 爲了提升存取效率,改善性能。
具體請看:http://www.2cto.com/database/201412/360263.html
2. SQL 語言包括數據定義、數據操縱 (Data Manipulation),數據控制 (Data Control)
3. SQL 經常使用命令:
CREATE TABLE Student(
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(50) NOT NULL);// 建表
CREATE VIEW view_name AS
Select * FROM Table_name;// 建視圖
Create UNIQUE INDEX index_name ON TableName(col_name);// 建索引
INSERT INTO tablename {column1,column2,…} values(exp1,exp2,…);// 插入
INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);// 插入視圖實際影響表
UPDATE tablename SET name=’zang 3’ condition;// 更新數據
DELETE FROM Tablename WHERE condition;// 刪除
GRANT (Select,delete,…) ON (對象) TO USER_NAME [WITH GRANT OPTION];// 受權
REVOKE (權限表) ON(對象) FROM USER_NAME [WITH REVOKE OPTION] // 撤權
列出工做人員及其領導的名字:
Select E.NAME, S.NAME FROM EMPLOYEE E S
WHERE E.SUPERName=S.Name
4. 視圖
視圖(View)是從一個或多個表(或視圖)導出的表。視圖與表(有時爲與視圖區別,也稱表爲基本表——Base Table)不一樣,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,數據庫中只存儲視圖的定義,在對視圖的數據進行操做時,系統根據視圖的定義去操做與視圖相關聯的基本表。
數據庫存儲數據是經過表來實現的,其有物理存儲空間,也是你數據真正存儲的地方。能夠經過對錶的操做來實現你對數據的操做。
視圖實際上是物理不存在的,其是經過數據庫代碼來將一些表中的數據進行一個想要的邏輯結構從新進行整理。可能這樣說有點更迷糊。
視圖沒有新建表,只是把原來表中的數據成員經過數據庫語言按照咱們須要的邏輯結構從新組織,而進行操做的時候跟一個表是同樣的。
具體請看:http://www.w3school.com.cn/sql/sql_view.asp
5. 完整性約束:實體完整性、參照完整性、用戶定義完整性
關係模型中能夠有三類完整性約束:實體完整性、參照完整性和用戶定義的完整性。實體完整性規則定義了對關係中主屬性(主鍵)取值的約束,即對主屬性的值域的約束;而參照完整性規則定義了參照關係和被參照關係的外碼與主碼之間的參照約束,即對參照關係的外碼屬性值域的約束,規定外碼屬性的值域只能是空值或是相應被參照關係主碼屬性的值。用戶定義完整性就是針對某一具體的關係數據庫的約束條件,反映某一具體應用所涉及的數據必須知足的語義要求,由應用的環境決定。例如,銀行的用戶賬戶規定必須大於等於 100000,小於 999999。因此,用戶定義的完整性一般是定義對關係中除主鍵與外鍵屬性以外的其餘屬性取值的約束,即對其餘屬性的值域的約束。
實體完整性約束規則是指:若屬性(指一個或一組屬性)A 是基本關係 R 的主屬性,則 A 不能取空值。所謂空值就是 「不知道」 或「不存在」的值。
實體完整性規則說明以下:
用戶自定義完整性約束:
不一樣的關係數據庫系統根據其應用環境的不一樣,每每還須要一些特殊的約束條件。用戶自定義的完整性就是針對某一具體關係數據庫的約束條件。它反映某一具體應用所涉及的數據必須知足的語義要求。
6. 第三範式
7. ER(實體 / 聯繫) 模型
8. 索引做用
爲何要建立索引呢?這是由於,建立索引能夠大大提升系統的性能。
也許會有人要問:增長索引有如此多的優勢,爲何不對錶中的每個列建立一個索引呢?這種想法當然有其合理性,然而也有其片面性。雖然,索引有許多優勢, 可是,爲表中的每個列都增長索引,是很是不明智的。這是由於,增長索引也有許多不利的一個方面。
具體請看:
9. 事務
事務是一系列的數據庫操做,是數據庫應用的基本邏輯單位。 事務(Transaction)是併發控制的基本單位。所謂的事務,它是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。
10. 鎖:共享鎖、互斥鎖
兩段鎖協議:階段1:加鎖階段 階段2:解鎖階段
具體請看:http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html
11. 死鎖及處理:事務循環等待數據鎖,則會死鎖。
12. 存儲過程:存儲過程就是編譯好了的一些 sql 語句。
存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的 SQL 語句集,存儲在數據庫中,通過第一次編譯後再次調用不須要再次編譯,用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象。
存儲過程與函數的區別:
存儲過程的優勢:
13. 觸發器: 當知足觸發器條件,則系統自動執行觸發器的觸發體。
觸發時間:有 before,after。觸發事件:有 insert,update,delete 三種。觸發類型:有行觸發、語句觸發
14. 內聯接,外聯接區別?
內鏈接是保證兩個表中全部的行都要知足鏈接條件,而外鏈接則否則。
在外鏈接中,某些不滿條件的列也會顯示出來,也就是說,只限制其中一個表的行,而不限制另外一個表的行。分左鏈接、右鏈接、全鏈接三種
15. 存儲過程和函數的區別
存儲過程是用戶定義的一系列 sql 語句的集合,涉及特定表或其它對象的任務,用戶能夠調用存儲過程,而函數一般是數據庫已定義的方法,它接收參數並返回某種類型的值而且不涉及特定用戶表。
16. 事務是什麼?
事務是做爲一個邏輯單元執行的一系列操做,一個邏輯工做單元必須有四個屬性,稱爲 ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成爲一個事務:
原子性事務必須是原子工做單元;對於其數據修改,要麼全都執行,要麼全都不執行。
一致性事務在完成時,必須使全部的數據都保持一致狀態。在相關數據庫中,全部規則都必須應用於事務的修改,以保持全部數據的完整性。事務結束時,全部的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。
隔離性由併發事務所做的修改必須與任何其它併發事務所做的修改隔離。事務查看數據時數據所處的狀態,要麼是另外一併發事務修改它以前的狀態,要麼是另外一事務修改它以後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,由於它可以從新裝載起始數據,而且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
持久性事務完成以後,它對於系統的影響是永久性的。該修改即便出現系統故障也將一直保持。
17. 遊標的做用?如何知道遊標已經到了最後?
遊標用於定位結果集的行,經過判斷全局變量 @@FETCH_STATUS 能夠判斷是否到了最後,一般此變量不等於 0 表示出錯或到了最後。
18. 觸發器分爲事前觸發和過後觸發,這兩種觸發有和區別。語句級觸發和行級觸發有何區別。
事前觸發器運行於觸發事件發生以前,而過後觸發器運行於觸發事件發生以後。一般事前觸發器能夠獲取事件以前和新的字段值。
語句級觸發器能夠在語句執行前或後執行,而行級觸發在觸發器所影響的每一行觸發一次。
1. MySql 的存儲引擎的不一樣
MySQL 中的數據用各類不一樣的技術存儲在文件 (或者內存) 中。這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。經過選擇不一樣的技術,你可以得到額外的速度或者功能,從而改善你的應用的總體功能。
固然 MySql 支持的表類型不止上面幾種。
具體請看:
2. 單個索引、聯合索引、主鍵索引
索引是一種特殊的文件 (InnoDB 數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏全部記錄的引用指針。普通索引(由關鍵字 KEY 或 INDEX 定義的索引) 的惟一任務是加快對數據的訪問速度。
Mysql 常見索引有:主鍵索引、惟一索引、普通索引、全文索引、組合索引
table_name
ADD PRIMARY KEY ( column
)table_name
ADD UNIQUE (column
)table_name
ADD INDEX index_name ( column
)table_name
ADD FULLTEXT ( column
)table_name
ADD INDEX index_name ( column1
, column2
, column3
)Mysql 各類索引區別:
3. Mysql 怎麼分表,以及分表後若是想按條件分頁查詢怎麼辦
當一張的數據達到幾百萬時,你查詢一次所花的時間會變多,若是有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在於此,減少數據庫的負擔,縮短查詢時間。
如何分表?
分表後若是想按條件分頁查詢怎麼辦?
具體請看:http://blog.51yip.com/mysql/949.html
4. 分表以後想讓一個 id 多個表是自增的,效率實現
多個表之間的主鍵不能用數據庫自己的自增主鍵來支持,由於不一樣表之間生成的主鍵會重複。因此須要其餘的方式獲取主鍵 ID。
(1)經過 MySQL 表生成 ID
在《關於 MySQL 分表操做的研究》提到了一種方法:
對於插入也就是 insert 操做,首先就是獲取惟一的 id 了,就須要一個表來專門建立 id,插入一條記錄,並獲取最後插入的 ID。
這種方法效果很好,可是在高併發狀況下,MySQL 的 AUTO_INCREMENT 將致使整個數據庫慢。若是存在自增字段,MySQL 會維護一個自增鎖,innodb 會在內存裏保存一個計數器來記錄 auto_increment 值,當插入一個新行數據時,就會用一個表鎖來鎖住這個計數器,直到插入結束。
(2)經過 redis 生成 ID
(3)隊列方式
使用隊列服務,如 redis、memcacheq 等等,將必定量的 ID 預分配在一個隊列裏,每次插入操做,先從隊列中獲取一個 ID,若插入失敗的話,將該 ID 再次添加到隊列中,同時監控隊列數量,當小於閥值時,自動向隊列中添加元素。
這種方式能夠有規劃的對 ID 進行分配,還會帶來經濟效應,好比 QQ 號碼,各類靚號,明碼標價。如網站的 userid, 容許 uid 登錄,推出各類靚號,明碼標價,對於普通的 ID 打亂後再隨機分配。
(5)oracle sequence : 基於第三方 oracle 的 SEQ.NEXTVAL 來獲取一個 ID 優點:簡單可用 缺點:須要依賴第三方 oracle 數據庫
(6)mysql id 區間隔離 : 不一樣分庫設置不一樣的起始值和步長,好比 2 臺 mysql,就能夠設置一臺只生成奇數,另外一臺生成偶數. 或者 1 臺用 0~10 億,另外一臺用 10~20 億. 優點:利用 mysql 自增 id 缺點:運維成本比較高,數據擴容時須要從新設置步長。
(7)基於數據庫更新+內存分配: 在數據庫中維護一個 ID,獲取下一個 ID 時,會對數據庫進行 ID=ID+100 WHERE ID=XX,拿到 100 個 ID 後,在內存中進行分配 優點:簡單高效 缺點:沒法保證自增順序
具體請看:
5. MySql 的主從實時備份同步的配置,以及原理 (從庫讀主庫的 binlog),讀寫分離。
具體請看:
6. 寫 SQL 語句和 SQL 優化
具體請看:
7. 索引的數據結構,B + 樹
具體請看:MySQL 索引背後的數據結構及算法原理
8. 數據庫的鎖:行鎖,表鎖;樂觀鎖,悲觀鎖
模式 | 行鎖 | 表鎖 | 頁鎖 |
---|---|---|---|
MyISAM | √ | ||
BDB | √ | √ | |
InnoDB | √ | √ |
表鎖更適用於以查詢爲主,只有少許按索引條件更新數據的應用;行鎖更適用於有大量按索引條件併發更新少許不一樣數據,同時又有併發查詢的應用。
具體請看:數據庫鎖:樂觀鎖和悲觀鎖,共享鎖和排它鎖,行級鎖和表級鎖
9. 數據庫事務的幾種粒度
數據庫訪問控制的粒度可分爲 4 個層次, 分別是數據庫級、表級、記錄級 (行級) 和屬性級(字段級)
具體請看:數據庫事務的四大特性
10. 關係型和非關係型數據庫區別
關係型數據庫經過外鍵關聯來創建表與表之間的關係,非關係型數據庫一般指數據以對象的形式存儲在數據庫中,而對象之間的關係經過每一個對象自身的屬性來決定。
當前主流的關係型數據庫有 Oracle、DB二、Microsoft SQL Server、Microsoft Access、MySQL 等。
非關係型數據庫有 NoSql、Cloudant。
nosql 和關係型數據庫比較?
優勢:
缺點:
好比 mysql 與 mongodb 的對比: