Python面试题大全(四):数据库篇
目錄
數據庫
MySQL
198.主鍵 超鍵 候選鍵 外鍵
199.視圖的作用,視圖可以更改么?
200.drop,delete與truncate的區別
201.索引的工作原理及其種類
202.連接的種類
203.數據庫優化的思路
204.存儲過程與觸發器的區別
205.悲觀鎖和樂觀鎖是什么?
206.你常用的mysql引擎有哪些?各引擎間有什么區別?
Redis
207.Redis宕機怎么解決?
208.redis和mecached的區別,以及使用場景
209.Redis集群方案該怎么做?都有哪些方案?
210.Redis回收進程是如何工作的
MongoDB
211.MongoDB中對多條記錄做更新操作命令是什么?
212.MongoDB如何才會拓展到多個shard里?
數據庫
MySQL
198.主鍵 超鍵 候選鍵 外鍵
主鍵:數據庫表中對存儲數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null).
超鍵:在關系中能唯一標識元組的屬性集稱為關系模式的超鍵。一個屬性可以作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。
候選鍵:是最小超鍵,即沒有冗余元素的超鍵。
外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。
199.視圖的作用,視圖可以更改么?
視圖是虛擬的表,與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢;不包含任何列或數據。使用視圖可以簡化復雜的sql操作,隱藏具體的細節,保護數據;視圖創建后,可以使用與表相同的方式利用它們。
視圖不能被索引,也不能有關聯的觸發器或默認值,如果視圖本身內有order by則對視圖再次order by將被覆蓋。
創建視圖: create view xxx as xxxxxx
對于某些視圖比如未使用聯結子查詢分組聚集函數Distinct Union等,是可以對其更新的,對視圖的更新將對基表進行更新;但是視圖主要用于簡化檢索,保護數據,并不用于更新,而且大部分視圖都不可以更新。
200.drop,delete與truncate的區別
drop直接刪掉表,truncate刪除表中數據,再插入時自增長id又從1開始,delete刪除表中數據,可以加where字句。
1.delete 語句執行刪除的過程是每次從表中刪除一行,并且同時將該行的刪除操作作為事務記錄在日志中保存以便進行回滾操作。truncate table則一次性地從表中刪除所有的數據并不把單獨的刪除操作記錄記入日志保存,刪除行是不能恢復的。并且在刪除的過程中不會激活與表有關的刪除觸發器,執行速度快。
2.表和索引所占空間。當表被truncate后,這個表和索引所占用的空間會恢復到初始大小,而delete操作不會減少表或索引所占用的空間。drop語句將表所占用的空間全釋放掉。
3.一般而言,drop>truncate>delete
4.應用范圍。truncate只能對table,delete可以是table和view
5.truncate和delete只刪除數據,而drop則刪除整個表(結構和數據)
6.truncate與不帶where的delete:只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴于該表的存儲過程/函數將被保留,但其狀態會變為:invalid.
201.索引的工作原理及其種類
數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢,更新數據庫表中數據。索引的實現通常使用B樹以其變種B+樹。
在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。
為表設置索引要付出代價的:一是增加了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(因為索引也要隨之變動)
202.連接的種類
203.數據庫優化的思路
204.存儲過程與觸發器的區別
205.悲觀鎖和樂觀鎖是什么?
206.你常用的mysql引擎有哪些?各引擎間有什么區別?
Redis
207.Redis宕機怎么解決?
宕機:服務器停止服務‘
如果只有一臺redis,肯定 會造成數據丟失,無法挽救
多臺redis或者是redis集群,宕機則需要分為在主從模式下區分來看:
slave從redis宕機,配置主從復制的時候才配置從的redis,從的會從主的redis中讀取主的redis的操作日志1,在redis中從庫重新啟動后會自動加入到主從架構中,自動完成同步數據;
2, 如果從數據庫實現了持久化,此時千萬不要立馬重啟服務,否則可能會造成數據丟失,正確的操作如下:在slave數據上執行SLAVEOF ON ONE,來斷開主從關系并把slave升級為主庫,此時重新啟動主數據庫,執行SLAVEOF,把它設置為從庫,連接到主的redis上面做主從復制,自動備份數據。
以上過程很容易配置錯誤,可以使用redis提供的哨兵機制來簡化上面的操作。簡單的方法:redis的哨兵(sentinel)的功能
208.redis和mecached的區別,以及使用場景
區別
1、redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可以用于緩存其他東西,例如圖片,視頻等等
2、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲
3、虛擬內存-redis當物流內存用完時,可以將一些很久沒用的value交換到磁盤
4、過期策略-memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire設定,例如expire name 10
5、分布式-設定memcache集群,利用magent做一主多從,redis可以做一主多從。都可以一主一叢
6、存儲數據安全-memcache掛掉后,數據沒了,redis可以定期保存到磁盤(持久化)
7、災難恢復-memcache掛掉后,數據不可恢復,redis數據丟失后可以通過aof恢復
8、Redis支持數據的備份,即master-slave模式的數據備份
9、應用場景不一樣,redis除了作為NoSQL數據庫使用外,還能用做消息隊列,數據堆棧和數據緩存等;Memcache適合于緩存SQL語句,數據集,用戶臨時性數據,延遲查詢數據和session等
使用場景
1,如果有持久方面的需求或對數據類型和處理有要求的應該選擇redis
2,如果簡單的key/value存儲應該選擇memcached.
209.Redis集群方案該怎么做?都有哪些方案?
1,codis
目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在節點數量改變情況下,舊節點數據客恢復到新hash節點
2redis cluster3.0自帶的集群,特點在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節點設置從節點。具體看官方介紹
3.在業務代碼層實現,起幾個毫無關聯的redis實例,在代碼層,對key進行hash計算,然后去對應的redis實例操作數據。這種方式對hash層代碼要求比較高,考慮部分包括,節點失效后的替代算法方案,數據震蕩后的字典腳本恢復,實例的監控,等等
210.Redis回收進程是如何工作的
一個客戶端運行了新的命令,添加了新的數據。
redis檢查內存使用情況,如果大于maxmemory的限制,則根據設定好的策略進行回收。
一個新的命令被執行等等,所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然后不斷回收回到邊界以下。
如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。
MongoDB
211.MongoDB中對多條記錄做更新操作命令是什么?
212.MongoDB如何才會拓展到多個shard里?
總結
以上是生活随笔為你收集整理的Python面试题大全(四):数据库篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts2基础知识(二)
- 下一篇: websocket python爬虫_p