数据库的哪些事儿~~
一 ?. 事務的四個特性?
四大特性是:ACID?原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)+介紹四個特性概念;
原子性:整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。
隔離性:當兩個或者多個事務并發訪問(此處訪問指查詢和修改的操作)數據庫的同一數據時所表現出的互相關系。事務隔離分為不同的級別,包括讀未提交(Read uncommitted)、讀提交(Read committed)、可重復讀(Repeatable read)和串行化(Serializable)。隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用于同一數據。
持久性:在事務完成以后,該事務對數據庫所作的更改便持久的保存在數據庫之中,并不會被回滾。
? ?二 . ?事務的隔離級別
讀未提交(Read uncommitted)、讀已提交(Read committed)、可重復讀(Repeatable read)和串行化(Serializable)
① Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。
SERIALIZABLE可以防止除更新丟失外所有的一致性問題,即:
1.語句無法讀取其它事務已修改但未提交的記錄。
2.在當前事務完成之前,其它事務不能修改目前事務已讀取的記錄。
3.在當前事務完成之前,其它事務所插入的新記錄,其索引鍵值不能在當前事務的任何語句所讀取的索引鍵范圍中。
② Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。
REPEATABLE READ事務不會產生臟讀,并且在事務完成之前,任何其它事務都不能修改目前事務已讀取的記錄(這一點和串行化一樣)。其它事務仍可以插入新記錄,但必須符合當前事務的搜索條件——這意味著當前事務重新查詢記錄時,會產生幻讀(Phantom Read)。
③ Read committed (讀已提交):可避免臟讀的發生。
語句無法讀取其它事務已修改但未提交的記錄。(這一點 和串行化一樣)
④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。
三.?四大沖突問題(臟不更換)
1、臟讀(讀錯)
某個事務讀取的數據是另一個事務正在處理的數據。而另一個事務可能會回滾,造成第一個事務讀取的數據是錯誤的。
2、不可重復讀(讀舊)
在一個事務里兩次讀入數據,但另一個事務已經更改了第一個事務涉及到的數據,造成第一個事務讀入舊數據。
3、幻讀
幻讀是指當事務不是獨立執行時發生的一種現象。例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶發現表中還存在沒有被修改的數據行,就好象發生了幻覺一樣。
4、更新丟失
多個事務同時讀取某一數據,一個事務成功處理好了數據,被另一個事務寫回原值,造成第一個事務更新丟失。
四。?樂觀鎖和悲觀鎖?使用場景?
樂觀鎖:默認讀數據的時候不會修改,所以不會上鎖;
悲觀鎖:默認讀數據的時候會修改,所以會上鎖;
樂觀鎖適用于多讀少寫的情況,省去鎖的開銷,加大系統的吞吐量。
?
五。?MySQL引擎的區別?
mysql兩種存儲引擎:InnoDB和MyISAM 區別:(1.事務;2.鎖;3.效率;4.查詢/插入更新)1).MyISAM是非事務安全型的,而InnoDB是事務安全型的。
2).MyISAM鎖的粒度是表級,而InnoDB支持行級鎖定。
3).MyISAM相對簡單,所以在效率上要優于InnoDB,小型應用可以考慮使用MyISAM。
4).MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。如果應用中需要執行大量的SELECT查詢,那么MyISAM是更好的選擇。
5).InnoDB用于事務處理應用程序,具有眾多特性,包括ACID事務支持。如果應用中需要執行大量的INSERT或UPDATE操作,則應該使用InnoDB,這樣可以提高多用戶并發操作的性能。由于鎖的粒度更小,寫操作不會鎖定全表,所以在并發較高時,使用Innodb引擎會提升效率。
六。?數據庫索引有哪些類型?
普通索引、唯一索引、主鍵索引、組合索引;
普通索引:沒有任何限制;
唯一索引:索引列的值必須唯一,但允許有空值;
主鍵索引:特殊的唯一索引,不允許有空值;一個表只能有一個主鍵;
組合索引:多個字段組合作為索引;
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。
補充聚集索引和非聚集索引的區別:
聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第一個索引值的紀錄被找到,具有連續索引值的記錄也一定緊跟其后。聚集索引的缺點是對表進行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到數據頁的相應位置,必須在數據頁中進行數據重排,降低了執行速度。建議使用聚集索引的場合為:
a.此列包含有限數目的不同值;
b.查詢的結果返回一個區間的值;
c.查詢的結果返回某值相同的大量結果集。
?七。?數據庫索引原理?具體參考博文:https://blog.csdn.net/weixin_37766296/article/details/80461963
索引:數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現通常使用B樹及其變種B+樹。
在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。
八。B樹和B+樹原理?
為什么使用B樹???????二叉查找樹結構由于樹的深度過大而造成磁盤I/O讀寫過于頻繁,進而導致查詢效率低下。采用多叉樹結構減少樹的深度,從而達到有效避免磁盤過于頻繁的查找存取操作,從而有效提高查找效率。
動態查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(Balanced Binary Search Tree),紅黑樹(Red-Black Tree ),B-tree/B+-tree/ B*-tree?(B~Tree)。前三者是典型的二叉查找樹結構,其查找的時間復雜度O(log2N)與樹的深度相關,那么降低樹的深度自然會提高查找效率。
??????但是咱們有面對這樣一個實際問題:就是大規模數據存儲中,實現索引查詢這樣一個實際背景下,樹節點存儲的元素數量是有限的(如果元素數量非常多的話,查找就退化成節點內部的線性查找了),這樣導致二叉查找樹結構由于樹的深度過大而造成磁盤I/O讀寫過于頻繁,進而導致查詢效率低下(為什么會出現這種情況,待會在外部存儲器-磁盤中有所解釋),那么如何減少樹的深度(當然是不能減少查詢的數據量),一個基本的想法就是:采用多叉樹結構(由于樹節點元素數量是有限的,自然該節點的子樹數量也就是有限的)。(解釋為什么使用B樹)
? ? ??也就是說,因為磁盤的操作費時費資源,如果過于頻繁的多次查找勢必效率低下。那么如何提高效率,即如何避免磁盤過于頻繁的多次查找呢?根據磁盤查找存取的次數往往由樹的高度所決定,所以,只要我們通過某種較好的樹結構減少樹的結構盡量減少樹的高度,那么是不是便能有效減少磁盤查找存取的次數呢?那這種有效的樹結構是一種怎樣的樹呢?
??????這樣我們就提出了一個新的查找樹結構——多路查找樹。根據平衡二叉樹的啟發,自然就想到平衡多路查找樹結構,也就是這篇文章所要闡述的第一個主題B~tree,即B樹結構(后面,我們將看到,B樹的各種操作能使B樹保持較低的高度,從而達到有效避免磁盤過于頻繁的查找存取操作,從而有效提高查找效率)。
九。什么是B+樹?(??)
B+樹是B樹的變體,也是多路搜索樹;B+樹的特點是:
1)非葉子結點的子樹指針P[i],指向關鍵字值屬于[K[i], K[i+1])的子樹(B-樹是開區間)
? ? ? 2)所有關鍵字都在葉子結點出現;
3)所有的非葉子節點相當于是葉子節點的索引;
4)為所有葉子結點增加一個鏈指針;
B+的搜索與B樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹可以在非葉子結點命中),其性能也等價于在關鍵字全集做一次二分查找;
B+樹和B+樹的區別:
?????? 1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;
?????? 2.只會在葉子結點命中;
?????? 3.非葉子結點相當于是葉子結點的索引(稀疏索引),葉子結點相當于是存儲(關鍵字)數據的數據層;
?
B+樹相比B樹的優點:?
(1) B+樹改進了B樹, 讓內結點只作索引使用, 去掉了其中指向data的指針, 使得每個結點中能夠存放更多的key, 這樣訪問葉節點的數據的磁盤讀寫次數就更低;
(2) 由于底部的葉子結點是鏈表形式, 因此也可以實現更方便的順序遍歷, 而B樹則需要對整個樹的每一層遍歷,需要更多的磁盤讀寫;
十。?為什么用數據庫連接池?
1)資源重用。連接池里的連接可以重復使用,避免了頻繁創建、釋放連接引起的大量性能開銷。 2)更快的系統響應速度 。數據庫連接池在初始化過程中,往往已經創建了若干數據庫連接置于池中備用。此時連接的初始化工作均已完成。對于業務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而縮減了系統整體響應時間。數據庫連接池配置/驅動參數?如何防止失效?
url: 連接數據庫的 URL?
username: 登陸數據庫所用的帳號?初始化連接數量initialSize:連接池啟動時創建的初始化連接數量;最大連接數maxActive:如果超過maxActive,后面的連接請求加入到等待隊列中;最大空閑連接數maxIdle:連接池中允許保持空閑狀態的最大連接數量,超過的空閑連接將被釋放;最小空閑連接數minIdle:連接池允許空閑的最小連接數量,小于則創建新的連接;最大等待時間maxWait;當沒有可用連接時,連接池等待連接被歸還的最大時間,超過時間則拋出異常。
十一。?
數據庫連接池如何防止失效? (設置參數,操作對象/空閑的時候進行驗證) testOnBorrow:取得對象時是否進行驗證,檢查對象是否有效,默認為false?testOnReturn:返回對象時是否進行驗證,檢查對象是否有效,默認為false? testWhileIdle:空閑時是否進行驗證,檢查對象是否有效,默認為false? testOnReturn,testOnBorrow這兩個參數為true時,表示會在每次請求之前和之后進行連接池測試,如果連接失效,就會將這條連接對象銷毀,創建一個新的連接對象。
testWhileIdle參數。這個參數為true時候,表示空閑時是進行驗證,檢查對象是否有效。然后minEvictableIdleTimeMillis配合timeBetweenEvictionRunsMillis,每過timeBetweenEvictionRunsMillis秒對連接池進行一次檢測,將對象閑置時間超過minEvictableIdleTimeMillis秒的對象進行銷毀,創建新的對象來取代。這樣就能保證時刻都有正常的連接池對象存在。
轉載參考:https://www.cnblogs.com/buwenyuwu/p/7222626.html?utm_source=itdadao&utm_medium=referral
總結
以上是生活随笔為你收集整理的数据库的哪些事儿~~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 实操———— Shell 远
- 下一篇: MySQL 高级 ———— MySQL逻