官术网_书友最值得收藏!

1.10 數(shù)據(jù)庫概述

數(shù)據(jù)庫是“按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲(chǔ)和管理數(shù)據(jù)的倉庫”,是一個(gè)長期存儲(chǔ)在計(jì)算機(jī)內(nèi)的、有組織的、可共享的、統(tǒng)一管理的大量數(shù)據(jù)的集合。

數(shù)據(jù)庫中的數(shù)據(jù)以一定格式存儲(chǔ)在一起,并且能與多個(gè)用戶共享,數(shù)據(jù)之間有盡可能小的冗余度。數(shù)據(jù)庫可被視為電子化的文件柜——存儲(chǔ)電子文件的場所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、查詢、更新、刪除等操作。

數(shù)據(jù)庫與應(yīng)用程序彼此獨(dú)立,在制作應(yīng)用程序時(shí),數(shù)據(jù)庫的性能上限在某種程度上代表了應(yīng)用程序的性能上限,因此對(duì)于數(shù)據(jù)庫來說,基準(zhǔn)測試、SQL與索引的優(yōu)化、主從復(fù)制,以及分表等工作都是重中之重。

? 基準(zhǔn)測試可以測試出MySQL服務(wù)器的指標(biāo)極限,在應(yīng)用程序制作完成之后,越接近基準(zhǔn)測試,說明程序在代碼上的可優(yōu)化空間越少。

? SQL與索引的優(yōu)化將大幅地提高M(jìn)ySQL的查詢速度。

? 主從復(fù)制主要用來解決MySQL的單臺(tái)性能瓶頸問題,通過多臺(tái)服務(wù)器可以平攤寫入或讀取的壓力,讓MySQL服務(wù)器的整體服務(wù)性能提升數(shù)倍。

? 分表既可以解決MySQL大表查詢速度過慢的問題(單靠索引無法解決),也可以單獨(dú)存儲(chǔ)歷史性數(shù)據(jù)和冗余性數(shù)據(jù),不會(huì)因歷史性、冗余性的數(shù)據(jù)影響查詢速度。

1.10.1 數(shù)據(jù)庫分類

數(shù)據(jù)庫主要分為關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫兩種。關(guān)系數(shù)據(jù)庫指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫,其以行和列的形式存儲(chǔ)數(shù)據(jù),以便于用戶理解。關(guān)系數(shù)據(jù)庫中的行和列被稱為表,一組表組成了數(shù)據(jù)庫。用戶通過查詢來檢索數(shù)據(jù)庫中的數(shù)據(jù)。關(guān)系模型可以簡單理解為二維表格模型,一個(gè)關(guān)系數(shù)據(jù)庫就是由二維表格及其之間的關(guān)系組成的一個(gè)數(shù)據(jù)組織。目前,最常用的關(guān)系數(shù)據(jù)庫有Oracle、MySQL、DB2和SQL Server。

最早的Oracle版本是1979年夏季發(fā)布的。最流行的Oracle版本為Oracle 11g,是2007年11月發(fā)布的。

SQL Server最初由Microsoft、Sybase和Ashton-Tate三家公司共同開發(fā),于1988年推出第一個(gè)OS/2版本。

MySQL是1996年發(fā)布的,開始只面向一小撥人,相當(dāng)于內(nèi)部發(fā)布。1996年10月,MySQL 3.11.1發(fā)布(MySQL沒有2.x版本),最開始只提供Solaris下的二進(jìn)制版本。一個(gè)月后,Linux版本出現(xiàn)了。在接下來的兩年里,MySQL被依次移植到各個(gè)平臺(tái)。由于MySQL是免費(fèi)的,并且可以在Linux系統(tǒng)上運(yùn)行,所以熱度逐漸超過了Oracle和SQL Server。

非關(guān)系數(shù)據(jù)庫又稱為NoSQL數(shù)據(jù)庫,隨著互聯(lián)網(wǎng)Web 2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在處理Web 2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站時(shí)已經(jīng)顯得力不從心,出現(xiàn)了很多難以克服的問題,而非關(guān)系的數(shù)據(jù)庫則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合和多重?cái)?shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。因?yàn)榉顷P(guān)系數(shù)據(jù)庫的性能遠(yuǎn)高于關(guān)系數(shù)據(jù)庫,所以通常將非關(guān)系數(shù)據(jù)庫作為目前應(yīng)用程序的緩存,讓系統(tǒng)的響應(yīng)速度更快一些,目前非關(guān)系數(shù)據(jù)庫最常用的分別是Redis和MongoDB。

? Redis是2009年正式發(fā)布的,主要以鍵值對(duì)作為存儲(chǔ)結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)。

? MongoDB最初于2007年開發(fā),主要以JSON作為存儲(chǔ)結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)。

由于Redis更新?lián)Q代較為迅速,集群版更加穩(wěn)定,不僅免費(fèi),而且有使用簡單、并發(fā)可觀等優(yōu)點(diǎn),所以一直占據(jù)著NoSQL數(shù)據(jù)庫的市場。

在應(yīng)用程序規(guī)模不斷擴(kuò)大的今天,網(wǎng)絡(luò)應(yīng)用程序、接口、性能指標(biāo)、試用場景等日新月異,過去的數(shù)據(jù)庫已無法滿足大數(shù)據(jù)、人工智能等方面的需要,因此NoSQL衍生出了四種新類型,如表1-2所示。

表1-2

值得注意的是,雖然在項(xiàng)目中經(jīng)常使用部分NoSQL數(shù)據(jù)庫作為緩存,但是NoSQL數(shù)據(jù)庫并不代表緩存,所以不要混淆NoSQL數(shù)據(jù)庫和緩存的概念,后續(xù)章節(jié)會(huì)詳細(xì)介紹緩存。除上述市場上常見的數(shù)據(jù)庫及其存儲(chǔ)方式外,其他特殊的存儲(chǔ)方式如表1-3所示。

表1-3

除Hadoop生態(tài)圈、Spark生態(tài)圈、數(shù)據(jù)挖掘系列、數(shù)據(jù)倉儲(chǔ)系列、大規(guī)模并行數(shù)據(jù)庫系列、數(shù)據(jù)集成系列等所涉及的存儲(chǔ)外,大部分應(yīng)用程序使用的數(shù)據(jù)庫和存儲(chǔ)方式都介紹到了。用表1-1與表1-2的存儲(chǔ)方式可以滿足絕大部分新聞網(wǎng)站、官網(wǎng)、游戲、電商、社交、數(shù)據(jù)平臺(tái)(HTTP API)、醫(yī)療管理系統(tǒng)(HIS)、股票分析系統(tǒng)、理財(cái)系統(tǒng)、財(cái)務(wù)系統(tǒng)、管理系統(tǒng)等應(yīng)用場景的需要。

時(shí)序性數(shù)據(jù)庫是一種較為特殊的數(shù)據(jù)庫,它使用了類SQL語句。例如,InfluxDB中使用的InfluxSQL與SQL語句幾乎沒有差別,其存儲(chǔ)格式仍為二維表、非文檔結(jié)構(gòu)或鍵值對(duì)結(jié)構(gòu),所以并沒有把InfluxDB放到表1-2中。但是幾乎不可能對(duì)InfluxDB數(shù)據(jù)庫做多表聯(lián)查、一對(duì)一、一對(duì)多等相關(guān)查詢操作,因?yàn)闀r(shí)序性數(shù)據(jù)庫的并發(fā)極大,實(shí)時(shí)響應(yīng)速度極快,該數(shù)據(jù)庫把一切性能都放在了新增、查詢、實(shí)時(shí)響應(yīng)等場景上。當(dāng)數(shù)據(jù)出現(xiàn)錯(cuò)誤時(shí),應(yīng)盡可能按照Time時(shí)間段刪除數(shù)據(jù)。

另外,SQLite雖然同樣作為新關(guān)系數(shù)據(jù)庫存在,但是過于微型,還原、備份等能力遠(yuǎn)不如MySQL、Oracle等常規(guī)關(guān)系數(shù)據(jù)庫,所以通常不作為關(guān)系數(shù)據(jù)庫使用。由于SQLite存儲(chǔ)空間與本身體積都較小,所以SQLite活躍在移動(dòng)端,通常作為移動(dòng)端的緩存而存在,有時(shí)也會(huì)作為應(yīng)用程序的緩存而存在。

Elasticsearch在官方文檔中屬于分布式RESTful響應(yīng)的搜索引擎(Distributed RESTful Search Engine),但Elasticsearch的存儲(chǔ)格式又是文檔式的,所以Elasticsearch既可歸屬于文檔數(shù)據(jù)庫,又可歸屬于搜索引擎。

上述內(nèi)容屬于概念類知識(shí),在學(xué)習(xí)過程中不要過多糾結(jié)歸屬類型,只要擅長在不同場景的架構(gòu)中使用不同的存儲(chǔ)方式達(dá)到理想的業(yè)務(wù)與性能目標(biāo)即可。目前市場上最常用的仍然是MySQL、Oracle、Redis、MongoDB、Elasticsearch和FastDFS等一系列“老功臣”。

1. 關(guān)系數(shù)據(jù)庫與非關(guān)系數(shù)據(jù)庫的區(qū)別

關(guān)系數(shù)據(jù)庫與非關(guān)系數(shù)據(jù)庫的區(qū)別如下:

數(shù)據(jù)存儲(chǔ)的方式不同

關(guān)系數(shù)據(jù)天然就是二維表,因此適合存儲(chǔ)在數(shù)據(jù)表的行和列中。數(shù)據(jù)表不僅可以彼此關(guān)聯(lián)協(xié)作存儲(chǔ),也很容易提取數(shù)據(jù)。與其相反,非關(guān)系數(shù)據(jù)是大塊組合在一起的,因而不適合存儲(chǔ)在數(shù)據(jù)表的行和列中。

數(shù)據(jù)存儲(chǔ)的地址不同

關(guān)系數(shù)據(jù)庫通常直接存儲(chǔ)進(jìn)二進(jìn)制文件中。非關(guān)系數(shù)據(jù)庫根據(jù)自身配置不同,有的只存儲(chǔ)在內(nèi)存中,有的暫存在緩存中。當(dāng)非關(guān)系數(shù)據(jù)庫存儲(chǔ)在內(nèi)存中時(shí),可以達(dá)到響應(yīng)速度更快的目的,但是也更容易丟失數(shù)據(jù),一旦重啟非關(guān)系數(shù)據(jù)庫,則相當(dāng)于丟失了所有內(nèi)容。當(dāng)非關(guān)系數(shù)據(jù)庫暫存在緩存中時(shí),它會(huì)定期把數(shù)據(jù)存儲(chǔ)到二進(jìn)制文件中,即便重啟非關(guān)系數(shù)據(jù)庫,也可保證部分?jǐn)?shù)據(jù)不會(huì)丟失。

對(duì)事務(wù)性的支持不同

如果數(shù)據(jù)操作需要高事務(wù)性,那么關(guān)系數(shù)據(jù)庫(SQL數(shù)據(jù)庫)是最佳選擇。SQL數(shù)據(jù)庫支持對(duì)事務(wù)原子性細(xì)粒度的控制,并且易于回滾事務(wù)。雖然非關(guān)系數(shù)據(jù)庫也可以使用事務(wù)操作,但在穩(wěn)定性方面無法和關(guān)系數(shù)據(jù)庫相比。非關(guān)系數(shù)據(jù)庫真正的價(jià)值是在操作的擴(kuò)展性和大數(shù)據(jù)處理方面。

總而言之,在計(jì)算機(jī)性能選擇上,有得必有失,在增加了響應(yīng)速度和并發(fā)的情況下,非關(guān)系數(shù)據(jù)庫和搜索引擎通常犧牲了一部分的數(shù)據(jù)安全性。

許多高級(jí)的Oracle DBA開玩笑稱Oracle為“只要磁盤沒有物理損壞,任何Oracle存儲(chǔ)的數(shù)據(jù)都可以從磁盤中重新拿回來,甚至有些輕微的物理損壞仍然可以拿到其中一部分?jǐn)?shù)據(jù)。”雖然只是一句玩笑話,但這確實(shí)是Oracle在一次次互聯(lián)網(wǎng)浪潮的沖擊之下仍然屹立不倒的原因之一,而這也恰恰是大部分非關(guān)系數(shù)據(jù)庫無法與之相比的地方之一。

2. 關(guān)系數(shù)據(jù)庫等級(jí)

大部分在校學(xué)生和工作2~3年的程序員經(jīng)常會(huì)提出這樣一個(gè)問題,即“在工作中對(duì)關(guān)系數(shù)據(jù)庫需要掌握到什么程度?”

這是一個(gè)比較常見的問題,但是因?yàn)閸徫徊煌褂玫年P(guān)系數(shù)據(jù)庫不同,所以對(duì)關(guān)系數(shù)據(jù)庫需要掌握的程度也不同。筆者按照“游戲等級(jí)”的方式,以MySQL為例,劃分了不同等級(jí)下對(duì)MySQL掌握的熟練度,如表1-4所示。

表1-4

續(xù)表

3. 常用的MySQL工具

(1)常用的性能基準(zhǔn)測試工具有sysbench和mysqlslap。

(2)對(duì)應(yīng)用程序進(jìn)行性能測試的常用工具是JMeter。

(3)對(duì)MySQL和服務(wù)器CPU等信息進(jìn)行性能監(jiān)控架構(gòu)可選擇Grafana + InfluxDB +Telegraf架構(gòu)或Prometheus + Grafana架構(gòu)。

(4)集群可選擇MyCAT。

(5)相關(guān)統(tǒng)計(jì)可選擇percona-toolkit。

(6)慢SQL查詢可選擇mysqldumpslow。

(7)分布式事務(wù)可選擇Fescar(Seata)。

(8)事務(wù)處理測試可選擇HammerDB。

(9)快速備份與恢復(fù)可選擇mysqlhotcopy。

(10)常規(guī)備份與恢復(fù)可選擇mysqldump。

(11)二進(jìn)制日志(binlog)解析工具可選擇Maxwell。

1.10.2 數(shù)據(jù)庫測試的具體內(nèi)容

(1)初始程序架構(gòu)時(shí),在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)與表結(jié)構(gòu)之后,應(yīng)對(duì)設(shè)計(jì)的表結(jié)構(gòu)與數(shù)據(jù)結(jié)構(gòu)進(jìn)行基準(zhǔn)性能測試,得到該套結(jié)構(gòu)的基準(zhǔn)信息。

(2)在對(duì)數(shù)據(jù)庫進(jìn)行主從復(fù)制、MyCAT集群等優(yōu)化之后,需要進(jìn)行適當(dāng)壓力的性能測試,以保證集群化后,MySQL單節(jié)點(diǎn)性能沒有被降低過多。

(3)在編碼結(jié)束之后應(yīng)對(duì)每條可能執(zhí)行的SQL語句執(zhí)行計(jì)劃解讀,確保執(zhí)行語句中不存在全表索引之類的操作。如果包含全表索引,則需增加索引或優(yōu)化SQL語句。

(4)應(yīng)當(dāng)對(duì)數(shù)據(jù)庫做業(yè)務(wù)存儲(chǔ)量測試,即測試當(dāng)存儲(chǔ)的數(shù)據(jù)量不同時(shí),應(yīng)用程序的返回時(shí)間為多少。此測試通常以應(yīng)用程序作為入口。

(5)需要對(duì)數(shù)據(jù)庫做疲勞測試,在應(yīng)用程序運(yùn)行過程中,是否因運(yùn)行時(shí)間過長而出現(xiàn)數(shù)據(jù)庫內(nèi)存泄漏的情況。

(6)應(yīng)當(dāng)對(duì)數(shù)據(jù)庫做災(zāi)備測試,即當(dāng)主從復(fù)制或相關(guān)集群架構(gòu)部署結(jié)束時(shí),需測試斷網(wǎng)、斷電情況下是否會(huì)進(jìn)行正常的災(zāi)備處理與響應(yīng)服務(wù)。

(7)應(yīng)當(dāng)對(duì)數(shù)據(jù)庫做安全測試,即賬號(hào)、密碼、權(quán)限、防火墻、弱密碼、脫敏等相關(guān)內(nèi)容是否設(shè)計(jì)得體,除防止別有用心的人滲透外,是否可以防止當(dāng)前用戶誤操作導(dǎo)致數(shù)據(jù)丟失等情況。

主站蜘蛛池模板: 桓台县| 周宁县| 华蓥市| 班玛县| 饶平县| 得荣县| 阿巴嘎旗| 宝丰县| 巴中市| 黄龙县| 武宣县| 上虞市| 建湖县| 云林县| 如皋市| 玉树县| 浏阳市| 科技| 东辽县| 镇江市| 将乐县| 遵化市| 西和县| 五大连池市| 洱源县| 遵义县| 乌兰县| 方正县| 绿春县| 芜湖县| 青神县| 赞皇县| 邳州市| 明溪县| 达日县| 大化| 成安县| 淮北市| 郑州市| 临武县| 池州市|