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í)際上,上面的集群模式還存在兩個問題:
- 擴(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ī)颁督,步驟
如下: - 在新的物理機(jī)上運(yùn)行 Redis-Server劈彪;
- 該 Redis-Server 從屬于 (slaveof) 分片列表中的某一 Redis-Server
(假設(shè)叫 RedisA)嗦锐; - 等主從復(fù)制 (Replication) 完成后,將客戶端分片列表中 RedisA 的
IP 和端口改為新物理機(jī)上 Redis-Server 的 IP 和端口窃爷; - 停止 RedisA邑蒋。
這樣相當(dāng)于將某一 Redis-Server 轉(zhuǎn)移到了一臺新機(jī)器上姓蜂。Prd-Sharding 實(shí)
際上是一種在線擴(kuò)容的辦法,但還是很依賴 Redis 本身的復(fù)制功能的医吊,如果
主庫快照數(shù)據(jù)文件過大钱慢,這個復(fù)制的過程也會很久,同時會給主庫帶來壓力卿堂。
所以做這個拆分的過程最好選擇為業(yè)務(wù)訪問低峰時段進(jìn)行束莫。 - 單點(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)磺芭,一般用作緩存赁炎。
- 性能
Redis 和 memcache 差不多,要大于 mongodb钾腺。 - 操作的便利性
memcache 數(shù)據(jù)結(jié)構(gòu)單一徙垫。
Redis 豐富一些,數(shù)據(jù)操作方面垮庐,Redis 更好一些松邪,較少的網(wǎng)絡(luò) IO 次數(shù)。
mongodb 支持豐富的數(shù)據(jù)表達(dá)哨查,索引,最類似關(guān)系型數(shù)據(jù)庫剧辐,支持的查詢語
言非常豐富寒亥。 - 內(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ù)在一起同波。 - 可用性(單點(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ī)制讹语。 - 可靠性(持久化)
對于數(shù)據(jù)持久化和數(shù)據(jù)恢復(fù),Redis 支持(快照蜂科、AOF):依賴快照進(jìn)行持久
化顽决,aof 增強(qiáng)了可靠性的同時,對性能有所影響导匣。
memcache 不支持才菠,通常用在做緩存, 提升性能;
MongoDB 從 1.8 版本開始采用 binlog 方式支持持久化的可靠性贡定。 - 數(shù)據(jù)一致性(事務(wù)支持)
Memcache 在并發(fā)場景下赋访,用 cas 保證一致性。
Redis 事務(wù)支持比較弱缓待,只能保證事務(wù)中的每個操作連續(xù)執(zhí)行蚓耽。
mongoDB 不支持事務(wù)。 - 數(shù)據(jù)分析
mongoDB 內(nèi)置了數(shù)據(jù)分析的功能 (mapreduce), 其他不支持旋炒。 - 應(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)長避短序宦,為我們所
用。
- 速度快:使用標(biāo)準(zhǔn) C 寫,所有數(shù)據(jù)都在內(nèi)存中完成互捌,讀寫速度分別達(dá)到 10
萬 / 20 萬潘明。 - 持久化:對數(shù)據(jù)的更新采用 Copy-on-write 技術(shù),可以異步地保存到磁盤
上秕噪,主要有兩種策略钳降,一是根據(jù)時間,更新次數(shù)的快照(save 300 10 )二是
基于語句追加方式 (Append-only file腌巾,aof) 遂填。 - 自動操作:對不同數(shù)據(jù)類型的操作都是自動的,很安全澈蝙。
- 快速的主 -- 從復(fù)制吓坚,官方提供了一個數(shù)據(jù),Slave 在 21 秒即完成了對
Amazon 網(wǎng)站 10G key set 的復(fù)制灯荧。 - 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ò)展方式用處越來越多目胡。