中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫內功心法:數據庫基本理論

發布時間:2020-07-19 16:36:21 來源:網絡 閱讀:434 作者:Java筆記丶 欄目:編程語言

1、數據庫范式

第一范式:列不可分,eg:【聯系人】(姓名,性別,電話),一個聯系人有家庭電話和公司電話,那么這種表結構設計就沒有達到 1NF;

第二范式:有主鍵,保證完全依賴。eg:訂單明細表【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName),Discount(折扣),Quantity(數量)完全依賴(取決)于主鍵(OderID,ProductID),而 UnitPrice,ProductName 只依賴于 ProductID,不符合2NF;

第三范式:無傳遞依賴(非主鍵列 A 依賴于非主鍵列 B,非主鍵列 B 依賴于主鍵的情況),eg:訂單表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主鍵是(OrderID),CustomerName,CustomerAddr,CustomerCity 直接依賴的是 CustomerID(非主鍵列),而不是直接依賴于主鍵,它是通過傳遞才依賴于主鍵,所以不符合 3NF。

2、什么是反模式

范式可以避免數據冗余,減少數據庫的空間,減輕維護數據完整性的麻煩。

然而,通過數據庫范式化設計,將導致數據庫業務涉及的表變多,并且可能需要將涉及的業務表進行多表連接查詢,這樣將導致性能變差,且不利于分庫分表。因此,出于性能優先的考量,可能在數據庫的結構中需要使用反模式的設計,即空間換取時間,采取數據冗余的方式避免表之間的關聯查詢。至于數據一致性問題,因為難以滿足數據強一致性,一般情況下,使存儲數據盡可能達到用戶一致,保證系統經過一段較短的時間的自我恢復和修正,數據最終達到一致。

需要謹慎使用反模式設計數據庫。一般情況下,盡可能使用范式化的數據庫設計,因為范式化的數據庫設計能讓產品更加靈活,并且能在數據庫層保持數據完整性。

有的時候,提升性能最好的方法是在同一表中保存冗余數據,如果能容許少量的臟數據,創建一張完全獨立的匯總表或緩存表是非常好的方法。舉個例子,設計一張“下載次數表”來緩存下載次數信息,可使在海量數據的情況下,提高查詢總數信息的速度。

另外一個比較典型的場景,出于擴展性考慮,可能會使用 BLOB 和 TEXT 類型的列存儲 JSON 結構的數據,這樣的好處在于可以在任何時候,將新的屬性添加到這個字段中,而不需要更改表結構。但是,這個設計的缺點也比較明顯,就是需要獲取整個字段內容進行解碼來獲取指定的屬性,并且無法進行索引、排序、聚合等操作。因此,如果需要考慮更加復雜的使用場景,更加建議使用 MongoDB 這樣的文檔型數據庫。

3、數據庫事務

事務是一個不可分割的數據庫操作序列,也是數據庫并發控制的基本單位,其執行的結果必須使數據庫從一種一致性狀態變到另一種一致性狀態。

(1). 事務的特征

原子性(Atomicity):事務所包含的一系列數據庫操作要么全部成功執行,要么全部回滾;

一致性(Consistency):事務的執行結果必須使數據庫從一個一致性狀態到另一個一致性狀態;

隔離性(Isolation):并發執行的事務之間不能相互影響;

持久性(Durability):事務一旦提交,對數據庫中數據的改變是永久性的。

(2). 事務并發帶來的問題

臟讀:一個事務讀取了另一個事務未提交的數據;

不可重復讀:不可重復讀的重點是修改,同樣條件下兩次讀取結果不同,也就是說,被讀取的數據可以被其它事務修改;

幻讀:幻讀的重點在于新增或者刪除,同樣條件下兩次讀出來的記錄數不一樣。

(3). 隔離級別

隔離級別決定了一個session中的事務可能對另一個session中的事務的影響。

ANSI標準定義了4個隔離級別,MySQL的InnoDB都支持,分別是:

READ UNCOMMITTED(未提交讀):最低級別的隔離,通常又稱為dirty read,它允許一個事務讀取另一個事務還沒commit的數據,這樣可能會提高性能,但是會導致臟讀問題;

READ COMMITTED(提交讀):在一個事務中只允許對其它事務已經commit的記錄可見,該隔離級別不能避免不可重復讀問題;

REPEATABLE READ(可重復讀):在一個事務開始后,其他事務對數據庫的修改在本事務中不可見,直到本事務commit或rollback。但是,其他事務的insert/delete操作對該事務是可見的,也就是說,該隔離級別并不能避免幻讀問題。在一個事務中重復select的結果一樣,除非本事務中update數據庫。

SERIALIZABLE(可串行化):最高級別的隔離,只允許事務串行執行。

MySQL默認的隔離級別是REPEATABLE READ。

數據庫內功心法:數據庫基本理論

4、什么是存儲過程?有哪些優缺點?

存儲過程是事先經過編譯并存儲在數據庫中的一段SQL語句的集合。進一步地說,存儲過程是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然后再給這個代碼塊取一個名字,在用到這個功能的時候調用他就行了。存儲過程具有以下特點:

  • 存儲過程只在創建時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行效率;

  • 當SQL語句有變動時,可以只修改數據庫中的存儲過程而不必修改代碼;

  • 減少網絡傳輸,在客戶端調用一個存儲過程當然比執行一串SQL傳輸的數據量要小;

  • 通過存儲過程能夠使沒有權限的用戶在控制之下間接地存取數據庫,從而確保數據的安全。

5、簡單說一說drop、delete與truncate的區別

SQL中的drop、delete、truncate都表示刪除,但是三者有一些差別:

Delete用來刪除表的全部或者一部分數據行,執行delete之后,用戶需要提交(commmit)或者回滾(rollback)來執行刪除或者撤銷刪除, delete命令會觸發這個表上所有的delete觸發器;

Truncate刪除表中的所有數據,這個操作不能回滾,也不會觸發這個表上的觸發器,TRUNCATE比delete更快,占用的空間更小;

Drop命令從數據庫中刪除表,所有的數據行,索引和權限也會被刪除,所有的DML觸發器也不會被觸發,這個命令也不能回滾。

因此,在不再需要一張表的時候,用drop;在想刪除部分數據行時候,用delete;在保留表而刪除所有數據的時候用truncate。

6、什么叫視圖?游標是什么?

視圖是一種虛擬的表,通常是有一個表或者多個表的行或列的子集,具有和物理表相同的功能,可以對視圖進行增,刪,改,查等操作。特別地,對視圖的修改不影響基本表。相比多表查詢,它使得我們獲取數據更容易。

游標是對查詢出來的結果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要。

在操作mysql的時候,我們知道MySQL檢索操作返回一組稱為結果集的行。這組返回的行都是與 SQL語句相匹配的行(零行或多行)。使用簡單的 SELECT語句,例如,沒有辦法得到第一行、下一行或前 10行,也不存在每次一行地處理所有行的簡單方法(相對于成批地處理它們)。有時,需要在檢索出來的行中前進或后退一行或多行。這就是使用游標的原因。游標(cursor)是一個存儲在MySQL服務器上的數據庫查詢,它不是一條 SELECT語句,而是被該語句檢索出來的結果集。在存儲了游標之后,應用程序可以根據需要滾動或瀏覽其中的數據。游標主要用于交互式應用,其中用戶需要滾動屏幕上的數據,并對數據進行瀏覽或做出更改。

7、什么是觸發器?

觸發器是與表相關的數據庫對象,在滿足定義條件時觸發,并執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在數據庫端確保數據庫的完整性。

8、超鍵、候選鍵、主鍵、外鍵

  • 超鍵:在關系中能唯一標識元組的屬性集稱為關系模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

  • 候選鍵:是最小超鍵,即沒有冗余元素的超鍵。

  • 主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

  • 外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

9、什么是事務?什么是鎖?

  • 事務:就是被綁定在一起作為一個邏輯工作單元的 SQL 語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過 ACID 測試,即原子性,一致性,隔離性和持久性。

  • 鎖:在所以的 DBMS 中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和并發性。與現實生活中鎖一樣,它可以使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。當然鎖還分級別的。

10、數據庫鎖機制

數據庫鎖定機制簡單來說就是數據庫為了保證數據的一致性而使各種共享資源在被并發訪問,訪問變得有序所設計的一種規則。MySQL各存儲引擎使用了三種類型(級別)的鎖定機制:行級鎖定,頁級鎖定和表級鎖定。

  • 表級鎖定(table-level):表級別的鎖定是MySQL各存儲引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點是實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。由于表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。當然,鎖定顆粒度大所帶來最大的負面影響就是出現鎖定資源爭用的概率也會最高,致使并大度大打折扣。表級鎖分為讀鎖和寫鎖。

  • 頁級鎖定(page-level):頁級鎖定的特點是鎖定顆粒度介于行級鎖定與表級鎖之間,所以獲取鎖定所需要的資源開銷,以及所能提供的并發處理能力也同樣是介于上面二者之間。另外,頁級鎖定和行級鎖定一樣,會發生死鎖。

  • 行級鎖定(row-level):行級鎖定最大的特點就是鎖定對象的顆粒度很小,也是目前各大數據庫管理軟件所實現的鎖定顆粒度最小的。由于鎖定顆粒度很小,所以發生鎖定資源爭用的概率也最小,能夠給予應用程序盡可能大的并發處理能力而提高一些需要高并發應用系統的整體性能。雖然能夠在并發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。由于鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了。此外,行級鎖定也最容易發生死鎖。InnoDB的行級鎖同樣分為兩種,共享鎖和排他鎖,同樣InnoDB也引入了意向鎖(表級鎖)的概念,所以也就有了意向共享鎖和意向排他鎖,所以InnoDB實際上有四種鎖,即共享鎖(S)、排他鎖(X)、意向共享鎖(IS)、意向排他鎖(IX);

在MySQL數據庫中,使用表級鎖定的主要是MyISAM,Memory,CSV等一些非事務性存儲引擎,而使用行級鎖定的主要是Innodb存儲引擎和NDBCluster存儲引擎,頁級鎖定主要是BerkeleyDB存儲引擎的鎖定方式。

而意向鎖的作用就是當一個事務在需要獲取資源鎖定的時候,如果遇到自己需要的資源已經被排他鎖占用的時候,該事務可以需要鎖定行的表上面添加一個合適的意向鎖。如果自己需要一個共享鎖,那么就在表上面添加一個意向共享鎖。而如果自己需要的是某行(或者某些行)上面添加一個排他鎖的話,則先在表上面添加一個意向排他鎖。意向共享鎖可以同時并存多個,但是意向排他鎖同時只能有一個存在。

數據庫內功心法:數據庫基本理論


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博客| 石渠县| 江油市| 宝兴县| 高唐县| 凤阳县| 临夏县| 建昌县| 盈江县| 藁城市| 偏关县| 元氏县| 宜州市| 旺苍县| 嘉定区| 通渭县| 彭州市| 高唐县| 刚察县| 绥芬河市| 玉屏| 黄石市| 根河市| 惠州市| 苗栗市| 高密市| 襄城县| 宜章县| 南川市| 贵南县| 百色市| 大英县| 汽车| 杂多县| 昌都县| 越西县| 梧州市| 贵溪市| 阿拉善左旗| 大丰市| 盱眙县|