面試官常問的 數據庫 問題(二)

11.Oracle 跟 SQL Server 的區別?

oracle:可在不同平臺運行(ISO標準認證);支持PL-SQL腳本語言;性能很高;
sqlserver:只可在 windows 平臺運行(不安全、不穩定);支持T-SQL腳本語言;多用戶性能低;

一般不用SQL Server !!!

區別:

1、最大的區別在於平臺。oracle 可以運行在不同的平臺上;sqlserver 只能運行在 windows 平臺上。windows 平臺的穩定性和安全性,影響了 sqlserver 的穩定性和安全性。

2、oracle 使用的腳本語言爲 PL-SQL,而 sqlserver 使用的腳本爲 T-SQL 。
文體結構不同

3、體系結構不同。
oracle的文件體系結構爲:

數據文件 .dbf(真實數據)
日誌文件 .rdo
控制文件 .ctl
參數文件 .ora

sql server的文件體系結構爲:

.mdf (數據字典)
.ndf (數據文件)
.ldf (日誌文件)

4、存儲結構不同。

oracle存儲結構:

在oracle裏有兩個塊參數pctfree(填充因子)和pctused(複用因子),可控制塊確定塊本身何時有,何時沒有足夠的空間接受新信息(對塊的存儲情況的分析機制)。這樣可降低數據行連接與行遷移的可能性。塊的大小可設置(oltp塊和dss塊)。

在oracle中,將連續的塊組成區,可動態分配區(區的分配可以是等額的也可以是自增長的)可減少空間分配次數。

在oraclel裏表可以分爲多個段,段由多個區組成,每個段可指定分配在哪個表空間裏(段的類型分爲:數據段、索引段、回滾段、臨時段、cash段。oracle裏還可對錶進行分區,可按照用戶定義的業務規則、條件或規範,物理的分開磁盤上的數據。

這樣大大降低了磁盤爭用的可能性。

oracle有七個基本表空間:

·system表空間(存放數據字典和數據管理自身所需的信息)
·rbs回滾表空間
·temp臨時表空間
·tools交互式表空間
·users用戶默認表空間
·indx索引表空間
·dbsys福數據表空間

不同的數據分別放在不同的表空間(數據字典與真實數據分開存放),在oracle裏基表(存儲系統參數信息)是加密存儲,任何人都無法訪問。只能通過用戶可視視圖查看。

sql server 存儲結構:

以頁爲最小分配單位,每個頁爲8k(不可控制,缺乏對頁的存儲情況的分析機制),可將8個連續的頁的組成一個‘擴展’,以進一步減少分配時所耗用的資源。(分配缺乏靈活性),在sql server裏數據以表的方式存放,而表是存放在數據庫裏。

sql server有五個基本數據庫: www.2cto.com

·master(數據字典)
·mode(存放樣版)
·tempdb(臨時數據庫)
·msdb(存放調度信息和日誌信息)
·pubs(示例數據庫)

真實數據與數據字典存放在一起。對系統參數信息無安全機制。

12.關係型數據庫和非關係型數據庫區別,優勢比較?

關係型數據庫:可用 SQL 語句在一個以上表之間做非常複雜的數據查詢;安全性高;數據存儲在硬盤;
非關係型數據庫:性能高;可擴展(水平擴展);數據存儲在緩存,比關係型數據庫查詢快;

非關係型數據庫的優勢:
性能:NOSQL 是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過 SQL 層的解析,所以性能非常高。
可擴展性:同樣也是因爲基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

關係型數據庫的優勢:
複雜查詢:可以用 SQL 語句在一個表以及多個表之間做非常複雜的數據查詢。
事務支持:使得對於安全性能很高的數據訪問要求得以實現。

13.MYSQL 的兩種存儲引擎區別(事務、鎖級別等等),各自的適用場景

MySql主要有兩種存儲引擎:InnoDB和MyISAM。
InnoDB:支持事務、外鍵;支持行級鎖;聚集索引;不保存行數;不支持全文類型索引(查表總行數時,不需要全表掃描);
MyISAM:不支持事務、外鍵;支持表級鎖(性能低);非聚集索引;保存行數;支持全文類型索引(查表總行數時,全表掃描);
使用場景:一般默認InnoDB,當表比較小,讀取操作較多,插入和更新少,不要考慮事務,可以考慮MyIsam。

區別

  1. InnoDB支持事務,後者不支持

  2. InnoDB支持外鍵,MyIsam不支持

  3. InnoDB支持行級鎖,MyIsam是表級鎖,表級鎖性能低

  4. InnoDB是聚集索引,即索引中鍵值的邏輯順序決定了表中相應行的物理順序,而MyIsam是非聚集索引,即索引中索引的邏輯順序與磁盤上行的物理存儲順序不同。

  5. InnoDB不保存行數,後者保存。

使用場景,一般默認都是InnoDB,如果表比較小,讀取操作較多,插入和更新操作少,不需要考慮事務,可以考慮MyIsam

14.MongoDB 與 Redis 區別

①.性能方面:redis 要大於 mongodb ;
②.操作便利性:Mongodb 支持豐富的數據表達、索引,最類似關係型數據庫,支持的查詢語言非常豐富 ;Redis 數據結構方面豐富
③.內存空間大小和數據量大小:Mongodb 適合大量數據的存儲 ;
④.數據一致性:Redis 事務支持比較弱 ;Mongodb 不支持事務 ;
⑤.應用場景:Redis 用在數據量較小的操作和運算上;Mongodb 主要解決海量數據的訪問效率問題。

redis、memcache、mongoDB 對比
從以下幾個維度,對redis、memcache、mongoDB 做了對比,歡迎拍磚

1、性能
都比較高,性能對我們來說應該都不是瓶頸
總體來講,TPS方面redis和memcache差不多,要大於mongodb

2、操作的便利性
memcache數據結構單一
redis豐富一些,數據操作方面,redis更好一些,較少的網絡IO次數
mongodb支持豐富的數據表達,索引,最類似關係型數據庫,支持的查詢語言非常豐富

3、內存空間的大小和數據量的大小
redis在2.0版本後增加了自己的VM特性,突破物理內存的限制;可以對key value設置過期時間(類似memcache)
memcache可以修改最大可用內存,採用LRU算法
mongoDB適合大數據量的存儲,依賴操作系統VM做內存管理,喫內存也比較厲害,服務不要和別的服務在一起

4、可用性(單點問題)

對於單點問題,
redis,依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點重新連接主節點都要依賴整個快照,無增量複製,因性能和效率問題,
所以單點問題比較複雜;不支持自動sharding,需要依賴程序設定一致hash 機制。
一種替代方案是,不用redis本身的複製機制,採用自己做主動複製(多份存儲),或者改成增量複製的方式(需要自己實現),一致性問題和性能的權衡

Memcache本身沒有數據冗餘機制,也沒必要;對於故障預防,採用依賴成熟的hash或者環狀的算法,解決單點故障引起的抖動問題。

mongoDB支持master-slave,replicaset(內部採用paxos選舉算法,自動故障恢復),auto sharding機制,對客戶端屏蔽了故障轉移和切分機制。

5、可靠性(持久化)

對於數據持久化和數據恢復,

redis支持(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對性能有所影響

memcache不支持,通常用在做緩存,提升性能;

MongoDB從1.8版本開始採用binlog方式支持持久化的可靠性

6、數據一致性(事務支持)

Memcache 在併發場景下,用cas保證一致性

redis事務支持比較弱,只能保證事務中的每個操作連續執行

mongoDB不支持事務

7、數據分析

mongoDB內置了數據分析的功能(mapreduce),其他不支持

8、應用場景
redis:數據量較小的更性能操作和運算上

memcache:用於在動態系統中減少數據庫負載,提升性能;做緩存,提高性能(適合讀多寫少,對於數據量比較大,可以採用sharding)

MongoDB:主要解決海量數據的訪問效率問題

15.Memcached 和 redis 的區別

①.存儲方式:Memcached 數據都在內存中,斷電後會掛掉,數據不可超過內存大小;Redis 部分存在硬盤上,保證數據的持久性 ;
②.數據支持類型:Memcached 對數據類型支持相對簡單 ;Redis 有複雜的數據類型 ;
③.Value 大小:Redis 最大可以達到 1G;Memcached 只有 1MB。

16.在項目中緩存用在哪裏

緩存數據(查詢多刪改少的數據)比如:數據字典(改動少,基本不改動)

爲什麼使用緩存?:
緩存主要用途有兩個,高性能和高併發。
高併發的場景不常見,所以項目用它的目的是高性能。
如果一個數據被大量的讀取,那麼可以將它放入緩存中,被讀取時直接從緩存中通過key查出value,這樣可以大幅提升性能。

使用緩存存在哪些問題?
①緩存雪崩。
②緩存穿透。
③緩存與數據量雙寫不一致。
④緩存併發競爭。

17.Redis 如何持久化

持久化:將內存中的數據寫入到硬盤中。
Redis實現數據持久化的兩種實現方式:1、RDB實現Redis數據持久化(默認方式);2、AOF持久化方案;
RDB:指定的時間間隔內保存數據快照;
AOF:先把命令追加到操作日誌的尾部,保存所有的歷史操作;

RDB:將數據寫入到一個臨時文件(dump.rdb),持久化結束之後,用這個臨時文件替換上次持久化的文件,達到數據恢復。
間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生數據丟失,所以這種方式更適合數據要求不嚴謹的時候,

默認開啓的 AOF:是將執行過的指令記錄下來,數據恢復時按照從前到後的順序再將指令執行一遍,實現數據恢復。

AOF 相比於RDB的優點:可以保證數據完整,可對歷史操作進行處理;

但是 AOF 文件比 RDB 文件大,且恢復速度慢,默認是關閉的。

18.Redis 的內存淘汰策略有那些

①.noeviction:默認策略,不刪除任意數據,但是內存不夠時,會直接返回錯誤
②.Allkeys-lru:從數據集中(包括設置過期時間和未設置過期時間的數據集),優先移除最近未使用的 key
③.Volatile-lru:在設置了過期時間的數據集中,優先移除最近未使用的 key
④.Allkeys-random:從數據集中(包括設置過期時間和未設置過期時間的數據集),隨機移除某個 key
⑤.Volatile-random:在設置了過期時間的數據集中,隨機移除某個 key Volatile-ttl:在設置了過期時間的數據集中,具有更早過期時間的 key 優先移除。

Redis 的內存淘汰:用戶存儲的一些鍵可以被 redis 主動從實例中刪除,從而產生讀 miss 的情況,
內存淘汰是爲了更好的使用內存,用一定的緩存 miss 來換取內存的使用率。

Redis 提供的內存淘汰策略有:
①.noeviction:默認策略,不刪除任意數據,但是內存不夠時,會直接返回錯誤
②.Allkeys-lru:從數據集中(包括設置過期時間和未設置過期時間的數據集),優先移除最近未使用的 key
③.Volatile-lru:在設置了過期時間的數據集中,優先移除最近未使用的 key
④.Allkeys-random:從數據集中(包括設置過期時間和未設置過期時間的數據集),隨機移除某個 key
⑤.Volatile-random:在設置了過期時間的數據集中,隨機移除某個 key Volatile-ttl:在設置了過期時間的數據集中,具有更早過期時間的 key 優先移除。

redis 的雪崩、穿透

  1. 緩存穿透

    什麼是緩存穿透?
    一般的緩存系統,都是按照key(鍵)去緩存查詢,如果不存在對應的value(值),就應該去DB(數據庫)中查找 。
    這個時候,如果請求的併發量很大,就會對後端的DB系統造成很大的壓力。這就叫做緩存穿透!

    在這裏插入圖片描述
    造成的原因:

    1. 業務自身代碼或數據出現問題;
    2. 一些惡意攻擊、爬蟲造成大量空的命中,此時會對數據庫造成很大壓力。

    解決方法:

    1. 設置布隆過濾器,將所有可能存在的數據哈希到一個足夠大的bitmap中,一個一定不存在的數據會被這個bitmap攔截掉,
      從避免了對底層存儲系統的查詢壓力。
    2. 如果一個查詢返回的數據爲空,不管是數據不存在還是系統故障,我們仍然把這個結果進行緩存,但是它的過期時間會很短
      最長不超過5分鐘。
  2. 服務雪崩

    什麼是雪崩?

    因爲緩存層承載了大量的請求,有效的保護了存儲層。但是如果緩存由於某些原因,整體不能夠提供服務,於是所有的請求,就會到達存儲層,存儲層的調用量就會暴增,造成存儲層也會掛掉的情況。
    緩存雪崩的英文解釋是奔逃的野牛,指的是緩存層當掉之後,併發流量會像奔騰的野牛一樣,大量後端存儲。

    造成的原因:
    當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,大量數據會去直接訪問DB,此時給DB很大的壓力。
    在這裏插入圖片描述
    解決方法:

    1. 設置redis集羣和DB集羣的高可用,如果redis出現宕機情況,可以立即由別的機器頂替上來。這樣可以防止一部分的風險。

    2. 使用互斥鎖

      在緩存失效後,通過加鎖或者隊列來控制讀和寫數據庫的線程數量。比如:對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。單機的話,可以使用synchronized或者lock來解決,如果是分佈式環境,可以是用redis的setnx命令來解決。

    3. 不同的key,可以設置不同的過期時間,讓緩存失效的時間點不一致,儘量達到平均分佈。

    4. 永遠不過期

      redis中設置永久不過期,這樣就保證了,不會出現熱點問題,也就是物理上不過期。

    5. 資源保護

      使用netflix的hystrix,可以做各種資源的線程池隔離,從而保護主線程池。

19.redis 有哪些數據類型

String(字符串)、Hash(哈希)、List(列表)、Sets(集合)、ZSet(有序集合)

①.String(字符串):redis 最基本的數據類型,一個 key 對應一個 value,一個鍵最大能存儲 512MB
②.Hash(哈希):是一個鍵值對集合,特別適合用於存儲對象
③.List(列表):存放多個字符串值,可以重複,按照插入順序進行排序,也可以添加一個元素到列表的頭部和尾部
④.Sets(集合):存放多個值,不可以重複,沒有順序
⑤.ZSet(有序集合):存放多個值,不可以重複,有順序。不同的是每個元素都會關聯一個 double 類型的分數,redis 正是通過分 數來爲集合中的成員進行從小到大的排序

在這裏插入圖片描述

20.Redis 一般用在那些場景

①.緩存熱數據(熱數據:查詢多刪改少的數據 )
②.計數器,諸如統計點擊數等應用
③.隊列
④.位操作(大數據處理),比如統計 QQ 用戶在線
⑤.分佈式鎖和單線程機制
⑥.最新列表
⑦.排行榜,使用 zadd 添加有序集合

redis使用場景:會話緩存(Session Cache)、全頁緩存(FPC)、排行榜/計數器

redis優點:

  1. 速度快,因爲數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)
  2. 支持豐富數據類型,支持string,list,set,sorted set,hash
  3. 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
  4. 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

21.SQL 題目

  1. 在GRADE表中查找80-90份的學生學號和分數

     select 學號,分數 from grade where 分數 between 80 and 90
    
  2. 在GRADE 表中查找課程編號爲003學生的平均分

     select avg(分數) from grade where 課程編號='003'
    
  3. 在GRADE 表中查詢學習各門課程的人數

     select 課程編號,count(學號) as 人數 from grade group by 課程編號
    
  4. 查詢所有姓張的學生的學號和姓名

     select 姓名,學號 from student_info where 姓名 like'張%'
    
  5. 查詢和學號’0001’的這位同學性別相同的所有同學的姓名和出生年月

     select 姓名,出生年月 from student_info where 性別 in(select 性別 from student_info where sno='0001')
    
  6. 查詢所有選修課程編號爲0002 和0003的學生的學號、姓名和性別

     select 學號,姓名,性別 from student_infowhere 學號 in(select 學號 from grade where 課程編號='0002' and 學號 in(select 學號 from grade where 課程編號='0001'))
    
  7. 查詢出學號爲0001的學生的分數比0002號學生最低分高的課程編號的課程編號和分數

     select 課程編號, 分數 from grade where 學號='0001'and 分數>(select min(分數) from grade where 學號='0002')
    
  8. 查詢分數在80-90分的學生的學號、姓名、分數

     select student_info.學號,student_info.姓名,grade.分數 from student_info,grade where grade.分數 between 80 and 90
    
  9. 查詢學習了’C語言’課程的學生學號、姓名和分數

     select student_info.學號,student_info.姓名,grade.成績 from student_info,grade,curriculum where student_info.學號=grade.學號  and grade.課程號=curriculum.課程號 and curriculum.課程名='C 語言'
    
  10. 查詢所有學生的總成績,要求列出學號、姓名、總成績,沒有選課的學生總成績爲空。

    select grade.學號,student_info.姓名,sum(grade.成績) as 總成績 from student_info,grade where grade.學號=student_info.學號 group by grade.學號,student_info.姓名
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章