1.何為范式?
第一范式(1NF):第一范式就是無重復屬性的列。
第二范式(2NF):第二范式是在第一范式的基礎上建立起來的,即滿足第二范式必須先滿足第一范式。第二范式要求數據庫表中的每個實例或行必須可以被惟一地區分。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。
第二范式要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二范式就是非主屬性非部分依賴于主關鍵字。
第三范式(3NF):滿足 3NF 必須先滿足 2NF。簡而言之,3NF 要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。如果不存在部門信息表,則根據第三范式也應該構建它,否則就會有大量的數據冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。
2.sql 語句優化點有哪些?
應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描。
應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在 num 上設置默認值 0,確保表中 num 列沒有 null 值,然后這樣查詢:
select id from t where num=0
很多時候用 exists 代替 in 是一個好的選擇
用 Where 子句替換 HAVING 子句 因為 HAVING 只會在檢索出所有記錄之后才對結果集進行過濾
3.索引是什么?有什么作用以及優缺點?
索引是對數據庫表中一或多個列的值進行排序的結構,是幫助MySQL高效獲取數據的數據結構。
優點:
第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
第二,可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
第四,在使用分組和排序 子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
缺點:
第一,創建索引和維護索引要耗費時間,這種時間隨著數據 量的增加而增加。
第二,索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
第三,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
4.索引的實現?
平衡多路搜索樹B樹(B-tree)。B樹(Balance Tree)又叫做B- 樹(其實B-是由B-tree翻譯過來,所以B-樹和B樹是一個概念) ,它就是一種平衡多路查找樹。下圖就是一個典型的B樹:
5.什么是事務?
事務(Transaction)是并發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。
6.數據庫的樂觀鎖和悲觀鎖是什么?
數據庫管理系統(DBMS)中的并發控制的任務是確保在多個事務同時存取數據庫中同一數據時不破壞事務的隔離性和統一性以及數據庫的統一性。
樂觀并發控制(樂觀鎖)和悲觀并發控制(悲觀鎖)是并發控制主要采用的技術手段。
悲觀鎖:假定會發生并發沖突,屏蔽一切可能違反數據完整性的操作
樂觀鎖:假設不會發生并發沖突,只在提交操作時檢查是否違反數據完整性。
7.簡單說一說drop、delete與truncate的區別
SQL中的drop、delete、truncate都表示刪除,但是三者有一些差別。
delete和truncate只刪除表的數據不刪除表的結構
速度,一般來說: drop> truncate >delete
delete語句是dml,這個操作會放到rollback segement中,事務提交之后才生效;
如果有相應的trigger,執行的時候將被觸發. truncate,drop是ddl, 操作立即生效,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger.
如果你對這三者的用法還不太熟悉,建議閱讀: drop、truncate和delete的區別
8.drop、delete與truncate分別在什么場景之下使用?
1.不再需要一張表的時候,用drop。
2.想刪除部分數據行時候,用delete,并且帶上where子句
3.保留表而刪除所有數據的時候用truncate
9.什么是視圖?以及視圖的使用場景有哪些?
視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。
只暴露部分字段給訪問者,所以就建一個虛表,就是視圖。
查詢的數據來源于不同的表,而查詢者希望以統一的方式查詢,這樣也可以建立一個視圖,把多個表查詢結果聯合起來,查詢者只需要直接從視圖中獲取數據,不必考慮數據來源于不同表所帶來的差異。
10.MySQL的復制原理以及流程
binlog線程——記錄下所有改變了數據庫數據的語句,放進master上的binlog中;
從:io線程——在使用start slave 之后,負責從master上拉取 binlog 內容,放進 自己的relay log中;
從:sql執行線程——執行relay log中的語句;
11.MySQL中myisam與innodb的區別,至少5點
InnoDB支持事物,而MyISAM不支持事物
InnoDB支持行級鎖,而MyISAM支持表級鎖
InnoDB支持MVCC, 而MyISAM不支持
InnoDB支持外鍵,而MyISAM不支持
InnoDB不支持全文索引,而MyISAM支持。
12.innodb引擎的4大特性
插入緩沖(insert buffer)
二次寫(double write)
自適應哈希索引(ahi)
預讀(read ahead)
13.innodb的事務與日志的實現方式
(1)、有多少種日志;錯誤日志:記錄出錯信息,也記錄一些警告信息或者正確的信息。查詢日志:記錄所有對數據庫請求的信息,不論這些請求是否得到了正確的執行。慢查詢日志:設置一個閾值,將運行時間超過該值的所有SQL語句都記錄到慢查詢的日志文件中。二進制日志:記錄對數據庫執行更改的所有操作。中繼日志:事務日志:
(2)、事物的4種隔離級別隔離級別讀未提交(RU)讀已提交(RC)可重復讀(RR)串行
(3)、事務是如何通過日志來實現的,說得越深入越好。事務日志是通過redo和innodb的存儲引擎日志緩沖(Innodb log buffer)來實現的,當開始一個事務的時候,會記錄該事務的lsn(log sequence number)號; 當事務執行時,會往InnoDB存儲引擎的日志的日志緩存里面插入事務日志;當事務提交時,必須將存儲引擎的日志緩沖寫入磁盤(通過innodb_flush_log_at_trx_commit來控制),也就是寫數據前,需要先寫日志。這種方式稱為“預寫日志方式”。
14.MySQL中InnoDB引擎的行鎖是通過加在什么上完成(或稱實現)的?為什么是這樣子的?
InnoDB是基于索引來完成行鎖例: select * from tab_with_index where id = 1 for update;for update 可以根據條件來完成行鎖鎖定,并且 id 是有索引鍵的列,如果 id 不是索引鍵那么InnoDB將完成表鎖,并發將無從談起。
15.問了下MySQL數據庫cpu飆升到500%的話他怎么處理?
列出所有進程 show processlist 觀察所有進程 多秒沒有狀態變化的(干掉)查看超時日志或者錯誤日志 (做了幾年開發,一般會是查詢以及大批量的插入會導致cpu與i/o上漲,,,,當然不排除網絡狀態突然斷了,,導致一個請求服務器只接受到一半,比如where子句或分頁子句沒有發送,當然的一次被坑經歷)。
16.你們數據庫是否支持emoji表情,如果不支持,如何操作?
如果是utf8字符集的話,需要升級至utf8_mb4方可支持。