每日分享The world is moving so fast that the person who says it can't be done is generally interrupted by someone doing it. 世界變化的如此之快,以至于那些光說不做的人,通常被動(dòng)手去做的人所淘汰。 小閆語錄: 少些抱怨,少些碎碎念,將這些時(shí)間用在去解決問題上,你會(huì)發(fā)現(xiàn)問題也許已經(jīng)解決了。打嘴炮很爽,但是舒服的事情往往都是無意義的消遣。直接動(dòng)手去干,也許很難,但是你敢于開始就已經(jīng)成功了一半。不要眼高手低,還是去做,來點(diǎn)實(shí)際的比較好。 Mongodb(一)1.數(shù)據(jù)庫相關(guān)知識(shí)點(diǎn)回顧1.數(shù)據(jù)庫分為關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。 2.SQL數(shù)據(jù)庫中包含Oracle(閉源、收費(fèi))、MySQL(開源、免費(fèi))和SQL Server。 3.三范式:表字段的原子性(不可拆分);滿足第一范式的基礎(chǔ)上,有主鍵依賴;滿足第一二范式的基礎(chǔ)上,非主屬性之間沒有依賴關(guān)系。
4.淘寶使用的也是MySQL,但不是直接使用,而是將其改寫才使用。因?yàn)殡娚叹W(wǎng)站的高并發(fā)量,涉及到大量讀寫,沒有數(shù)據(jù)庫適用。 5.NoSQL數(shù)據(jù)庫(非關(guān)系型數(shù)據(jù)庫):MongoDB、redis。 6.redis是使用c語言編寫的、內(nèi)存型的、支持網(wǎng)絡(luò)、持久化、key-value形式的非關(guān)系型數(shù)據(jù)庫。redis是單線程的。持久化是指自動(dòng)的將數(shù)據(jù)保存到磁盤中。 7.mysql是c++寫的。
8.NoSQL有兩種解釋,一種是Not Only SQL,代表的是不僅僅是數(shù)據(jù)庫;另一種是非關(guān)系型數(shù)據(jù)庫。 9.NoSQL指的是非關(guān)系型的數(shù)據(jù)庫,是相對(duì)于關(guān)系型數(shù)據(jù)庫的統(tǒng)稱,主要是解決大規(guī)模數(shù)據(jù)存儲(chǔ)的挑戰(zhàn)。 10.reids存儲(chǔ)是鍵值型的數(shù)據(jù),MongoDB則是文檔型的數(shù)據(jù)。 11.SQL注重于關(guān)系,NoSQL則是注重存儲(chǔ)。NoSQL處理不了特別復(fù)雜的關(guān)系表。 12.MongoDB是可擴(kuò)展的高性能、開源、面向文檔(分布式文件存儲(chǔ))的NoSQL型的數(shù)據(jù)庫。 13.MongoDB的讀寫性能在介于redis和mysql之間。redis的性能最高。
14.MySQL的擴(kuò)展性差,大數(shù)據(jù)下IO壓力大,表結(jié)構(gòu)更改困難。MongoDB易擴(kuò)展,大數(shù)據(jù)量高性能,靈活的數(shù)據(jù)模型,高可用。 15.關(guān)系型數(shù)據(jù)庫在當(dāng)前時(shí)代的缺點(diǎn):數(shù)據(jù)格式單一;高并發(fā)讀寫性能低;可擴(kuò)展性低。 2.MongoDB1.MongoDB中的三要素:數(shù)據(jù)庫、集合(可以簡(jiǎn)單的理解為表)、文檔(可以簡(jiǎn)單的理解為行) 2.MongoDB中的數(shù)據(jù)存儲(chǔ)是Bson的形式存儲(chǔ)的,Bson是二進(jìn)制的json,所以看上去記錄的形式類似于json數(shù)據(jù)。 3.MongoDB擴(kuò)展性非常好。因?yàn)樵贛ongoDB中文檔結(jié)構(gòu)可以不同,隨意對(duì)文檔結(jié)構(gòu)進(jìn)行擴(kuò)展,不像MySQL中每個(gè)字段都是固定好的,你需要往里填數(shù)據(jù)。 4.為什么要使用NoSQL? 答:易擴(kuò)展;讀寫速度快;高性能和高可擴(kuò)展;非結(jié)構(gòu)化與不可預(yù)知數(shù)據(jù)(數(shù)據(jù)模型靈活)。 5.為什么使用MongoDB? 答:高可擴(kuò)展性;高性能存儲(chǔ);使用簡(jiǎn)單;部署簡(jiǎn)單。 2.1MongoDB主要應(yīng)用場(chǎng)景1.網(wǎng)站數(shù)據(jù):網(wǎng)站實(shí)時(shí)操作比如插入,更新和查詢。 2.緩存:性能高。 3.大量、低價(jià)值數(shù)據(jù)的存儲(chǔ):日志監(jiān)控?cái)?shù)據(jù)、爬蟲數(shù)據(jù)。 4.集群 5.json格式的數(shù)據(jù):MongoDB采用的Bson(binary json)數(shù)據(jù)格式。 面試題一個(gè)并發(fā)量高的網(wǎng)站,其數(shù)據(jù)需要實(shí)時(shí)更新,假如緩存數(shù)據(jù)和磁盤數(shù)據(jù)不一致,我們?cè)趺唇鉀Q這個(gè)問題? 答:我們對(duì)于訪問量高的頁面,可以將MySQL數(shù)據(jù)中的數(shù)據(jù)讀取出來放到redis或者M(jìn)ongoDB中,使得下次訪問,直接從緩存中讀取即可,提高效率。為了解決緩存數(shù)據(jù)和磁盤數(shù)據(jù)不一致,我們可以使用定時(shí)任務(wù)或者異步,但是都存在一定的缺點(diǎn)。最好的解決方法是:我們?cè)谛薷南嚓P(guān)數(shù)據(jù)的接口中添加業(yè)務(wù)邏輯,就是將數(shù)據(jù)修改后馬上刪除緩存中的相關(guān)數(shù)據(jù),使其在訪問的時(shí)候就直接讀取磁盤的內(nèi)容。 2.2MongoDB安裝注意點(diǎn)1.版本選擇時(shí),盡量選取偶數(shù)版,偶數(shù)版為穩(wěn)定版(release),基本沒有bug。
2.位數(shù)選擇64位,32位存在存儲(chǔ)上限。 3.安裝完只有要記得配置環(huán)境變量,使其可以在任意目錄下開啟使用MongoDB數(shù)據(jù)庫。 4.阻塞進(jìn)程就是如果關(guān)閉當(dāng)前終端,那么進(jìn)程就會(huì)關(guān)閉。守護(hù)進(jìn)程就是可以在后臺(tái)運(yùn)行。 5. 2.3基本命令開啟MongoDB服務(wù)器:
以守護(hù)式在后臺(tái)開啟一個(gè)子進(jìn)程:
使用指定的目錄存放數(shù)據(jù):
指定加載配置文件:
查看是否開啟成功:
進(jìn)入MongoDB的客戶端:
退出客戶端:
終端中遠(yuǎn)程關(guān)閉服務(wù)器
2.4權(quán)限管理剛安裝完畢的MongoDB默認(rèn)不適用權(quán)限認(rèn)證方式啟動(dòng),然而公網(wǎng)運(yùn)行系統(tǒng)要設(shè)置權(quán)限以保證數(shù)據(jù)安全。 2.4.1開啟權(quán)限認(rèn)證的方式
1.在啟動(dòng)數(shù)據(jù)庫的時(shí)候添加
2.在配置文件中添加 2.4.2權(quán)限認(rèn)證創(chuàng)建用戶登錄的基本步驟1.首先在普通模式下啟動(dòng),創(chuàng)建用戶,指定權(quán)限。
2.選擇數(shù)據(jù)庫后使用相應(yīng)方法創(chuàng)建用戶及權(quán)限:
注意:MongoDB中可以往一個(gè)不存在的數(shù)據(jù)庫和集合中進(jìn)行操作,如果插入數(shù)據(jù)成功,之后就會(huì)自動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)庫。 3.關(guān)閉MongoDB服務(wù)器,以認(rèn)證模式啟動(dòng)。
4.mongo進(jìn)入終端,切換到admin數(shù)據(jù)庫下,認(rèn)證:
2.4.3其他命令查看已經(jīng)創(chuàng)建的用戶權(quán)限:
數(shù)據(jù)庫權(quán)限認(rèn)證:(認(rèn)證的時(shí)候必須是該用戶在哪個(gè)數(shù)據(jù)庫下創(chuàng)建的,在哪個(gè)數(shù)據(jù)庫進(jìn)行認(rèn)證。)
刪除某一用戶及權(quán)限:
2.5數(shù)據(jù)庫的基本操作2.5.1數(shù)據(jù)庫相關(guān)操作查看當(dāng)前使用數(shù)據(jù)庫:
查看磁盤上存在的數(shù)據(jù)庫:
切換到指定的數(shù)據(jù)庫:
刪除當(dāng)前的數(shù)據(jù)庫:
2.5.2集合相關(guān)操作查看當(dāng)前數(shù)據(jù)庫中的集合列表(選擇數(shù)據(jù)庫之后使用):
創(chuàng)建集合:
刪除集合:
2.6固定集合固定集合類似于循環(huán)隊(duì)列,當(dāng)沒有存儲(chǔ)空間的時(shí)候,最老的數(shù)據(jù)將會(huì)被新數(shù)據(jù)覆蓋。
創(chuàng)建固定集合:
適用場(chǎng)景:日志。
特點(diǎn):插入速度快,按照順序查詢速度快,新數(shù)據(jù)會(huì)替換舊數(shù)據(jù),不能使用remove刪除數(shù)據(jù)。 2.6.1固定集合相關(guān)操作判斷一個(gè)集合是否為固定大小集合:
將一個(gè)普通集合轉(zhuǎn)換為固定大小集合,無法將固定集合轉(zhuǎn)換為普通集合:
2.7MongoDB的數(shù)據(jù)類型
3.MongoDB的增刪改查查詢操作:
單條數(shù)據(jù)插入:
多條數(shù)據(jù)插入:
3.1更新操作語法:
1.全文檔覆蓋更新
2.指定鍵值更新
3.批量鍵值更新
4.不指定查詢條件進(jìn)行修改
3.2刪除操作1.指定刪除:
2.刪除全部數(shù)據(jù):
3.3保存操作
3.4查詢操作多數(shù)據(jù)查詢:
單條數(shù)據(jù)查詢:
查詢數(shù)據(jù)美化:
比較運(yùn)算符:
比較運(yùn)算符在查詢中格式:
多條件查詢,
多條件查詢,
在指定范圍中:
不再指定范圍中:
使用正則表達(dá)式:
3.5自定義查詢1.為什么有自定義查詢? 答:有時(shí)候查詢條件很復(fù)雜,前面的查詢方法實(shí)現(xiàn)起來都不方便,于是我們可以使用自定義查詢搞定復(fù)雜操作。 2.什么是自定義查詢? 答:自定義查詢是使用js語句實(shí)現(xiàn)的查詢
1.以這種方式查詢,實(shí)際上是對(duì)find()的結(jié)果應(yīng)用一遍自定義的js的匿名函數(shù)。this的作用同Python的self,this指的是每一條文檔。 2.自定義查詢可以定義復(fù)雜的判斷條件。 3.6查詢結(jié)果的進(jìn)一步操作跳過2條數(shù)據(jù)之后的查詢結(jié)果:
限制查詢2條數(shù)據(jù):
投影操作:投影就是顯示還是不顯示。
排序操作:
統(tǒng)計(jì)操作:
消除重復(fù)操作:
4.MongoDB的索引4.1面試題索引的原理? 答: 4.2 索引索引可以提升查詢速度,提升數(shù)據(jù)庫查詢的性能,但是犧牲了數(shù)據(jù)庫的插入和更新速度。頻繁插入修改的數(shù)據(jù)不適合建立索引。 最大的缺點(diǎn)就是在插入數(shù)據(jù)的時(shí)候,之前的索引就會(huì)變化。 查看語句的執(zhí)行情況:
創(chuàng)建索引的方法:
查看已經(jīng)存在的索引:
創(chuàng)建唯一索引:
刪除索引:
5.備份和恢復(fù)1.為什么進(jìn)行數(shù)據(jù)備份? 答:數(shù)據(jù)備份指的是將數(shù)據(jù)備份到指定的目錄,并在需要的時(shí)候進(jìn)行恢復(fù),一般用于災(zāi)難處理。 2.進(jìn)行備份(在終端中使用命令):
3.如何進(jìn)行數(shù)據(jù)恢復(fù):
5.1數(shù)據(jù)的導(dǎo)出和導(dǎo)入導(dǎo)出成json文件:
導(dǎo)出成csv文件:
為什么進(jìn)行數(shù)據(jù)的導(dǎo)出遇導(dǎo)入? 答:數(shù)據(jù)庫中的數(shù)據(jù)在與其他平臺(tái)和應(yīng)用進(jìn)行交互時(shí)需要按照指定格式導(dǎo)出交給后續(xù)步驟進(jìn)行處理。 6.python與MongoDB的交互導(dǎo)入
創(chuàng)建連接的數(shù)據(jù)庫對(duì)象
指定連接的數(shù)據(jù)庫/集合/文檔
python中find查詢返回的是cursor對(duì)象,需要對(duì)游標(biāo)對(duì)象進(jìn)行遍歷,得到查詢結(jié)果
7.面試題關(guān)系型和非關(guān)系型數(shù)據(jù)庫? 答:關(guān)系型指二維表格的形式存儲(chǔ)數(shù)據(jù),列叫做字段、行叫做記錄,表和表之間有關(guān)系,主鍵、外鍵、引用。非關(guān)系型數(shù)據(jù)庫是文檔形式存儲(chǔ)數(shù)據(jù),沒有表的概念,有集合(表)和文檔(記錄),存儲(chǔ)基于硬盤存儲(chǔ)數(shù)據(jù),吧硬盤中的數(shù)據(jù)放入內(nèi)存中進(jìn)行讀寫操作。
|
|