面試題: mysql資料庫 未看7

來源:互聯網
上載者:User

標籤:myisam   效能提高   部分   比較   髒讀   唯一性   刪除   提交   www.   

mysql資料庫面試總結2017年09月04日 00:11:40閱讀數:151結合網上大神還有自己面試經曆,收集的總結Mysql面試題,方便自己準備面試;mysql一個永遠都複習不完,盡量總結,差不多就可以去面試(個人觀點)1、資料庫事務的四個特性及含義
  • 資料庫事務transanction正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、持久性(Durability)。
  • 原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被復原(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
  • 一致性:在事務開始之前和事務結束以後,資料庫的完整性條件約束沒有被破壞。
  • 隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請 求,使得在同一時間僅有一個請求用於同一資料。
  • 持久性:在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被復原。
  • 一般也會問事務的四個層級,理解事務並發問題的前提: 在多個事務同時使用相同的資料的時候,可能會出現並發問題。
2、事務的隔離等級
  • 為了平衡事務並發問題的解決與資料庫的效率,設計了多種隔離等級:

    • 資料庫事務的隔離等級有4個,由低到高依次為Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(重複讀)、Serializable(序列化),這四個層級可以逐個解決髒讀、不可重複讀取、幻讀這幾類問題。

          隔離等級            髒讀   不可重複讀取   虛讀(幻讀)    Read uncommitted    √       √          √    Read committed      ×       √          √    Repeatable read     ×       ×          √    Serializable        ×       ×          ×    備忘: √: 可能出現    ×: 不會出現
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

補充:故事

  1. Read uncommitted 讀未提交

    • 公司發工資了,領導把5000元打到長貴的帳號上,但是該事務並未提交,而長貴的正好去查看賬戶,發現工資已經到賬,是5000元整,非常高興。可是不幸的是,領導發現發給長貴的工資金額不對,是2000元,於是迅速復原了事務,修改金額後,將事務提交,最後長貴實際的工資只有2000元,長貴空歡喜一場。

    • 出現上述情況,即我們所說的髒讀,兩個並發的事務,“事務A:領導給長貴發工資”、“事務B:長貴查詢工資賬戶”,事務B讀取了事務A尚未提交的資料。

    • 當隔離等級設定為Read uncommitted時,就可能出現髒讀,如何避免髒讀,請看下一個隔離等級。

      1. Read committed 讀提交
    • 長貴拿著工資卡去消費,系統讀取到卡裡確實有2000元,而此時她的老婆謝大腳也正好在網上轉賬,把謝大腳把工資卡的2000元轉到自己的賬戶,並在長貴之前提交了事務,當長貴扣款時,系統檢查到長貴的工資卡已經沒有錢,扣款失敗,長貴十分納悶,明明卡裡有錢,為何……

    • 出現上述情況,即我們所說的不可重複讀取,兩個並發的事務,“事務A:長貴消費”、“事務B:長貴的老婆謝大腳網上轉賬”,事務A事先讀取了資料,事務B緊接了更新了資料,並提交了事務,而事務A再次讀取該資料時,資料已經發生了改變。

    • 當隔離等級設定為Read committed時,避免了髒讀,但是可能會造成不可重複讀取。大多數資料庫的預設層級就是Read committed,比如Sql Server , Oracle。如何解決不可重複讀取這一問題,請看下一個隔離等級。

      1. Repeatable read 重複讀
    • 當隔離等級設定為Repeatable read時,可以避免不可重複讀取。當長貴拿著工資卡去消費時,一旦系統開始讀取工資卡資訊(即事務開始),長貴的老婆就不可能對該記錄進行修改,也就是長貴的老婆不能在此時轉賬。

    • 雖然Repeatable read避免了不可重複讀取,但還有可能出現幻讀。

    • 謝大腳查看長貴的工資卡消費記錄。有一天,她正在查詢到長貴當月信的總消費金額(select sum(amount) from transaction where month = 本月)為80元,而長貴此時正好在外面胡吃海塞後在收銀台買單,消費1000元,即新增了一條1000元的消費記錄(insert transaction … ),並提交了事務,隨後謝大腳將長貴當月消費的明細列印到A4紙上,卻發現消費總額為1080元,謝大腳很詫異,以為出現了幻覺,幻讀就這樣產生了。

    • 簡單的說,幻讀指當使用者讀取某一範圍的資料行時(不是同一行資料),另一個事務又在該範圍插入入了新行,當使用者再讀取該範圍的資料行時,會發現有新的“幻影” 行。

    • Serializable,序列化。最嚴格的事務隔離。要求事務序列化執行,即一個接一個執行,不能並發執行。不會有任何問題,但是效率太低,實際中,很少會設定這個層級。

3、drop,delete與truncate的區別
  • 這個很長,一般只要記住delete是DML語句,不會自動認可。drop/truncate都是DDL語句,執行後會自動認可。
  • TRUNCATE 和DELETE只刪除資料, DROP則刪除整個表(結構和資料)。
  • 速度效能而言,drop > truncate > delete
  • 具體連結:http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html
mysql引擎
  • 在MySQL資料庫中存在著多種引擎(不同版本的MySQL資料庫支援的引擎不同),熟悉各種引擎才能在軟體開發中應用引擎,從而開發出高效能的軟體
  • 連結:http://blog.csdn.net/gaohuanjie/article/details/50944782
  • 預設 InnoDB:該儲存引擎為MySQL表提供了ACID事務支援、系統崩潰修複能力和多版本並發控制(即MVCC Multi-Version Concurrency Control)的行級鎖;該引擎支援自增長列(auto_increment),自增長列的值不可為空,如果在使用的時候為空白則自動從現有值開始增值,如果有但是比現在的還大,則直接儲存這個值; 該引擎儲存引擎支援外鍵(foreign key) ,外鍵所在的表稱為子表而所依賴的表稱為父表。該引擎在5.5後的MySQL資料庫中為預設儲存引擎。
  • 記住兩個即可,MyISAM(搜尋方面會比較好)
索引方面
  • 建立索引的好處:建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。加大搜尋速度,查詢效能提高,提高系統效能
  • 缺點:建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。索引需要佔物理空間,除了資料表占資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。當對錶中的資料進行增加、刪除和修改的時候,索引也要動態維護,這樣就降低了資料的維護速度。
  • 索引失效的情況:
  • 1.索引不儲存null值,更準確的說,單列索引不儲存null值,複合索引不儲存全為null的值。索引不能儲存Null,所以對這列採用is null條件時,因為索引上根本沒Null值,不能利用到索引,只能全表掃描。
  • 2.不適合索引值較少的列(重複資料較多的列),
  • 3.前置模糊查詢不能利用索引(like ‘%XX’或者like ‘%XX%’)
  • 4.索引失效的幾種情況 
    • 1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼盡量少用or的原因)要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引
    • 2.對於多列索引,不是使用的第一部分,則不會使用索引
    • 3.like查詢以%開頭
    • 4.如果列類型是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引
    • 5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引
  • 連結:http://www.cnblogs.com/binyue/p/4058931.html
Mysql效能提升
  • sql語句效率提升:太多了,建議把索引失效的幾種情況說下,
  • 連結:http://www.cnblogs.com/lykbk/p/aefweere45454545454.html
  • mysql效能提升:還是太多了,連結:http://www.jianshu.com/p/5dd73a35d70f
  • 個人總結: 
    • 1、搜尋引擎的選取,MySQL預設innodb(支援事務),可以選擇MYISAM(有b-tree演算法查詢)還有其他不同引擎
    • 2、伺服器的硬體提升
    • 3、索引方面
    • 4、建表的時候盡量使用notnull
    • 5、欄位盡量固定長度
    • 6、垂直分隔(將很多欄位多分成幾張表),水平分隔(將大資料的表分成幾個小的數量級,分成幾張表,還可以分開放在幾個資料庫中,利用叢集的思想)
    • 7、最佳化sql語句(查詢執行速度比較慢的sql語句))
    • 8、添加適當預存程序,觸發器,事務等
    • 9、表的設計要符合三範式。
    • 10、讀寫分離(主從資料庫)
資料庫三範式簡單理解
  • 連結: http://blog.csdn.net/z1002137615/article/details/50836263

面試題: mysql資料庫 未看7

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.