「PHP學習網」 公衆號會天天分享一些面試題,正在找工做的小夥伴們能夠來看看哦。
mongodb 支持副本集、索引、自動分片,能夠保證較高的性能和可用性。php
更高的寫入負載mysql
默認狀況下,MongoDB 更側重高數據寫入性能,而非事務安全,MongoDB 很適合業務系統中有大量 「低價值」 數據的場景。可是應當避免在高事務安全性的系統中使用 MongoDB,除非能從架構設計上保證事務安全。linux
高可用性面試
MongoDB 的復副集 (Master-Slave) 配置很是簡潔方便,此外,MongoDB 能夠快速響應的處理單節點故障,自動、安全的完成故障轉移。這些特性使得 MongoDB 能在一個相對不穩定(如雲主機)的環境中,保持高可用性。redis
數據量很大或者將來會變得很大sql
依賴數據庫 (MySQL) 自身的特性,完成數據的擴展是較困難的事,在 MySQL 中,當一個單達表到 5-10GB 時會出現明顯的性能降級,此時須要經過數據的水平和垂直拆分、庫的拆分完成擴展,使用 MySQL 一般須要藉助驅動層或代理層完成這類需求。而 MongoDB 內建了多種數據分片的特性,能夠很好的適應大數據量的需求。mongodb
基於位置的數據查詢數據庫
MongoDB 支持二維空間索引,所以能夠快速及精確的從指定位置獲取數據。安全
表結構不明確服務器
在一些傳統 RDBMS 中,增長一個字段會鎖住整個數據庫 / 表,或者在執行一個重負載的請求時會明顯形成其它請求的性能降級。一般發生在數據表大於 1G 的時候(當大於 1TB 時更甚)。 因 MongoDB 是文檔型數據庫,爲非結構貨的文檔增長一個新字段是很快速的操做,而且不會影響到已有數據。另一個好處當業務數據發生變化時,是將不在須要由 DBA 修改表結構。
當一張表的數據達到幾百萬時,你查詢一次所花的時間會變多,若是有聯合查詢的話,有可能會死在那兒了。分表的目的就在於此,減少數據庫的負擔,縮短查詢時間。平常開發中咱們常常會遇到大表的狀況,所謂的大表是指存儲了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,致使數據庫在查詢和插入的時候耗時太長,性能低下,若是涉及聯合查詢的狀況,性能會更加糟糕。分表和表分區的目的就是減小數據庫的負擔,提升數據庫的效率,一般點來說就是提升表的增刪改查效率。數據庫中的數據量不必定是可控的,在未進行分庫分表的狀況下,隨着時間和業務的發展,庫中的表會愈來愈多,表中的數據量也會愈來愈大,相應地,數據操做,增刪改查的開銷也會愈來愈大;另外,因爲沒法進行分佈式式部署,而一臺服務器的資源(CPU、磁盤、內存、IO 等)是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。
作 mysql 集羣,有人會問 mysql 集羣,根分表有什麼關係嗎?雖然它不是實際意義上的分表,可是它啓到了分表的做用,作集羣的意義是什麼呢?爲一個數據庫減輕負擔,說白了就是減小 sql 排隊隊列中的 sql 的數量,舉個例子:有 10 個 sql 請求,若是放在一個數據庫服務器的排隊隊列中,他要等很長時間,若是把這 10 個 sql 請求,分配到 5 個數據庫服務器的排隊隊列中,一個數據庫服務器的隊列中只有 2 個,這樣等待時間是否是大大的縮短了呢?
linux mysql proxy 的安裝,配置,以及讀寫分離
mysql replication 互爲主從的安裝及配置,以及數據同步
優勢:擴展性好,沒有多個分表後的複雜操做(php 代碼)
缺點:單個表的數據量仍是沒有變,一次操做所花的時間仍是那麼多,硬件開銷大。
主從複製,是用來創建一個和主數據庫徹底同樣的數據庫環境,稱爲從數據庫;
1.數據庫有個bin-log二進制文件,記錄了全部的sql語句。
2.只須要把主數據庫的bin-log文件中的sql語句複製。
3.讓其從數據的relay-log重作日誌文件中在執行一次這些sql語句便可。
1.作數據的熱備份,做爲後備數據庫,主數據庫服務器故障後,可切換到從數據庫繼續工做,避免數據丟失。
2.架構的擴展。業務量愈來愈大,I/O訪問頻率太高,單機沒法知足,此時作多庫的存儲,下降磁盤I/O訪問頻率,提升單機的I/O性能
3.主從複製是讀寫分離的基礎,使數據庫能製成更大 的併發。例如子報表中,因爲部署報表的sql語句十分慢,致使鎖表,影響前臺的服務。若是前臺服務使用master,報表使用slave,那麼報表sql將不會形成前臺所,保證了前臺的訪問速度。
1.同步複製:所謂的同步複製,意思是master的變化,必須等待slave-1,slave-2,...,slave-n完成後才能返回。
2.異步複製:如同AJAX請求同樣。master只須要完成本身的數據庫操做便可。至於slaves是否收到二進制日誌,是否完成操做,不用關心。MYSQL的默認設置。
3.半同步複製:master只保證slaves中的一個操做成功,就返回,其餘slave無論。
這個功能,是由google爲MYSQL引入的。
在完成主從複製時,因爲slave是須要同步master的。因此對於insert/delete/update這些更新數據庫的操做,應該在master中完成。而select的查詢操做,則落下到slave中。
最後各位能夠掃下方二維碼關注我公衆號,目前我正在更新基礎面試題,以後會更新中高級、redis、liunx面試題