事務四大特性(ACID)原子性、一致性、隔離性、持久性?mysql
事務的併發?事務隔離級別,每一個級別會引起什麼問題,MySQL默認是哪一個級別?程序員
MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?面試
MySQL的MyISAM與InnoDB兩種存儲引擎在,事務、鎖級別,各自的適用場景?sql
查詢語句不一樣元素(where、jion、limit、group by、having等等)執行前後順序?數據庫
什麼是臨時表,臨時表何時刪除?編程
MySQL B+Tree索引和Hash索引的區別?緩存
sql查詢語句肯定建立哪一種類型的索引?如何優化查詢?網絡
彙集索引和非彙集索引區別?併發
有哪些鎖(樂觀鎖悲觀鎖),select 時怎麼加排它鎖?app
非關係型數據庫和關係型數據庫區別,優點比較?
數據庫三範式,根據某個場景設計數據表?
數據庫的讀寫分離、主從複製,主從複製分析的 7 個問題?
使用explain優化sql和索引?
MySQL慢查詢怎麼解決?
什麼是 內鏈接、外鏈接、交叉鏈接、笛卡爾積等?
mysql都有什麼鎖,死鎖斷定原理和具體場景,死鎖怎麼解決?
varchar和char的使用場景?
mysql 高併發環境解決方案?
數據庫崩潰時事務的恢復機制(REDO日誌和UNDO日誌)?
一、事務四大特性(ACID)原子性、一致性、隔離性、持久性?
原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)
同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。
關於事務的隔離性數據庫提供了多種隔離級別,稍後會介紹到。 持久性(Durability)
二、事務的併發?事務隔離級別,每一個級別會引起什麼問題,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,它可以避免髒讀取,並且具備較好的併發性能。儘管它會致使不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。
爲查詢緩存優化你的查詢
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編程思想》、《Java核心技術》這些書籍,看完你確定會放棄學習。建議能夠看一些視頻來學習,當本身能上手再買這些書看又是很是有收穫的事了。