主頁 > 資料庫 > 面試匯總(二):資料庫常面試總結

面試匯總(二):資料庫常面試總結

2020-09-10 08:48:23 資料庫

前言

??今天我們給大家介紹在面試中,資料庫常見的面試題,資料庫在計算機行業中是一個很重要的技術,無論是在開發專案還是在演算法崗,我們在做任何的專案之前,都要將資料存盤在資料庫中,不過一般資料庫面試問的最多的崗位是后端開發以及測驗崗,接下來,本文給大家介紹本人在這兩天的面試中問到的資料庫相關的面試題以及知識點,

面試題及參考答案

一、資料庫基礎核心問題

1、資料庫索引

?? 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊,如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取資訊,
索引的一個主要目的就是加快檢索表中資料的方法,亦即能協助資訊搜索者盡快的找到符合限制條件的記錄ID的輔助資料結構,

  • 優點:
    ?? 通過創建唯一性索引,可以保證資料庫表中每一行資料的唯一性,
    ?? 可以大大加快資料的檢索速度,這也是創建索引的最主要的原因,
    ?? 可以加速表和表之間的連接,特別是在實作資料的參考完整性方面特別有意義,
    ?? 在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間,
    ?? 通過使用索引,可以在查詢的程序中,使用優化隱藏器,提高系統的性能,
  • 缺點:
    ?? 創建索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加,
    ?? 索引需要占物理空間,除了資料表占資料空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大,
    ?? 當對表中的資料進行增加、洗掉和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度,
  • 添加索引原則
    ?? 在查詢中很少使用或者參考的列不應該創建索引,這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度,相反,由于增加了索引,反而降低了系統的維護速度和增大了空間需求,
    ??只有很少資料值的列也不應該增加索引,這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行占了表中資料行的很大比例,即需要在表中搜索的資料行的比例很大,增加索引,并不能明顯加快檢索速度,
    ??定義為text、image和bit資料型別的列不應該增加索引,這是因為,這些列的資料量要么相當大,要么取值很少,
    ??當修改性能遠遠大于檢索性能時,不應該創建索引,這是因為,修改性能和檢索性能是互相矛盾的,當增加索引時,會提高檢索性能,但是會降低修改性能,當減少索引時,會提高修改性能,降低檢索性能,因此,當修改性能遠遠大于檢索性能時,不應該創建索引,

2、inner join和left join

?? left join(左聯接) 回傳包括左表中的所有記錄和右表中聯結欄位相等的記錄 right join(右聯接) 回傳包括右表中的所有記錄和左表中聯結欄位相等的記錄,inner join(等值連接) 只回傳兩個表中聯結欄位相等的行

3、資料庫事務

??事務(Transaction)是由一系列對系統中資料進行訪問與更新的操作所組成的一個程式執行邏輯單元,事務是DBMS中最基礎的單位,事務不可分割,事務具有4個基本特征,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Duration),簡稱ACID,
1)原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,[刪刪刪]因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響,
2)一致性(Consistency)
一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態,
3)隔離性(Isolation)
??隔離性是當多個用戶并發訪問資料庫時,比如操作同一張表時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離,即要達到這么一種效果:對于任意兩個并發的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始,這樣每個事務都感覺不到有其他事務在并發地執行,多個事務并發訪問時,事務之間是隔離的,一個事務不應該影響其它事務運行效果,這指的是在并發環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間,由并發事務所做的修改必須與任何其他并發事務所做的修改隔離,
不同的隔離級別:
?? Read Uncommitted(讀取未提交[添加中文釋義]內容):最低的隔離級別,什么都不需要做,一個事務可以讀到另一個事務未提交的結果,所有的并發事務問題都會發生,
?? Read Committed(讀取提交內容):只有在事務提交后,其更新結果才會被其他事務看見,可以解決臟讀問題,
?? Repeated Read(可重復讀):在一個事務中,對于同一份資料的讀取結果總是相同的,無論是否有其他事務對這份資料進行操作,以及這個事務是否提交,可以解決臟讀、不可重復讀,
??Serialization(可串行化):事務串行化執行,隔離級別最高,犧牲了系統的并發性,可以解決并發事務的所有問題,
4)持久性(Durability)
??持久性是指一個事務一旦被提交了,那么對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作,

4、資料庫的三大范式

  • 第一范式:當關系模式R的所有屬性都不能再分解為更基本的資料單位時,稱R是滿足第一范式,即屬性不可分
  • 第二范式:如果關系模式R滿足第一范式,并且R得所有非主屬性都完全依賴于R的每一個候選關鍵屬性,稱R滿足第二范式
  • 第三范式:設R是一個滿足第一范式條件的關系模式,X是R的任意屬性集,如果X非傳遞依賴于R的任意一個候選關鍵字,稱R滿足第三范式,即非主屬性不傳遞依賴于鍵碼

5、資料庫連接泄露的含義

??資料庫連接泄露指的是如果在某次使用或者某段程式中沒有正確地關閉Connection、Statement和ResultSet資源,那么每次執行都會留下一些沒有關閉的連接,這些連接失去了參考而不能得到重新使用,因此就造成了資料庫連接的泄漏,資料庫連接的資源是寶貴而且是有限的,如果在某段使用頻率很高的代碼中出現這種泄漏,那么資料庫連接資源將被耗盡,影響系統的正常運轉,

6、資料庫中的聚類查詢

?? 聚集索引中鍵值的邏輯順序決定了表中相應行的物理順序,聚集索引確定表中資料的物理順序,聚集索引類似于電話簿,后者按姓氏排列資料,由于聚集索引規定資料在表中的物理存盤順序,因此一個表只能包含一個聚集索引,但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣,聚集索引對于那些經常要搜索范圍值的列特別有效,使用聚集索引找到包含第一個值的行后,便可以確保包含后續索引值的行在物理相鄰,例如,如果應用程式執行的一個查詢經常檢索某一日期范圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然后檢索表中所有相鄰的行,直到到達結束日期,這樣有助于提高此類查詢的性能,同樣,如果對從表中檢索的資料進行排序時經常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節省成本,當索引值唯一時,使用聚集索引查找特定的行也很有效率,

7、資料庫事務、主鍵與外鍵的區別?

  • 資料庫的事務:事務即用戶定義的一個資料庫操作序列,這些操作要么全做要全不做,是一個不可分割的作業單位,它具有四個特性,ACID,原子性,一致性,隔離性,持續性,
  • 主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡,
  • 外鍵用于與另一張表的關聯,是能確定另一張表記錄的欄位,用于保持資料的一致性,

8、請問count和sum的區別,以及count(*)和count(列名)的區別

  • Count和sum區別:求和用累加sum(),求行的個數用累計count
  • Count(*)包括了所有的列,在統計結果的時候不會忽略列值為null
  • Count(列名)只包括列名那一項,會忽略列值為空的計數

9、請問什么是幻讀

??臟讀就是指當一個事務正在訪問資料,并且對資料進行了修改,但是還沒有來得及提交到資料庫中,這時,另一個事務也訪問這個資料,然后使用了這個資料

二、Mysql面試問題

1、mysql的四種隔離狀態
??Mysql主要包含四種隔離狀態:

2、介紹一下mysql的MVCC機制

?? MVCC是一種多版本并發控制機制,是MySQL的InnoDB存盤引擎實作隔離級別的一種具體方式,用于實作提交讀和可重復讀這兩種隔離級別,MVCC是通過保存資料在某個時間點的快照來實作該機制,其在每行記錄后面保存兩個隱藏的列,分別保存這個行的創建版本號和洗掉版本號,然后Innodb的MVCC使用到的快照存盤在Undo日志中,該日志通過回滾指標把一個資料行所有快照連接起來,

3、請問SQL優化方法有哪些

  • 通過建立索引對查詢進行優化
  • 對查詢進行優化,應盡量避免全表掃描
  • 調整資料結構的設計,對于經常訪問的資料庫表建立索引
  • 調整SQL陳述句, ORACLE公司推薦使用ORACLE陳述句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL陳述句,
  • 調整服務器記憶體分配,記憶體分配是在資訊系統運行程序中優化配置的,資料庫管理員可以根據資料庫運行狀況調整資料庫系統全域區(SGA區)的資料緩沖區、日志緩沖區和共享池的大小;還可以調整程式全域區(PGA區)的大小,
  • 調整硬碟I/O,DBA可以將組成同一個表空間的資料檔案放在不同的硬碟上,做到硬碟之間I/O負載均衡,

4、請你說一下MySQL引擎和區別

1、MySQL引擎
?? MySQL中的資料用各種不同的技術存盤在檔案(或者記憶體)中,這些技術中的每一種技術都使用不同的存盤機制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力,通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能,
??資料庫引擎是用于存盤、處理和保護資料的核心服務,利用資料庫引擎可控制訪問權限并快速處理事務,從而滿足企業內大多數需要處理大量資料的應用程式的要求,使用資料庫引擎創建用于聯機事務處理或聯機分析處理資料的關系資料庫,這包括創建用于存盤資料的表和用于查看、管理和保護資料安全的資料庫物件(如索引、視圖和存盤程序),
?? MySQL存盤引擎主要有: MyIsam、InnoDB、Memory、Blackhole、CSV、Performance_Schema、Archive、Federated、Mrg_Myisam,但是最常用的是InnoDB和Mylsam,
2、InnoDB
??InnoDB是一個事務型的存盤引擎,有行級鎖定和外鍵約束,
??Innodb引擎提供了對資料庫ACID事務的支持,并且實作了SQL標準的四種隔離級別,關于資料庫事務與其隔離級別的內容請見資料庫事務與其隔離級別這型別的文章,該引擎還提供了行級鎖和外鍵約束,它的設計目標是處理大容量資料庫系統,它本身其實就是基于MySQL后臺的完整資料庫系統,MySQL運行時Innodb會在記憶體中建立緩沖池,用于緩沖資料和索引,但是該引擎不支持FULLTEXT型別的索引,而且它沒有保存表的行數,當SELECT COUNT(*) FROM TABLE時需要掃描全表,當需要使用資料庫事務時,該引擎當然是首選,由于鎖的粒度更小,寫操作不會鎖定全表,所以在并發較高時,使用Innodb引擎會提升效率,但是使用行級鎖也不是絕對的,如果在執行一個SQL陳述句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,經常更新的表,適合處理多重并發的更新請求, 支持事務, 可以從災難中恢復(通過bin-log日志等), 外鍵約束,只有他支持外鍵, 支持自動增加列屬性auto_increment,
索引結構:
??InnoDB也是B+Treee索引結構,Innodb的索引檔案本身就是資料檔案,即B+Tree的資料域存盤的就是實際的資料,這種索引就是聚集索引,這個索引的key就是資料表的主鍵,因此InnoDB表資料檔案本身就是主索引,InnoDB的輔助索引資料域存盤的也是相應記錄主鍵的值而不是地址,所以當以輔助索引查找時,會先根據輔助索引找到主鍵,再根據主鍵索引找到實際的資料,所以Innodb不建議使用過長的主鍵,否則會使輔助索引變得過大,建議使用自增的欄位作為主鍵,這樣B+Tree的每一個結點都會被順序的填滿,而不會頻繁的分裂調整,會有效的提升插入資料的效率,
3、Mylsam
??MyIASM是MySQL默認的引擎,但是它沒有提供對資料庫事務的支持,也不支持行級鎖和外鍵,因此當INSERT或UPDATE資料時即寫操作需要鎖定整個表,效率便會低一些,MyIsam 存盤引擎獨立于作業系統,也就是可以在windows上使用,也可以比較簡單的將資料轉移到linux作業系統上去,不支持事務的設計,但是并不代表著有事務操作的專案不能用MyIsam存盤引擎,可以在service層進行根據自己的業務需求進行相應的控制不支持外鍵的表設計, 查詢速度很快,如果資料庫insert和update的操作比較多的話比較適用,整天對表進行加鎖的場景,MyISAM極度強調快速讀取操作, 當然, MyIsam存在缺點:就是不能在表損壞后主動恢復資料,
索引結構:
??MyISAM索引結構:MyISAM索參考的B+ tree來儲存資料,MyISAM索引的指標指向的是鍵值的地址,地址存盤的是資料,B+Tree的資料域存盤的內容為實際資料的地址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實際的資料,這種索引就是所謂的非聚集索引,
4、InnoDB和Mylsam的區別:
1)事務: MyISAM型別不支持事務處理等高級處理,而InnoDB型別支持,提供事務支持已經外部鍵等高級資料庫功能,
2)性能: MyISAM型別的表強調的是性能,其執行數度比InnoDB型別更快,
3)行數保存: InnoDB 中不保存表的具體行數,也就是說,執行select count()
fromtable時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可,注意的是,當count()陳述句包含where條件時,兩種表的操作是一樣的,
4)索引存盤: 對于AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引,MyISAM支持全文索引(FULLTEXT)、壓縮索引,InnoDB不支持,
?? MyISAM的索引和資料是分開的,并且索引是有壓縮的,記憶體使用率就對應提高了不少,能加載更多索引,而Innodb是索引和資料是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小,
?? InnoDB存盤引擎被完全與MySQL服務器整合,InnoDB存盤引擎為在主記憶體中快取資料和索引而維持它自己的緩沖池,InnoDB存盤它的表&索引在一個表空間中,表空間可以包含數個檔案(或原始磁盤磁區),這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的檔案中,InnoDB表可以是任何尺寸,即使在檔案尺寸被限制為2GB的作業系統上,
5)服務器資料備份: InnoDB必須匯出SQL來備份,LOAD TABLE FROM
?? MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用,
??MyISAM應對錯誤編碼導致的資料恢復速度快,MyISAM的資料是以檔案的形式存盤,所以在跨平臺的資料轉移中會很方便,在備份和恢復時可單獨針對某個表進行操作,
?? InnoDB是拷貝資料檔案、備份 binlog,或者用 mysqldump,在資料量達到幾十G的時候就相對痛苦了,
6)鎖的支持: MyISAM只支持表鎖,InnoDB支持表鎖、行鎖
??行鎖大幅度提高了多用戶并發操作的新能,但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的,

5、mysql洗掉陳述句

1.drop陳述句,可以用來洗掉資料庫和表,
??用drop陳述句來洗掉資料庫:drop database db;
??用drop陳述句來洗掉表:drop table tb;
2.delete陳述句,用來洗掉表中的欄位,
??delete from tb where id=1;
??如果delete陳述句中沒有加入where就會把表中的所有記錄全部洗掉:
3.用truncate來洗掉表中的所有欄位:
??truncate table tb;

6、資料庫mysql中CHAR和VCHAR的區別

1、char(n)型別
??char型別是定長的型別,即當定義的是char(10),輸入的是"abc"這三個字符時,它們占的空間一樣是10個位元組,包括7個空位元組,當輸入的字符長度超過指定的數時,char會截取超出的字符,而且,當存盤char值時,MySQL是自動洗掉輸入字串末尾的空格, char是適合存盤很短的、一般固定長度的字串,例如,char非常適合存盤密碼的MD5值,因為這是一個定長的值,對于非常短的列,char比varchar在存盤空間上也更有效率,取資料的時候,char型別的要用trim()去掉多余的空格,而varchar是不需要,
2、varchar(n)型別
??varchar(n)型別用于存盤可變長的,長度為n個位元組的可變長度且非Unicode的字符資料,n必須是介于1和8000之間的數值,存盤大小為輸入資料的位元組的實際長度+1/2. 比如varchar(10), 然后輸入abc三個字符,那么實際存盤大小為3個位元組,除此之外,varchar還需要使用1或2個額外位元組記錄字串的長度,如果列的最大長度小于等于255位元組(是定義的最長長度,不是實際長度),則使用1個位元組表示長度,否則使用2個位元組來表示,取資料的時候,不需要去掉多余的空格,

三、redis面試題問題

1、mongodb和redis的區別

  • 記憶體管理機制上:Redis 資料全部存在記憶體,定期寫入磁盤,當記憶體不夠時,可以選擇指定的 LRU 演算法洗掉資料,MongoDB 資料存在記憶體,由 linux系統 mmap 實作,當記憶體不夠時,只將熱點資料放入記憶體,其他資料存在磁盤,
  • 支持的資料結構上:Redis 支持的資料結構豐富,包括hash、set、list等,
    MongoDB 資料結構比較單一,但是支持豐富的資料表達,索引,最類似關系型資料庫,支持的查詢語言非常豐富

2、Redis的定時機制怎么實作的

??Redis服務器是一個事件驅動程式,服務器需要處理以下兩類事件:檔案事件(服務器對套接字操作的抽象)和時間事件(服務器對定時操作的抽象),Redis的定時機制就是借助時間事件實作的,
??一個時間事件主要由以下三個屬性組成:id:時間事件標識號;when:記錄時間事件的到達時間;timeProc:時間事件處理器,當時間事件到達時,服務器就會呼叫相應的處理器來處理時間,一個時間事件根據時間事件處理器的回傳值來判斷是定時事件還是周期性事件
??一個時間事件主要由以下三個屬性組成:id:時間事件標識號;when:記錄時間事件的到達時間;timeProc:時間事件處理器,當時間事件到達時,服務器就會呼叫相應的處理器來處理時間,一個時間事件根據時間事件處理器的回傳值來判斷是定時事件還是周期性事件,

3、Redis是單執行緒的,但是為什么這么高效呢?

??雖然Redis檔案事件處理器以單執行緒方式運行,但是通過使用I/O多路復用程式來監聽多個套接字,檔案事件處理器既實作了高性能的網路通信模型,又可以很好地與Redis服務器中其他同樣以單執行緒運行的模塊進行對接,這保持了Redis內部單執行緒設計的簡單性,

4、Redis的資料型別有哪些,底層怎么實作?

1)字串:整數值、embstr編碼的簡單動態字串、簡單動態字串(SDS) 2)串列:壓縮串列、雙端鏈表
3)哈希:壓縮串列、字典
4)集合:整數集合、字典
5)有序集合:壓縮串列、跳躍表和字典

5、請問Redis的rehash怎么做的,為什么要漸進rehash,漸進rehash又是怎么實作的?

?? 因為redis是單執行緒,當K很多時,如果一次性將鍵值對全部rehash,龐大的計算量會影響服務器性能,甚至可能會導致服務器在一段時間內停止服務,不可能一步完成整個rehash操作,所以redis是分多次、漸進式的rehash,漸進性哈希分為兩種:

  • 操作redis時,額外做一步rehash
    對redis做讀取、插入、洗掉等操作時,會把位于table[dict->rehashidx]位置的鏈表移動到新的dictht中,然后把rehashidx做加一操作,移動到后面一個槽位,
  • 后臺定時任務呼叫rehash
    后臺定時任務rehash呼叫鏈,同時可以通過server.hz控制rehash呼叫頻率

6、Redis和memcached的區別

1)資料型別 :redis資料型別豐富,支持set liset等型別;memcache支持簡單資料型別,需要客戶端自己處理復雜物件
2)持久性:redis支持資料落地持久化存盤;memcache不支持資料持久存盤,)
3)分布式存盤:redis支持master-slave復制模式;memcache可以使用一致性hash做分布式,
4)value大小不同:memcache是一個記憶體快取,key的長度小于250字符,單個item存盤要小于1M,不適合虛擬機使用
5)資料一致性不同:redis使用的是單執行緒模型,保證了資料按順序提交;memcache需要使用cas保證資料一致性,CAS(Check and Set)是一個確保并發一致性的機制,屬于“樂觀鎖”范疇;原理很簡單:拿版本號,操作,對比版本號,如果一致就操作,不一致就放棄任何操作
6)cpu利用:redis單執行緒模型只能使用一個cpu,可以開啟多個redis行程

7、請你說說redis

?? redis是一個key-value存盤系統,和Memcached類似,它支持存盤的value型別相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希型別),這些資料型別都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的,在此基礎上,redis支持各種不同方式的排序,與memcached一樣,為了保證效率,資料都是快取在記憶體中,區別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步,

8、請問對快取技術了解嗎

?? Redis可以實作快取機制, Redis是一個key-value存盤系統,和Memcached類似,它支持存盤的value型別相對更多,包括string(字串)、 list(鏈表)、set(集合)和zset(有序集合),這些資料型別都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的,在此基礎上,redis支持各種不同方式的排序,與memcached一樣,為了保證效率,資料都是快取在記憶體中,區別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步,當前 Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像 Flickr、Github等均在使用Redis的快取服務,
?? Redis作為一個高性能的key-value資料庫具有以下特征:
1、多樣的資料模型
2、持久化
3、主從同步

??Redis支持豐富的資料型別,最為常用的資料型別主要由五種:String、Hash、List、Set和Sorted Set,Redis通常將資料存盤于記憶體中,或被配置為使用虛擬記憶體,Redis有一個很重要的特點就是它可以實作持久化資料,通過兩種方式可以實作資料持久化:使用RDB快照的方式,將記憶體中的資料不斷寫入磁盤;或使用類似MySQL的AOF日志方式,記錄每次更新的日志,前者性能較高,但是可能會引起一定程度的資料丟失;后者相反, Redis支持將資料同步到多臺從資料庫上,這種特性對提高讀取性能非常有益,

四、資料庫設計程序

??在昨天面試的時候,面試官問到一個很宏觀的問題:你說一下資料庫設計的程序,這是一個很大的問題,瞬間我都不知道怎么回答了,在面試之后,我在網上找了一些資料,總結如下,或許大家也會遇到這樣的問題,希望對大家有所幫助,
??眾所周知,對于一個系統,資料庫的設計是非常重要的,資料庫設計決定了以后資料好不好維護,后期需求好不好展,同時也決定了系統的性能,一個壞的資料庫設計一個功能點的改動可能會設計多張表的改動,一不小心可能就會引起資料的不一致,為了解決這些問題,在資料庫設計之初就要考慮這些問題,減少后期系統維護量,說了這么多資料庫設計的重要性那么資料庫設計應該考慮哪些問題呢?
1、范式與反范式的設計
??范式設計的目的是為了減少資料冗余從而節約存盤空間提高查詢效率,同時也使得資料一致性容易得到維護,反范式的設計主要考錄歷史資料要反應歷史問題,需要將資料冗余到表中,這里需要我們注意的是:我們設計資料庫時一定要考慮范式和反范式設計, 具體采用什么方式就要分析我們的業務是屬于哪種情況視具體情況而定采用哪種方式,這種情況更多用到涉及到財務方面,涉及到以后財務對賬,所以資料冗余相當重要,
2、擴展性設計
??專案初期業務場景資料模型是一對一,并且分析后期有可能會變成一對多,這種情況不要為了前期方便設計成一對一資料模型,這樣做到后期可能得不嘗失,這就是資料拓展性設計需要考慮,
3、資料庫約束
??資料約束最好是在資料設計之初就定義好,包括非空約束資料唯一性約束,這樣可以解決很多系統空例外,并且使得資料更好維護,如果不這個做,當系統運行一時間后,
4、資料庫訪問權限界定
??資料庫訪問權限一定要控制在自己的系統范圍內,嚴禁其他系統直接操作資料庫,系統需要與其他系統進行資訊交換,或者資料變更,應該采用本系統開發介面給外部系統進行呼叫并且對介面呼叫進行日志記錄,而不是直接開放資料庫給對方,這么做主要是方便核查例外資料寫入場景分析問題源,快速定位問題源,同時通過分析介面呼叫日志分析外部系統問題,
5、表欄位最好考慮添加創建時間和修改時間
??這個設計主要是考慮到平時資料維護和資料分析用,不一定時業務上使用,如果某段時間業務出問題,可以通過資料的創建時間和修改時間來找到這部分例外資料,是人就會犯錯,我們盡量做到犯錯可挽回,當我們臨時需要手動處理一些資料,一不小心把資料有弄錯了,通過這兩個欄位還可以找到并重新處理這兩個資料同時做資料復原,代碼洗掉了可以重新寫一份,資料庫洗掉了就什么都完了,所以資料是系統的靈魂,維護資料的正確完整至關重要,而做好上面這些事項,可以使得在日常的作業中更加輕松,

總結

??本文簡單的對資料庫高頻率出現的問題進行了簡單的總結,一方面是為了方便自己以后面試的復習,另外也是給大家再次面試相關崗位的時候提供復習方向以及思路解答,這里就需要我們對資料結構以及資料庫有一個較為深層次的理解,于是,我們在準備的時候,首先就應該夯實基礎,只有這樣才能在眾多的面試者中脫穎而出,最后希望大家不斷進步,都能盡早拿到自己比較滿意的offer!!!!繼續加油,未來可期!!!!
最后需要補充的是,為了讓我所學的知識讓更多小伙伴看到,因此,我的博客即將搬運同步至騰訊云+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1512.html

標籤:其他

上一篇:SQL陳述句練習

下一篇:簡簡單單的分享2020常見的MySQL面試題MySQL與答案整理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more