20道常見MySQL數據庫面試題+解析
-
事務四大特性(ACID)原子性、一致性、隔離性、持久性?
-
事務的并發?事務隔離級別,每個級別會引發什么問題,MySQL默認是哪個級別?
-
MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?
-
MySQL的MyISAM與InnoDB兩種存儲引擎在,事務、鎖級別,各自的適用場景?
-
查詢語句不同元素(where、jion、limit、group by、having等等)執行先后順序?
-
什么是臨時表,臨時表什么時候刪除?
-
MySQL B+Tree索引和Hash索引的區別?
-
sql查詢語句確定創建哪種類型的索引?如何優化查詢?
-
聚集索引和非聚集索引區別?
-
有哪些鎖(樂觀鎖悲觀鎖),select 時怎么加排它鎖?
-
非關系型數據庫和關系型數據庫區別,優勢比較?
-
數據庫三范式,根據某個場景設計數據表?
-
數據庫的讀寫分離、主從復制,主從復制分析的 7 個問題?
-
使用explain優化sql和索引?
-
MySQL慢查詢怎么解決?
-
什么是 內連接、外連接、交叉連接、笛卡爾積等?
-
mysql都有什么鎖,死鎖判定原理和具體場景,死鎖怎么解決?
-
varchar和char的使用場景?
-
mysql 高并發環境解決方案?
-
數據庫崩潰時事務的恢復機制(REDO日志和UNDO日志)?
1、事務四大特性(ACID)原子性、一致性、隔離性、持久性?
原子性(Atomicity)
- 原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
一致性(Consistency)
- 事務開始前和結束后,數據庫的完整性約束沒有被破壞。比如A向B轉賬,不可能A扣了錢,B卻沒收到。
隔離性(Isolation)
- 隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。
同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。
關于事務的隔離性數據庫提供了多種隔離級別,稍后會介紹到。 持久性(Durability)
- 持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
2、事務的并發?事務隔離級別,每個級別會引發什么問題,MySQL默認是哪個級別?
從理論上來說, 事務應該彼此完全隔離, 以避免并發事務所導致的問題,然而, 那樣會對性能產生極大的影響, 因為事務必須按順序運行, 在實際開發中, 為了提升性能, 事務會以較低的隔離級別運行, 事務的隔離級別可以通過隔離事務屬性指定。
2.1事務的并發問題
(1)臟讀:事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據
(2)不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果因此本事務先后兩次讀到的數據結果會不一致。
(3)幻讀:幻讀解決了不重復讀,保證了同一個事務里,查詢的結果都是事務開始時的狀態(一致性)。
例如:事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作 這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是為“1”并且提交給數據庫。 而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有跟沒有修改一樣,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。
小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改,幻讀側重于新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。
2.2事務的隔離級別
事務隔離級別
-
讀未提交:另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據臟讀
-
不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果因此本事務先后兩次讀到的數據結果會不一致。
-
可重復讀:在同一個事務里,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象
-
串行化:最高的隔離級別,在這個隔離級別下,不會產生任何異常。并發的事務,就像事務是在一個個按照順序執行一樣
2.3 MySQL默認的事務隔離級別為repeatable-read
-
MySQL 支持 4 中事務隔離級別.
-
事務的隔離級別要得到底層數據庫引擎的支持, 而不是應用程序或者框架的支持.
-
Oracle 支持的 2 種事務隔離級別:READ_COMMITED , SERIALIZABLE
2.3補充
-
SQL規范所規定的標準,不同的數據庫具體的實現可能會有些差異
-
MySQL中默認事務隔離級別是“可重復讀”時并不會鎖住讀取到的行
-
事務隔離級別:未提交讀時,寫數據只會鎖住相應的行。
-
事務隔離級別為:可重復讀時,寫數據會鎖住整張表。
-
事務隔離級別為:串行化時,讀寫數據都會鎖住整張表。
隔離級別越高,越能保證數據的完整性和一致性,但是對并發性能的影響也越大,魚和熊掌不可兼得啊。對于多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed,它能夠避免臟讀取,而且具有較好的并發性能。盡管它會導致不可重復讀、幻讀這些并發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。
21條MySQL性能調優經驗
-
為查詢緩存優化你的查詢
-
EXPLAIN你的SELECT查詢
-
當只要一行數據時使用LIMIT 1
-
為搜索字段建索引
-
在Join表的時候使用相當類型的例,并將其索引
-
千萬不要 ORDER BY RAND()
-
避免 SELECT *
-
永遠為每張表設置一個 ID
-
使用 ENUM 而不是 VARCHAR
-
從 PROCEDURE ANALYSE() 取得建議
-
盡可能的使用 NOT NULL
-
Prepared Statements
-
無緩沖的查詢
-
把 IP 地址存成 UNSIGNED INT
-
固定長度的表會更快
-
垂直分割
-
拆分大的 DELETE 或 INSERT 語句
-
越小的列會越快
-
選擇正確的存儲引擎
-
使用一個對象關系映射器(Object Relational Mapper)
-
小心“永久鏈接”
最后
由于文案過于長,在此就不一一介紹了,這份Java后端架構進階筆記內容包括:Java集合,JVM、Java并發、微服務、SpringNetty與 RPC 、網絡、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基礎、負載均衡、數據庫、一致性算法、Java算法、數據結構、分布式緩存等等知識詳解。
本知識體系適合于所有Java程序員學習,關于以上目錄中的知識點都有詳細的講解及介紹,掌握該知識點的所有內容對你會有一個質的提升,其中也總結了很多面試過程中遇到的題目以及有對應的視頻解析總結。
有需要的朋友可以點擊這里免費獲取
解及介紹,掌握該知識點的所有內容對你會有一個質的提升,其中也總結了很多面試過程中遇到的題目以及有對應的視頻解析總結。
有需要的朋友可以點擊這里免費獲取
[外鏈圖片轉存中…(img-Xdq7adtn-1624947168944)]