mysql面試題總結
1.事務的四個特性及含義
資料庫事務transanction正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、永續性(Durability)。
原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,執行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請 求,使得在同一時間僅有一個請求用於同一資料。
永續性:在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。
2.SQL語句優化
1)應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
2)應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如: select id from t where num is null 可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢: select id from t where num=0
3)很多時候用 exists 代替 in 是一個好的選擇
4)用Where子句替換HAVING 子句 因為HAVING 只會在檢索出所有記錄之後才對結果集進行過濾
5)in 和 not in 也要慎用,否則會導致全表掃描,如: select id from t where num in(1,2,3) 對於連續的數值,能用 between 就不要用 in 了: select id from t where num between 1 and 3
6)不要在 where 子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引
7)儘可能的使用 varchar 代替 char ,因為首先變長欄位儲存空間小,可以節省儲存空間,
其次對於查詢來說,在一個相對較小的欄位內搜尋效率顯然要高些
8)任何地方都不要使用 select * from t ,用具體的欄位列表代替“*”,不要返回用不到的任何欄位
9)儘量避免大事務操作,提高系統併發能力
10)應儘量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃描,如: select id from t where num=10 or num=20 可以這樣查詢: select id from t where num=10 union all select id from t where num=20
3.儲存過程與觸發器的區別
觸發器與儲存過程非常相似,觸發器也是SQL語句集,兩者唯一的區別是觸發器不能用EXECUTE語句呼叫,而是在使用者執行Transact-SQL語句時自動觸發(啟用)執行。觸發器是在一個修改了指定表中的資料時執行的儲存過程。通常通過建立觸發器來強制實現不同表中的邏輯相關資料的引用完整性和一致性。由於使用者不能繞過觸發器,所以可以用它來強制實施複雜的業務規則,以確保資料的完整性。觸發器不同於儲存過程,觸發器主要是通過事件執行觸發而被執行的,而儲存過程可以通過儲存過程名稱名字而直接呼叫。當對某一表進行諸如UPDATE、INSERT、DELETE這些操作時,SQLSERVER就會自動執行觸發器所定義的SQL語句,從而確保對資料的處理必須符合這些SQL語句所定義的規則。
4.MySQL中myisam與innodb的區別,至少5點
(1)、問5點不同;
1>.InnoDB支援事物,而MyISAM不支援事物
2>.InnoDB支援行級鎖,而MyISAM支援表級鎖
3>.InnoDB支援MVCC, 而MyISAM不支援
4>.InnoDB支援外來鍵,而MyISAM不支援
5>.InnoDB不支援全文索引,而MyISAM支援。
(2)、innodb引擎的4大特性
插入緩衝(insert buffer),二次寫(double write),自適應雜湊索引(ahi),預讀(read ahead)
(3)、2者selectcount(*)哪個更快,為什麼
myisam更快,因為myisam內部維護了一個計數器,可以直接調取。
5.事務的隔離級別
讀未提交(Read uncommitted),一個事務可以讀取另一個未提交事務的資料,最低級別,任何情況都無法保證。
讀已提交(Read committed),一個事務要等另一個事務提交後才能讀取資料,可避免髒讀的發生。
可重複讀(Repeatable read),就是在開始讀取資料(事務開啟)時,不再允許修改操作,可避免髒讀、不可重複讀的發生。
序列(Serializable),是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。
注意:大多數資料庫預設的事務隔離級別是Read committed,比如Sql Server , Oracle。Mysql的預設隔離級別是Repeatable read。
6.MySQL中InnoDB引擎的行鎖是通過加在什麼上完成(或稱實現)的?
InnoDB是基於索引來完成行鎖
例: select * from tab_with_index where id = 1 for update;
for update 可以根據條件來完成行鎖鎖定,並且 id 是有索引鍵的列,
如果 id 不是索引鍵那麼InnoDB將完成表鎖,併發將無從談起。
7.MySQL中varchar與char的區別以及varchar(50)中的50代表的涵義?
(1) varchar與char的區別
char是一種固定長度的型別,varchar則是一種可變長度的型別
(2) varchar(50)中50的涵義
最多存放50個字元,varchar(50)和(200)儲存hello所佔空間一樣,但後者在排序時會消耗更多記憶體,因為order by col採用fixed_length計算col長度(memory引擎也一樣)。