天天看點

MySQL資料庫知識彙總-好程式員

  MySQL是一個開源的關系型資料庫,是最受歡迎的開源軟體之一,現在很多網站的資料庫都是使用MySQL。Web程式開發是Python的一個重要方向,也是以很多企業在招聘Python工程師時都會考察其對MySQL的掌握,接下來給大家分享MySQL資料庫相關的知識點。

  1、MySQL資料庫存儲過程和函數的差別

  存儲過程和函數是事先經過編譯并存儲在資料庫中的一段SQL語句的集合,二者的差別在于函數必須有傳回值,而存儲過程沒有;函數的參數隻能是IN類型,存儲過程的參數可以使用IN、OUT、INOUT類型。

  2、分庫與分表設計

  分庫與分表的目的在于減小資料庫的單庫單表負擔,提高查詢性能,縮短查詢時間。通過分表,可以減少資料庫的單表負擔,将壓力分散到不同的表上,同時因為不同的表上的資料量少了,起到提高查詢性能,縮短查詢時間的作用,此外,可以很大的緩解表鎖的問題。

  分表政策可以歸納為垂直拆分和水準拆分。

  水準分表:取模分表就屬于随機分表,而時間次元分表則屬于連續分表。

  如何設計好垂直拆分,建議将不常用的字段單獨拆分到另外一張擴充表. 将大文本的字段單獨拆分到另外一張擴充表, 将不經常修改的字段放在同一張表中,将經常改變的字段放在另一張表中。

  對于海量使用者場景,可以考慮取模分表,資料相對比較均勻,不容易出現熱點和并發通路的瓶頸。庫内分表,僅僅是解決了單表資料過大的問題,但并沒有把單表的資料分散到不同的實體機上,是以并不能減輕 MySQL 伺服器的壓力,仍然存在同一個實體機上的資源競争和瓶頸,包括CPU、記憶體、磁盤IO、網絡帶寬等。

自行車

  3、聚集索引與非聚集索引的差別

  聚集索引和非聚集索引的根本差別是表記錄的排列順序和與索引的排列順序是否一緻。 聚集索引(innodb)的葉節點就是資料節點,而非聚集索引(myisAM)的葉節點仍然是索引節點,隻不過其包含一個指向對應資料塊的指針。

  4、事務四大特性(ACID)

  原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被恢複(Rollback)到事務開始前的狀态,就像這個事務從來沒有執行過一樣。

  一緻性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精确度、串聯性以及後續資料庫可以自發性地完成預定的工作。

  隔離性:資料庫允許多個并發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導緻資料的不一緻。事務隔離分為不同級别,包括讀未送出(Read uncommitted)、讀送出(read committed)、可重複讀(repeatable read)和串行化(Serializable)。

  持久性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丢失。

  5、事務的并發?事務隔離級别,每個級别會引發什麼問題,MySQL預設是哪個級别?

  髒讀是指在一個事務處理過程中讀取了另一個事務未送出的資料。

  不可重複讀:對于資料庫中的某個資料,一個事務範圍内多次查詢卻傳回了不同的資料值。

  幻讀:事務非獨立執行時發生的一種現象,即在一個事務讀的過程中,另外一個事務可能插入了新資料記錄,影響了該事務讀的結果。

  MySQL的預設隔離級别就是Repeatable read,可重複讀。

  從理論上來說, 事務應該彼此完全隔離, 以避免并發事務所導緻的問題,然而,那樣會對性能産生極大的影響, 因為事務必須按順序運作,在實際開發中,為了提升性能,事務會以較低的隔離級别運作, 事務的隔離級别可以通過隔離事務屬性指定。