MySQL基礎概念相關的名詞仍是挺多的,好比3大範式、4種隔離界別、ACID、DQL、DML、DDL,還有redo、undo、binlog等,本文就統一整理下MySQL常見的基礎概念,方便小夥伴們翻閱~php
MySQL相關的名詞概念仍是挺多的,可是經常使用的也很少,所以將經常使用的統計整理下,便於回顧:html
- DQL:data query language,指SELECT查詢語句;
- DML:data manipulation language,指SELECT、UPDATE、INSERT、DELETE這4種對數據操控語句;
- DDL:data definition language,數據定義語句,建立/修改/刪除表結構,主要有CREATE、ALTER、DROP等;
- MDL鎖:Metadata Locking,這裏的metalock指的是數據庫及表的結構信息。MySQL中,DDL不屬於事務範疇,若是事務和DDL並行執行,操做相關聯的表的話,會出現各類意想不到問題,致使事務特性被破壞或者binlog順序錯亂等,爲解決這些問題而引入MDL鎖機制。
三大範式mysql
- 第一範式:每一個字段都是原子的,也就說不可再分解;
- 第二範式:有主鍵,非主鍵字段依賴主鍵字段;
- 第三範式:非主鍵之間不能相互依賴。
注意,三大範式是數據表的建議設計原則,並非非得徹底按照這個來設計,具體設計還要根據實際場景來分析。任何給定的數據一般有多種表示方法,徹底的範式話和反範式化,以及兩者的折中。在範式化數據庫中,任何數據都會出現且只出現一次,相反在反範式化中,數據是冗餘的。sql
ACID數據庫
ACID是事務的4個特性,分別是原子性、一致性、隔離性和持久性。服務器
- A:atomicity,原子性,一個事務必須被視爲一個不可分割的最小工做單元,整個事務中的全部操做要麼所有提交成功,要麼所有失敗回滾;
- C:consistency,一致性,數據庫老是從一個一致性的狀態轉換到另外一個一致性的狀態;
- I:isolation,隔離性,一般來講,一個事務所作的修改在最終提交之前,對其餘事務是不可見的(隔離級別在非提交讀時不知足);
- D:一旦事務提交,則其所作的修改就會永久保存到數據庫中。
隔離級別併發
數據庫事務的4種隔離級別:性能
- 未提交讀:一個事務能夠讀到另一個事務未提交的數據。
- 提交度:一個事務更新數據過程當中,若是事務還未提交,其餘事務讀不到該數據。
- 可重複讀:該級別保證了在同一個事務中,屢次讀取一樣記錄的結果是同樣的,解決了「提交讀」中不可重複讀的問題。可是理論上仍是沒法解決幻讀問題(經過間隙鎖可解決幻讀問題)。
- 串行化:將全部事務都進行串行化處理,等級最高的隔離級別。
幻讀問題atom
幻讀就是當事務在讀取某個範圍數據時,另外一個事務又在該範圍插入了新的數據,當以前的事務再次讀取該範圍數據時,就會產生幻行。產生幻讀的緣由是以前的事務在讀取數據的範圍沒有增長範圍鎖(range-locks),也就是讀取時只是鎖定的行級共享鎖,沒有鎖定整個查詢區間或者表。設計
常見索引結構
- B+樹索引:B+ 樹是關係型數據庫中常見的索引類型。注意:B+樹因此並不能找到一個給定鍵值的具體行,只能找到被查找數據行所在的頁,而後數據庫將頁讀入內存,在內存中進行查找,最後獲得要查找的數據;
- 哈希索引:InnoDB支持的哈希索引是自適應的,不能人爲干預在一張表中生成哈希索引,innodb會根據表的使用狀況自動生成哈希索引;
- 全文索引:InnoDB支持全文索引,可是每張表只能有一個全文檢索的索引,通常都是使用倒排索引技術來實現。
彙集索引和非彙集索引
彙集索引就是主鍵索引,其葉子節點就是記錄的數據(頁)。非彙集索引也叫作輔助索引,其葉子結點記錄的是主鍵值。以表t爲例說明以下:
create table T (
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k)) engine=InnoDB;
insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff');
表T對應的主鍵索引和輔助索引以下:
幾個日誌
- redo log:記錄的是頁的物理操做,InnoDB經過將事務操做先寫redo log,而不是將數據頁的更新寫磁盤,至關於將磁盤隨機寫(data文件)變成了順序寫(redo log),後續在MySQL」空閒」時再慢慢寫磁盤,提升服務器性能;
- undo log:undo log保存了事務發生以前的數據的版本,可用於回滾,同時可提供多版本併發控制讀(MVCC),也就是非鎖定讀。undo log是邏輯日誌,在執行undo時,僅僅是將數據邏輯上恢復至事務以前的狀態,而不是從物理頁上操做的,這一條不一樣於redo log。事務開始時將當前版本生成undo log,undo也會產生redo來保證undo log可靠性;
- binlog:binlog是mysql層面的歸檔日誌,可用於主從複製和數據庫基於時間點的還原。binlog記錄的是邏輯日誌,記錄的是DDL和DML操做日誌,能夠簡單認爲是執行過的事務中的更新sql語句。
- 慢查詢、錯誤日誌等。
幾個文件
- .ibd文件和.ibdata文件:.ibd文件和ibdata文件都是存放innodb數據的文件,之全部有2個,由於innodb支持配置來決定是使用共享表空間仍是獨享表空間。獨享表空間使用」.ibd」文件存儲數據,而且每一個表有一個.ibd文件;若是使用共享表空間,則會使用ibdata文件,全部表公用一個(或者配置多個)ibdata文件。
- .ifm文件:存放表相關的元數據信息。
原文地址:https://mp.weixin.qq.com/s?__biz=MzIwNTI2ODY5OA==&mid=2649938420&idx=1&sn=dfc0bedd7f0e59b41511bfe492f5d45c&chksm=8f350a41b84283577e87cf4fde1470babcb837a5352f21fb422959129d211bd0eaf21f29f795&token=1297190316&lang=zh_CN#rd