一、InnoDB和MyISAM有什麼區別?
InnoDB和MyISAM是MySQL中比較常用的兩個執行引擎,MySQL在5.5之前版本預設儲存引擎是MyISAM,5.5之後版本預設是InnoDB,MyISAM適合查詢以及插入為主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用。
它們主要有以下區別:
1、InnoDB支援事務,MyISAM不支援。
2、InnoDB是聚集索引,MyISAM是非聚集索引。MyISAM是採用了一種索引和資料分離的儲存方式,InnoDB的聚簇索引中索引和資料在一起。
3、InnoDB支援外來鍵,MyISAM不支援。
4、InnDB最小的鎖粒度是行鎖,MyISAM是表鎖。
5、InnoDB不支援FULLTEXT型別的索引(5.6之前不支援全文索引)。
二、char和varchar的區別?
char和varchar都用於在資料庫中儲存字串的資料型別。它們之間的主要區別在於儲存空間的使用方式:
char是一種定長的資料型別,它的長度固定且儲存時會欄位在結尾新增空格來將字串填滿指定的長度。char的長度範圍是0~255。
varchar是一種可變長度的資料型別,它只會儲存實際的字串內容,不會填充空格。因此,在儲存短字串時,varchar可以節省空間。varchar的長度範圍是0~65535。
優缺點及適應場景
對於欄位值經常改變的資料型別來說,char比varchar也更有優勢,因為char的長度固定,不會產生碎片。
varchar的優點是變長的字串型別,相容性更好;但是同時也會帶來一些問題,如使用varchar可能會產生記憶體碎片、varchar會額外需要1到2個位元組儲存長度資訊、以及update語句可能會導致頁分裂。
適用:儲存產品描述(可變長度)、儲存使用者地址、儲存使用者名稱稱。
char的優點是定長的字串型別,減少記憶體碎片,並且無需額外的磁碟空間去儲存長度資訊。但是它的缺點是會刪除列末尾的空格資訊。
適用:身份證號,訂單號,國家編碼等。
三、為什麼大廠不建議使用多表join?
之所以不建議使用join查詢,最主要的原因就是join的效率比較低。
MySQL是使用了巢狀迴圈的方式來實現關聯查詢的,就是要透過兩層迴圈,用一張表做外迴圈,第二張表做內迴圈,外迴圈每一條記錄跟內迴圈中的記錄做比較,符合條件就輸出。如果有兩藏表的話,複雜度最高是 O(n^2),三張表則是 O(n^3) ,隨著表越來越多,表中的資料量越多,join的效率就會呈指數級下降。
join
在MySQL中,可以使用join在兩個或者多個表中進行聯合查詢,join有三種,分別是inner join、left join、right join。
inner join(內連線):獲取兩個表中欄位匹配關係。
取兩個表的交集部分
left join(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
取兩個表的交集 + 左表中的資料
right join(右連線):與left join相反,獲取右表所有記錄,即使左表沒有對應匹配的記錄。
取兩個表的交集 + 右表中的資料
四、說一說MySQL一條SQL語句的執行過程?
如:select * from users where age = '18' and name = 'jiege' ;
執行過程如下圖:
① 使用聯結器,透過客戶端 / 伺服器通訊協議與MySQL建立連線。並查詢是否有許可權。
② MySQL 8.0之前檢查是否有快取,開啟了 Query Cache 且命中完全相同的SQL語句,則將查詢結果直接返回給客戶端。
③ 由解析器進行語法分析和語義分析,並生成解析樹。如查詢是 select,表明是 users、條件是 age = '18' and name = 'jiege' ,前處理器則會根據MySQL規則進一步檢查解析樹是否合法。比如檢查要查詢的資料表或資料列是否存在等。
④ 由最佳化器生成執行計劃。根據索引看看是否可以最佳化。
⑤ 執行器來執行SQL語句,這裡具體的執行會操作MySQL的儲存引擎來執行SQL語句,根據儲存引擎型別,得到查詢結果。若開啟了Query Cache ,則快取,否則直接返回。
五、什麼是資料庫事務?
資料庫事務是訪問並可能操作各種資料項的一個資料庫操作操作序列,這些操作要麼全部執行,要麼全部不執行,是一個不可分割的工作單位。事務由事務開始與事務結束直接執行的全部資料庫操作組成。
事務應該具有4個屬性:原子性,一致性,隔離性,永續性。稱為 ACID。
① 原子性:事務作為一個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行。
② 一致性:事務應確保資料庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是資料庫中的資料應滿足完整性約束。
③ 隔離性:多個事務併發執行時,一個事務的執行不應影響其他事務的執行。
④ 永續性:一個事務一旦提交,它對資料庫的修改一個永久儲存在資料庫中。