mysql簡單總結

在這裏插入圖片描述

行鎖的類型

  • 共享鎖(s):又稱讀鎖。允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖。若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
    SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

用SELECT … IN SHARE MODE獲得共享鎖,主要用在需要數據依存關係時來確認某行記錄是否存在,並確保沒有人對這個記錄進行UPDATE或者DELETE操作。但是如果當前事務也需要對該記錄進行更新操作,則很有可能造成死鎖,對於鎖定行記錄後需要進行更新操作的應用,應該使用SELECT… FOR UPDATE方式獲得排他鎖。

  • 排他鎖(X):又稱寫鎖。允許獲取排他鎖的事務更新數據,阻止其他事務取得相同的數據集共享讀鎖和排他寫鎖。若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。
    SELECT * FROM table_name WHERE ... FOR UPDATE

什麼條件會產生間隙鎖

  • 範圍查找時select where empid > 101 for update,> 101(實際上並不存在),也會加上間隙鎖

這樣做一方面防止幻讀,如果不加間隙鎖,其他事務插入empid>101的如果本事務再次執行,就會發生幻讀;

  • 查詢一個不存在的記錄時,也會加上間隙鎖

螞蟻P7面經總結,被MySQL難倒了,奮發圖強後二次面試入職螞蟻金服 https://www.jianshu.com/p/73789fca138b

五輪阿里面試題及答案 https://www.jianshu.com/p/c8a271448dcd

數據庫連接池到底應該設多大?

計算公式

下面的公式是由PostgreSQL提供的,不過我們認爲可以廣泛地應用於大多數數據庫產品。你應該模擬預期的訪問量,並從這一公式開始測試你的應用,尋找最合適的連接數值。

連接數 = ((核心數 * 2) + 有效磁盤數)

核心數不應包含超線程(hyper thread),即使打開了hyperthreading也是。如果活躍數據全部被緩存了,那麼有效磁盤數是0,隨着緩存命中率的下降,有效磁盤數逐漸趨近於實際的磁盤數。這一公式作用於SSD時的效果如何尚未有分析。
按這個公式,你的4核i7數據庫服務器的連接池大小應該爲((4 * 2) + 1) = 9。取個整就算是是10吧。是不是覺得太小了?跑個性能測試試一下,我們保證它能輕鬆搞定3000用戶以6000TPS的速率併發執行簡單查詢的場景。如果連接池大小超過10,你會看到響應時長開始增加,TPS開始下降。

筆者注:這一公式其實不僅適用於數據庫連接池的計算,大部分涉及計算和I/O的程序,線程數的設置都可以參考這一公式。我之前在對一個使用Netty編寫的消息收發服務進行壓力測試時,最終測出的最佳線程數就剛好是CPU核心數的一倍。

公理:你需要一個小連接池,和一個充滿了等待連接的線程的隊列

如果你有10000個併發用戶,設置一個10000的連接池基本等於失了智。1000仍然很恐怖。即是100也太多了。你需要一個10來個連接的小連接池,然後讓剩下的業務線程都在隊列裏等待。連接池中的連接數量應該等於你的數據庫能夠有效同時進行的查詢任務數(通常不會高於2*CPU核心數)。

我們經常見到一些小規模的web應用,應付着大約十來個的併發用戶,卻使用着一個100連接數的連接池。這會對你的數據庫造成極其不必要的負擔。

請注意

連接池的大小最終與系統特性相關。

比如一個混合了長事務和短事務的系統,通常是任何連接池都難以進行調優的。最好的辦法是創建兩個連接池,一個服務於長事務,一個服務於短事務。

再例如一個系統執行一個任務隊列,只允許一定數量的任務同時執行,此時併發任務數應該去適應連接池連接數,而不是反過來。

count(1)、count(*)與count(列名)的執行區別

執行效果上

  1. count(*)包括了所有的列,相當於行數,在統計結果的時候,不會忽略列值爲NULL
  2. count(1)包括了忽略所有列,用1代表代碼行,在統計結果的時候,不會忽略列值爲NULL
  3. count(列名)只包括列名那一列,在統計結果的時候,會忽略列值爲空(這裏的空不是隻空字符串或者0,而是表示null)的計數,即某個字段值爲NULL時,不統計。

執行效率上

  1. 列名爲主鍵,count(列名)會比count(1)快
  2. 列名不爲主鍵,count(1)會比count(列名)快
  3. 如果表多個列並且沒有主鍵,則 count(1) 的執行效率優於 count(*)
  4. 如果有主鍵,則 select count(主鍵)的執行效率是最優的
  5. 如果表只有一個字段,則 select count(*)最優。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章