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引擎也一樣)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章