2021最新數(shù)據(jù)庫面試30題!(MySQL看靠、Redis赶促、MongoDB)春招offer不在話下!

1. 請簡潔描述 MySQL 中 InnoDB 支持的四種事務(wù)隔離級別名稱挟炬,以及逐級之間的區(qū)別鸥滨?

SQL 標(biāo)準(zhǔn)定義的四個隔離級別為:
read uncommited :讀到未提交數(shù)據(jù)
read committed:臟讀嗦哆,不可重復(fù)讀
repeatable read:可重讀
serializable :串行事物

2. 在 MySQL 中 ENUM 的用法是什么?

ENUM 是一個字符串對象婿滓,用于指定一組預(yù)定義的值老速,并可在創(chuàng)建表時使用。
SQL 語法如下:
Create table size(name ENUM('Smail,'Medium','Large');

3. CHAR 和 VARCHAR 的區(qū)別凸主?

CHAR 和 VARCHAR 類型在存儲和檢索方面有所不同橘券。
CHAR 列長度固定為創(chuàng)建表時聲明的長度,長度值范圍是 1 到 255卿吐。 當(dāng) CHAR 值被存儲時旁舰,它們被用空格填充到特定長度,檢索 CHAR 值時需刪除尾隨
空格嗡官。

4. 列的字符串類型可以是什么鬓梅?

字符串類型是:
SET
BLOB
ENUM
CHAR
TEXT
VARCHAR

5. MySQL 中使用什么存儲引擎?

存儲引擎稱為表類型谨湘,數(shù)據(jù)使用各種技術(shù)存儲在文件中绽快。
技術(shù)涉及:
Storage mechanism
Locking levels
Indexing
Capabilities and functions.

6. TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 數(shù)據(jù)類型上做什么?

創(chuàng)建表時 TIMESTAMP 列用 Zero 更新紧阔。只要表中的其他字段發(fā)生更改坊罢,UPDATE
CURRENT_TIMESTAMP 修飾符就將時間戳字段更新為當(dāng)前時間。

7. 主鍵和候選鍵有什么區(qū)別擅耽?

表格的每一行都由主鍵唯一標(biāo)識, 一個表只有一個主鍵活孩。
主鍵也是候選鍵。按照慣例乖仇,候選鍵可以被指定為主鍵憾儒,并且可以用于任何外鍵引
用。

8. MySQL 數(shù)據(jù)庫服務(wù)器性能分析的方法命令有哪些?

Show status 一些值得監(jiān)控的變量值: Bytesreceived 和 Bytessent 和服務(wù)器之間
來往的流量乃沙。 Com 服務(wù)器正在執(zhí)行的命令起趾。 Created 在查詢執(zhí)行期限間創(chuàng)建的臨時
表和文件。 Handler 存儲引擎操作警儒。 Select 不同類型的聯(lián)接執(zhí)行計劃训裆。 Sort_* 幾
種排序信息。 Show session status like ‘Select’; Show profiles SET
profiling=1; Show profiles\G Show profile;

9. LIKE 和 REGEXP 操作有什么區(qū)別蜀铲?

LIKE 和 REGEXP 運(yùn)算符用于表示 ^ 和%边琉。
SELECT * FROM <tablename> WHERE * REGEXP "^b";
SELECT * FROM <tablename> WHERE * LIKE "%b";

10. BLOB 和 TEXT 有什么區(qū)別?

BLOB

BLOB 是一個二進(jìn)制對象记劝,可以容納可變數(shù)量的數(shù)據(jù)变姨。有四種類型的 BLOB

  • TINYBLOB
  • BLOB
  • MEDIUMBLOB 和
  • LONGBLOB

它們只能在所能容納價值的最大長度上有所不同。

TEXT

TEXT 是一個不區(qū)分大小寫的 BLOB厌丑。四種 TEXT 類型

  • TINYTEXT
  • TEXT
  • MEDIUMTEXT 和
  • LONGTEXT

它們對應(yīng)于四種 BLOB 類型定欧,并具有相同的最大長度和存儲要求别伏。
BLOB 和 TEXT 類型之間的唯一區(qū)別在于對 BLOB 值進(jìn)行排序和比較時區(qū)分大小
寫,對 TEXT 值不區(qū)分大小寫忧额。

11. 數(shù)據(jù)庫的三范式厘肮?

第一范式:數(shù)據(jù)庫表的每一個字段都是不可分割的。
第二范式:數(shù)據(jù)庫表中的非主屬性只依賴于主鍵睦番。
第三范式:不存在非主屬性對關(guān)鍵字的傳遞函數(shù)依賴關(guān)系类茂。

12. MySQL 表中允許有多少個 TRIGGERS?

在 MySQL 表中允許有六個觸發(fā)器托嚣,如下:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE and
AFTER DELETE

13. 什么是通用 SQL 函數(shù)巩检?

數(shù)學(xué)函數(shù)

  • Abs(num)求絕對值
  • floor(num)向下取整
  • ceil(num)向上取整

字符串函數(shù)

  • insert (s1,index,length,s2) 替換函數(shù)
    o S1 表示被替換的字符串
    o s2 表示將要替換的字符串
    o Index 表示被替換的位置, 從 1 開始
    o Lebgth 表示被替換的長度
  • upper(str),ucase(str)將字母改為大寫
  • lower(str)示启,lcase(str)將字母改為小寫
  • left(str兢哭,length)返回 str 字符串的前 length 個字符
  • right(str,length)返回 str 字符串的后 length 個字符
  • substring(str夫嗓,index迟螺,length)返回 str 字符串從 index 位開始長度為
    length 個字符(index 從 1 開始)
  • reverse(str)將 str 字符串倒序輸出

日期函數(shù)

  • curdate()、current_date( ) 獲取當(dāng)前日期
  • curtime()舍咖、current_time( ) 獲取當(dāng)前日期
  • now()獲取當(dāng)前日期和時間
  • datediff(d1矩父、d2)d1 和 d2 之間的天數(shù)差
  • adddate(date,num)返回 date 日期開始排霉,之后 num 天的日期
  • subdate(date窍株,num)返回 date 日期開始,之前 num 天的日期

聚合函數(shù)

  • Count(字段)根據(jù)某個字段統(tǒng)計總記錄數(shù)(當(dāng)前數(shù)據(jù)庫保存到多少條數(shù)據(jù))
  • sum(字段)計算某個字段的數(shù)值總和
  • avg(字段)計算某個字段的數(shù)值的平均值
  • Max(字段)攻柠、min(字段)求某個字段最大或最小值

14. MySQL 中有哪幾種鎖球订?

MyISAM 支持表鎖,InnoDB 支持表鎖和行鎖瑰钮,默認(rèn)為行鎖冒滩。
表級鎖:開銷小,加鎖快飞涂,不會出現(xiàn)死鎖旦部。鎖定粒度大,發(fā)生鎖沖突的概率最高较店,并
發(fā)量最低。
行級鎖:開銷大容燕,加鎖慢梁呈,會出現(xiàn)死鎖。鎖力度小蘸秘,發(fā)生鎖沖突的概率小官卡,并發(fā)度最
高蝗茁。

15. MySQL 數(shù)據(jù)優(yōu)化。

  • 優(yōu)化數(shù)據(jù)類型
    o 避免使用 NULL寻咒,NULL 需要特殊處理, 大多數(shù)時候應(yīng)該使用 NOT
    NULL哮翘,或者使用一個特殊的值,如 0毛秘,-1 作為默認(rèn)值饭寺。
    o 僅可能使用更小的字段,MySQL 從磁盤讀取數(shù)據(jù)后是存儲到內(nèi)存中
    的叫挟,然后使用 cpu 周期和磁盤 I/O 讀取它艰匙,這意味著越小的數(shù)據(jù)類
    型占用的空間越小. ? 小心字符集轉(zhuǎn)換
    o 客戶端或應(yīng)用程序使用的字符集可能和表本身的字符集不一樣,這需要MySQL
    在運(yùn)行過程中隱含地進(jìn)行轉(zhuǎn)換抹恳,此外员凝,要確定字符集如 UTF-8 是否支持多字節(jié)字符,因此它們需要更多的存儲空間奋献。
  • _優(yōu)化 count(mycol) 和 count()*
  • 優(yōu)化子查詢
    o 遇到子查詢時健霹,MySQL 查詢優(yōu)化引擎并不是總是最有效的,這就是為
    什么經(jīng)常將子查詢轉(zhuǎn)換為連接查詢的原因了瓶蚂,優(yōu)化器已經(jīng)能夠正確處理
    連接查詢了骤公,當(dāng)然要注意的一點(diǎn)是,確保連接表 (第二個表) 的連接列
    是有索引的扬跋,在第一個表上 MySQL 通常會相對于第二個表的查詢子
    集進(jìn)行一次全表掃描阶捆,這是嵌套循環(huán)算法的一部分。
  • 優(yōu)化 UNION
    o 在跨多個不同的數(shù)據(jù)庫時使用 UNION 是一個有趣的優(yōu)化方法钦听,
    UNION 從兩個互不關(guān)聯(lián)的表中返回數(shù)據(jù)洒试,這就意味著不會出現(xiàn)重復(fù)的
    行,同時也必須對數(shù)據(jù)進(jìn)行排序朴上,我們知道排序是非常耗費(fèi)資源的垒棋,特
    別是對大表的排序。
    o UNION ALL 可以大大加快速度痪宰,如果你已經(jīng)知道你的數(shù)據(jù)不會包括重
    復(fù)行叼架,或者你不在乎是否會出現(xiàn)重復(fù)的行,在這兩種情況下使用
    UNION ALL 更適合衣撬。此外乖订,還可以在應(yīng)用程序邏輯中采用某些方法避
    免出現(xiàn)重復(fù)的行,這樣 UNION ALL 和 UNION 返回的結(jié)果都是一樣
    的具练,但 UNION ALL 不會進(jìn)行排序乍构。

16. MySQL 的關(guān)鍵字。

添加索引:
alter table tableName add 索引(索引字段)
主鍵:primary key
唯一:unique
全局:fulltext
普通:index
多列: index index_name
頁級: 引擎 BDB扛点。次鎖定相鄰的一組記錄哥遮。
表級: 引擎 MyISAM 岂丘, 理解為鎖住整個表,可以同時讀眠饮,寫不行奥帘。 行級: 引擎
INNODB , 單獨(dú)的一行記錄加鎖仪召,對指定的記錄進(jìn)行加鎖寨蹋,這樣其它進(jìn)程還是可以
對同一個表中的其它記錄進(jìn)行操作。 表級鎖速度快返咱,但沖突多钥庇,行級沖突少,但速度
慢咖摹。

17. 存儲引擎评姨。

存儲引擎說白了就是如何存儲數(shù)據(jù)、如何為存儲的數(shù)據(jù)建立索引和如何更新萤晴、查詢數(shù)
據(jù)等技術(shù)的實(shí)現(xiàn)方法吐句。

  • MyISAM:這種引擎是 mysql 最早提供的。這種引擎又可以分為靜態(tài)
    MyISAM店读、動態(tài) MyISAM 和壓縮 MyISAM 三種:
    o 靜態(tài) MyISAM:如果數(shù)據(jù)表中的各數(shù)據(jù)列的長度都是預(yù)先固定好的嗦枢,
    服務(wù)器將自動選擇這種表類型。因?yàn)閿?shù)據(jù)表中每一條記錄所占用的空間
    都是一樣的屯断,所以這種表存取和更新的效率非常高文虏。當(dāng)數(shù)據(jù)受損時,恢
    復(fù)工作也比較容易做殖演。
    o 動態(tài) MyISAM:如果數(shù)據(jù)表中出現(xiàn) varchar氧秘、text 或 BLOB 字段
    時,服務(wù)器將自動選擇這種表類型趴久。相對于靜態(tài) MyISAM丸相,這種表存
    儲空間比較小,但由于每條記錄的長度不一彼棍,所以多次修改數(shù)據(jù)后灭忠,數(shù)
    據(jù)表中的數(shù)據(jù)就可能離散的存儲在內(nèi)存中,進(jìn)而導(dǎo)致執(zhí)行效率下降座硕。同
    時弛作,內(nèi)存中也可能會出現(xiàn)很多碎片。因此坎吻,這種類型的表要經(jīng)常用
    optimize table 命令或優(yōu)化工具來進(jìn)行碎片整理缆蝉。
    o 壓縮 MyISAM:以上說到的兩種類型的表都可以用 myisamchk 工具
    壓縮。這種類型的表進(jìn)一步減小了占用的存儲瘦真,但是這種表壓縮之后不
    能再被修改刊头。另外,因?yàn)槭菈嚎s數(shù)據(jù)诸尽,所以這種表在讀取的時候要先時
    行解壓縮原杂。

但是,不管是何種 MyISAM 表您机,目前它都不支持事務(wù)穿肄,行級鎖和外鍵約束的功能。

  • MyISAM Merge 引擎:這種類型是 MyISAM 類型的一種變種际看。合并表是將
    幾個相同的 MyISAM 表合并為一個虛表咸产。常應(yīng)用于日志和數(shù)據(jù)倉庫。
  • InnoDB:InnoDB 表類型可以看作是對 MyISAM 的進(jìn)一步更新產(chǎn)品仲闽,它提
    供了事務(wù)脑溢、行級鎖機(jī)制和外鍵約束的功能。
  • memory(heap):這種類型的數(shù)據(jù)表只存在于內(nèi)存中赖欣。它使用散列索引屑彻,所以
    數(shù)據(jù)的存取速度非常快顶吮。因?yàn)槭谴嬖谟趦?nèi)存中社牲,所以這種類型常應(yīng)用于臨時表
    中。
  • archive:這種類型只支持 select 和 insert 語句悴了,而且不支持索引搏恤。
  • Desc[ribe] tablename:查看數(shù)據(jù)表的結(jié)構(gòu)。
  • show engines:命令可以顯示當(dāng)前數(shù)據(jù)庫支持的存儲引擎情況湃交。

18. 數(shù)據(jù)庫備份熟空。

必須要在未登錄狀態(tài)下

  • 導(dǎo)出整個數(shù)據(jù)庫
    mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 > 導(dǎo)出的文件名
  • 導(dǎo)出一個表
    mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 表名> 導(dǎo)出的文件名
  • 導(dǎo)出一個數(shù)據(jù)庫結(jié)構(gòu)
    mysqldump -u dbuser -p -d --add-drop-table
    dbname >d:/dbname_db.sql

-d 沒有數(shù)據(jù) --add-drop-table 在每個 create 語句之前增加一個 drop table

19. truncate delete drop 的區(qū)別。

drop(DDL 語句):是不可逆操作巡揍,會將表所占用空間全部釋放掉痛阻;
truncate(DDL 語句):只針對于刪除表的操作,在刪除過程中不會激活與表有關(guān)的刪
除觸發(fā)器并且不會把刪除記錄放在日志中腮敌;當(dāng)表被 truncate 后阱当,這個表和索引會恢
復(fù)到初始大小糜工;
delete(DML 語句):可以刪除表也可以刪除行弊添,但是刪除記錄會被計入日志保存,
而且表空間大小不會恢復(fù)到原來捌木;
執(zhí)行速度:drop>truncate>delete油坝。

20. Redis 是什么?兩句話做一下概括。

是一個完全開源免費(fèi)的 key-value 內(nèi)存數(shù)據(jù)庫 2. 通常被認(rèn)為是一個數(shù)據(jù)結(jié)構(gòu)服務(wù)
器澈圈,主要是因?yàn)槠溆兄S富的數(shù)據(jù)結(jié)構(gòu) strings彬檀、map、 list瞬女、sets窍帝、 sorted sets。

  • Redis 使用最佳方式是全部數(shù)據(jù) in-memory诽偷。
  • Redis 更多場景是作為 Memcached 的替代者來使用坤学。
  • 當(dāng)需要除 key/value 之外的更多數(shù)據(jù)類型支持時,使用 Redis 更合適报慕。
  • 當(dāng)存儲的數(shù)據(jù)不能被剔除時深浮,使用 Redis 更合適。

21. Redis(管道眠冈,哈希)飞苇。

  • Redis 不僅僅支持簡單的 k/v 類型的數(shù)據(jù),同時還提供 list洋闽,set玄柠,zset,
    hash 等數(shù)據(jù)結(jié)構(gòu)的存儲诫舅。
  • Redis 支持?jǐn)?shù)據(jù)的備份羽利,即 master-slave 模式的數(shù)據(jù)備份。
  • Redis 支持?jǐn)?shù)據(jù)的持久化刊懈,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中这弧,重啟的時候可
    以再次加載進(jìn)行使用。

22. Redis 實(shí)現(xiàn)原理或機(jī)制虚汛。

Redis 是一個 key-value 存儲系統(tǒng)匾浪。和 Memcached 類似,但是解決了斷電后數(shù)據(jù)
完全丟失的情況卷哩,而且她支持更多無化的 value 類型蛋辈,除了和 string 外,還支持
lists(鏈表)将谊、sets(集合)和 zsets(有序集合)幾種數(shù)據(jù)類型冷溶。這些數(shù)據(jù)類型都支
持 push/pop、add/remove 及取交集并集和差集及更豐富的操作尊浓,而且這些操作都
是原子性的逞频。

Redis 是一種基于客戶端 - 服務(wù)端模型以及請求 / 響應(yīng)協(xié)議的 TCP 服務(wù)。這意味
著通常情況下一個請求會遵循以下步驟:

客戶端向服務(wù)端發(fā)送一個查詢請求栋齿,并監(jiān)聽 Socket 返回苗胀,通常是以阻塞模式襟诸,等待
服務(wù)端響應(yīng)。服務(wù)端處理命令基协,并將結(jié)果返回給客戶端歌亲。

在服務(wù)端未響應(yīng)時,客戶端可以繼續(xù)向服務(wù)端發(fā)送請求堡掏,并最終一次性讀取所有服務(wù)
端的響應(yīng)应结。

Redis 管道技術(shù)最顯著的優(yōu)勢是提高了 Redis 服務(wù)的性能刨疼。
分區(qū)是分割數(shù)據(jù)到多個 Redis 實(shí)例的處理過程泉唁,因此每個實(shí)例只保存 key 的一個子
集。

通過利用多臺計算機(jī)內(nèi)存的和值揩慕,允許我們構(gòu)造更大的數(shù)據(jù)庫亭畜。
通過多核和多臺計算機(jī),允許我們擴(kuò)展計算能力迎卤;通過多臺計算機(jī)和網(wǎng)絡(luò)適配器拴鸵,允
許我們擴(kuò)展網(wǎng)絡(luò)帶寬。

Redis 的一些特性在分區(qū)方面表現(xiàn)的不是很好:
涉及多個 key 的操作通常是不被支持的蜗搔。舉例來說劲藐,當(dāng)兩個 set 映射到不同的
Redis 實(shí)例上時,你就不能對這兩個 set 執(zhí)行交集操作樟凄。
涉及多個 key 的 Redis 事務(wù)不能使用聘芜。
當(dāng)使用分區(qū)時,數(shù)據(jù)處理較為復(fù)雜缝龄,比如你需要處理多個 rdb/aof 文件汰现,并且從多個
實(shí)例和主機(jī)備份持久化文件。

增加或刪除容量也比較復(fù)雜叔壤。Redis 集群大多數(shù)支持在運(yùn)行時增加瞎饲、刪除節(jié)點(diǎn)的透明
數(shù)據(jù)平衡的能力,但是類似于客戶端分區(qū)炼绘、代理等其他系統(tǒng)則不支持這項(xiàng)特性嗅战。然
而,一種叫做 presharding 的技術(shù)對此是有幫助的俺亮。

23. Redis 有兩種類型分區(qū)驮捍。

最簡單的分區(qū)方式是按范圍分區(qū),就是映射一定范圍的對象到特定的 Redis 實(shí)例铅辞。
比如厌漂,ID 從 0 到 10000 的用戶會保存到實(shí)例 R0,ID 從 10001 到 20000 的用
戶會保存到 R1斟珊,以此類推苇倡。
這種方式是可行的富纸,并且在實(shí)際中使用,不足就是要有一個區(qū)間范圍到實(shí)例的映射
表旨椒。這個表要被管理晓褪,同時還需要各 種對象的映射表,通常對 Redis 來說并非是好
的方法综慎。
哈希分區(qū):另外一種分區(qū)方法是 hash 分區(qū)涣仿。這對任何 key 都適用,也無需是
object_name: 這種形式示惊,像下面描述的一樣簡單:
用一個 hash 函數(shù)將 key 轉(zhuǎn)換為一個數(shù)字好港,比如使用 crc32 hash 函數(shù)。對 key
foobar 執(zhí)行 crc32(foobar) 會輸出類似 93024922 的整數(shù)米罚。
對這個整數(shù)取模钧汹,將其轉(zhuǎn)化為 0-3 之間的數(shù)字,就可以將這個整數(shù)映射到 4 個
Redis 實(shí)例中的一個了录择。93024922 % 4 = 2拔莱,就是說 key foobar 應(yīng)該被存到 R2
實(shí)例中。注意:取模操作是取除的余數(shù)隘竭,通常在多種編程語言中用 % 操作符實(shí)現(xiàn)塘秦。
實(shí)際上,上面的集群模式還存在兩個問題:

  1. 擴(kuò)容問題:
    因?yàn)槭褂昧艘恢滦怨∵M(jìn)行分片动看,那么不同的 key 分布到不同的 Redis?Server 上尊剔,當(dāng)我們需要擴(kuò)容時,需要增加機(jī)器到分片列表中弧圆,這時候會使得
    同樣的 key 算出來落到跟原來不同的機(jī)器上赋兵,這樣如果要取某一個值,會出
    現(xiàn)取不到的情況搔预,對于這種情況霹期,Redis 的作者提出了一種名為 Pre?Sharding 的方式:
    Pre-Sharding 方法是將每一個臺物理機(jī)上,運(yùn)行多個不同斷口的 Redis 實(shí)
    例拯田,假如有三個物理機(jī)历造,每個物理機(jī)運(yùn)行三個 Redis 實(shí)際,那么我們的分片
    列表中實(shí)際有 9 個 Redis 實(shí)例船庇,當(dāng)我們需要擴(kuò)容時府蛇,增加一臺物理機(jī)颁督,步驟
    如下:
  2. 在新的物理機(jī)上運(yùn)行 Redis-Server劈彪;
  3. 該 Redis-Server 從屬于 (slaveof) 分片列表中的某一 Redis-Server
    (假設(shè)叫 RedisA)嗦锐;
  4. 等主從復(fù)制 (Replication) 完成后,將客戶端分片列表中 RedisA 的
    IP 和端口改為新物理機(jī)上 Redis-Server 的 IP 和端口窃爷;
  5. 停止 RedisA邑蒋。
    這樣相當(dāng)于將某一 Redis-Server 轉(zhuǎn)移到了一臺新機(jī)器上姓蜂。Prd-Sharding 實(shí)
    際上是一種在線擴(kuò)容的辦法,但還是很依賴 Redis 本身的復(fù)制功能的医吊,如果
    主庫快照數(shù)據(jù)文件過大钱慢,這個復(fù)制的過程也會很久,同時會給主庫帶來壓力卿堂。
    所以做這個拆分的過程最好選擇為業(yè)務(wù)訪問低峰時段進(jìn)行束莫。
  6. 單點(diǎn)故障問題:
    還是用到 Redis 主從復(fù)制的功能,兩臺物理主機(jī)上分別都運(yùn)行有 Redis?Server草描,其中一個 Redis-Server 是另一個的從庫览绿,采用雙機(jī)熱備技術(shù),客戶
    端通過虛擬 IP 訪問主庫的物理 IP陶珠,當(dāng)主庫宕機(jī)時挟裂,切換到從庫的物理 IP。
    只是事后修復(fù)主庫時揍诽,應(yīng)該將之前的從庫改為主庫(使用命令 slaveof no
    one),主庫變?yōu)槠鋸膸欤ㄊ姑?slaveof IP PORT)栗竖,這樣才能保證修復(fù)期
    間新增數(shù)據(jù)的一致性暑脆。

24. 什么是 MongoDB。

非關(guān)系型數(shù)據(jù)庫 (NoSql),Mongo DB 很好的實(shí)現(xiàn)了面向?qū)ο蟮乃枷?(OO 思想), 在
Mongo DB 中 每一條記錄都是一個 Document 對象狐肢。Mongo DB 最大的優(yōu)勢在
于所有的數(shù)據(jù)持久操作都無需開發(fā)人員手動編寫 SQL 語句, 直接調(diào)用方法就可以輕松
的實(shí)現(xiàn) CRUD 操作.

25. MongoDB 特點(diǎn)添吗。

高性能、易部署份名、易使用碟联,存儲數(shù)據(jù)非常方便。主要功能特性有:
面向集合存儲僵腺,易存儲對象類型的數(shù)據(jù)鲤孵。
模式自由。
支持動態(tài)查詢辰如。
支持完全索引普监,包含內(nèi)部對象。
支持查詢琉兜。
支持復(fù)制和故障恢復(fù)凯正。
使用高效的二進(jìn)制數(shù)據(jù)存儲,包括大型對象(如視頻等)豌蟋。
自動處理碎片廊散,以支持云計算層次的擴(kuò)展性
支持 Python,PHP梧疲,Ruby允睹,Java施符,C,C#擂找,Javascript戳吝,Perl 及 C++ 語言的驅(qū)動
程序,社區(qū)中也提供了對 Erlang 及. NET 等平臺的驅(qū)動程序贯涎。
文件存儲格式為 BSON(一種 JSON 的擴(kuò)展)听哭。
可通過網(wǎng)絡(luò)訪問。

26. MongoDB 的功能塘雳。

面向集合的存儲:適合存儲對象及 JSON 形式的數(shù)據(jù)陆盘。
動態(tài)查詢:Mongo 支持豐富的查詢表達(dá)式。查詢指令使用 JSON 形式的標(biāo)記败明,可輕
易查詢文檔中內(nèi)嵌的對象及數(shù)組隘马。
完整的索引支持:包括文檔內(nèi)嵌對象及數(shù)組。Mongo 的查詢優(yōu)化器會分析查詢表達(dá)
式妻顶,并生成一個高效的查詢計劃酸员。
查詢監(jiān)視:Mongo 包含一個監(jiān)視工具用于分析數(shù)據(jù)庫操作的性能。
復(fù)制及自動故障轉(zhuǎn)移:Mongo 數(shù)據(jù)庫支持服務(wù)器之間的數(shù)據(jù)復(fù)制讳嘱,支持主 - 從模式
及服務(wù)器之間的相互復(fù)制幔嗦。復(fù)制的主要目標(biāo)是提供冗余及自動故障轉(zhuǎn)移。
高效的傳統(tǒng)存儲方式:支持二進(jìn)制數(shù)據(jù)及大型對象(如照片或圖片)
自動分片以支持云級別的伸縮性:自動分片功能支持水平的數(shù)據(jù)庫集群沥潭,可動態(tài)添加
額外的機(jī)器邀泉。

27. MongoDB 的適用場景。

網(wǎng)站數(shù)據(jù):Mongo 非常適合實(shí)時的插入钝鸽,更新與查詢汇恤,并具備網(wǎng)站實(shí)時數(shù)據(jù)存儲所
需的復(fù)制及高度伸縮性。
緩存:由于性能很高拔恰,Mongo 也適合作為信息基礎(chǔ)設(shè)施的緩存層因谎。在系統(tǒng)重啟之
后,由 Mongo 搭建的持久化緩存層可以避免下層的數(shù)據(jù)源 過載仁连。
大尺寸蓝角,低價值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫存儲一些數(shù)據(jù)時可能會比較昂貴,
在此之前饭冬,很多時候程序員往往會選擇傳統(tǒng)的文件進(jìn)行存儲使鹅。
高伸縮性的場景:Mongo 非常適合由數(shù)十或數(shù)百臺服務(wù)器組成的數(shù)據(jù)庫。Mongo
的路線圖中已經(jīng)包含對 MapReduce 引擎的內(nèi)置支持昌抠。
用于對象及 JSON 數(shù)據(jù)的存儲:Mongo 的 BSON 數(shù)據(jù)格式非常適合文檔化格式的
存儲及查詢患朱。

28. Redis、memcache炊苫、MongoDB 對比裁厅。

mongodb 和 memcached 不是一個范疇內(nèi)的東西冰沙。mongodb 是文檔型的非關(guān)系
型數(shù)據(jù)庫,其優(yōu)勢在于查詢功能比較強(qiáng)大执虹,能存儲海量數(shù)據(jù)拓挥。
和 memcached 更為接近的是 Redis。它們都是內(nèi)存型數(shù)據(jù)庫袋励,數(shù)據(jù)保存在內(nèi)存
中侥啤,通過 tcp 直接存取,優(yōu)勢是速度快茬故,并發(fā)高盖灸,缺點(diǎn)是數(shù)據(jù)類型有限,查詢功能不
強(qiáng)磺芭,一般用作緩存赁炎。

  1. 性能
    Redis 和 memcache 差不多,要大于 mongodb钾腺。
  2. 操作的便利性
    memcache 數(shù)據(jù)結(jié)構(gòu)單一徙垫。
    Redis 豐富一些,數(shù)據(jù)操作方面垮庐,Redis 更好一些松邪,較少的網(wǎng)絡(luò) IO 次數(shù)。
    mongodb 支持豐富的數(shù)據(jù)表達(dá)哨查,索引,最類似關(guān)系型數(shù)據(jù)庫剧辐,支持的查詢語
    言非常豐富寒亥。
  3. 內(nèi)存空間的大小和數(shù)據(jù)量的大小
    Redis 在 2.0 版本后增加了自己的 VM 特性,突破物理內(nèi)存的限制荧关;可以對
    key value 設(shè)置過期時間(類似 memcache)溉奕。
    memcache 可以修改最大可用內(nèi)存, 采用 LRU 算法。
    mongoDB 適合大數(shù)據(jù)量的存儲忍啤,依賴操作系統(tǒng) VM 做內(nèi)存管理加勤,吃內(nèi)存也
    比較厲害,服務(wù)不要和別的服務(wù)在一起同波。
  4. 可用性(單點(diǎn)問題)
    Redis 對于單點(diǎn)問題鳄梅,依賴客戶端來實(shí)現(xiàn)分布式讀寫;主從復(fù)制時未檩,每次從節(jié)
    點(diǎn)重新連接主節(jié)點(diǎn)都要依賴整個快照, 無增量復(fù)制戴尸,因性能和效率問題,所以
    單點(diǎn)問題比較復(fù)雜冤狡;不支持自動 sharding, 需要依賴程序設(shè)定一致 hash 機(jī)
    制孙蒙。一種替代方案是项棠,不用 Redis 本身的復(fù)制機(jī)制,采用自己做主動復(fù)制
    (多份存儲)挎峦,或者改成增量復(fù)制的方式(需要自己實(shí)現(xiàn))香追,一致性問題和性
    能的權(quán)衡。
    Memcache 本身沒有數(shù)據(jù)冗余機(jī)制坦胶,也沒必要透典;對于故障預(yù)防,采用依賴成
    熟的 hash 或者環(huán)狀的算法迁央,解決單點(diǎn)故障引起的抖動問題掷匠。
    mongoDB 支持 master-slave,replicaset(內(nèi)部采用 paxos 選舉算法,自
    動故障恢復(fù)),auto sharding 機(jī)制岖圈,對客戶端屏蔽了故障轉(zhuǎn)移和切分機(jī)制讹语。
  5. 可靠性(持久化)
    對于數(shù)據(jù)持久化和數(shù)據(jù)恢復(fù),Redis 支持(快照蜂科、AOF):依賴快照進(jìn)行持久
    化顽决,aof 增強(qiáng)了可靠性的同時,對性能有所影響导匣。
    memcache 不支持才菠,通常用在做緩存, 提升性能;
    MongoDB 從 1.8 版本開始采用 binlog 方式支持持久化的可靠性贡定。
  6. 數(shù)據(jù)一致性(事務(wù)支持)
    Memcache 在并發(fā)場景下赋访,用 cas 保證一致性。
    Redis 事務(wù)支持比較弱缓待,只能保證事務(wù)中的每個操作連續(xù)執(zhí)行蚓耽。
    mongoDB 不支持事務(wù)。
  7. 數(shù)據(jù)分析
    mongoDB 內(nèi)置了數(shù)據(jù)分析的功能 (mapreduce), 其他不支持旋炒。
  8. 應(yīng)用場景
    Redis:數(shù)據(jù)量較小的更性能操作和運(yùn)算上步悠。
    memcache:用于在動態(tài)系統(tǒng)中減少數(shù)據(jù)庫負(fù)載,提升性能; 做緩存瘫镇,提高性
    能(適合讀多寫少鼎兽,對于數(shù)據(jù)量比較大,可以采用 sharding)铣除。
    MongoDB: 主要解決海量數(shù)據(jù)的訪問效率問題谚咬。

29. Redis 有什么用?

只有了解了它有哪些特性通孽,我們在用的時候才能揚(yáng)長避短序宦,為我們所
用。

  1. 速度快:使用標(biāo)準(zhǔn) C 寫,所有數(shù)據(jù)都在內(nèi)存中完成互捌,讀寫速度分別達(dá)到 10
    萬 / 20 萬潘明。
  2. 持久化:對數(shù)據(jù)的更新采用 Copy-on-write 技術(shù),可以異步地保存到磁盤
    上秕噪,主要有兩種策略钳降,一是根據(jù)時間,更新次數(shù)的快照(save 300 10 )二是
    基于語句追加方式 (Append-only file腌巾,aof) 遂填。
  3. 自動操作:對不同數(shù)據(jù)類型的操作都是自動的,很安全澈蝙。
  4. 快速的主 -- 從復(fù)制吓坚,官方提供了一個數(shù)據(jù),Slave 在 21 秒即完成了對
    Amazon 網(wǎng)站 10G key set 的復(fù)制灯荧。
  5. Sharding 技術(shù): 很容易將數(shù)據(jù)分布到多個 Redis 實(shí)例中礁击,數(shù)據(jù)庫的擴(kuò)展是
    個永恒的話題,在關(guān)系型數(shù)據(jù)庫中逗载,主要是以添加硬件哆窿、以分區(qū)為主要技術(shù)形
    式的縱向擴(kuò)展解決了很多的應(yīng)用場景,但隨著 web2.0厉斟、移動互聯(lián)網(wǎng)挚躯、云計算
    等應(yīng)用的興起,這種擴(kuò)展模式已經(jīng)不太適合了擦秽,所以近年來码荔,像采用主從配
    置、數(shù)據(jù)庫復(fù)制形式的感挥,Sharding 這種技術(shù)把負(fù)載分布到多個特理節(jié)點(diǎn)上去
    的橫向擴(kuò)展方式用處越來越多目胡。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市链快,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眉尸,老刑警劉巖域蜗,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異噪猾,居然都是意外死亡霉祸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門袱蜡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丝蹭,“玉大人,你說我怎么就攤上這事坪蚁”即” “怎么了镜沽?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贱田。 經(jīng)常有香客問我缅茉,道長,這世上最難降的妖魔是什么男摧? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任蔬墩,我火速辦了婚禮,結(jié)果婚禮上耗拓,老公的妹妹穿的比我還像新娘拇颅。我一直安慰自己,他們只是感情好乔询,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布樟插。 她就那樣靜靜地躺著,像睡著了一般哥谷。 火紅的嫁衣襯著肌膚如雪岸夯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天们妥,我揣著相機(jī)與錄音猜扮,去河邊找鬼。 笑死监婶,一個胖子當(dāng)著我的面吹牛旅赢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惑惶,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼煮盼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了带污?” 一聲冷哼從身側(cè)響起僵控,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鱼冀,沒想到半個月后报破,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡千绪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年充易,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荸型。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡盹靴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稿静,我是刑警寧澤梭冠,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站自赔,受9級特大地震影響妈嘹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绍妨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一润脸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧他去,春花似錦毙驯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媳搪,卻和暖如春铭段,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秦爆。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工序愚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人等限。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓爸吮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親望门。 傳聞我的和親對象是個殘疾皇子形娇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容