數(shù)據(jù)存儲(chǔ)的基本概念
傳統(tǒng)的存儲(chǔ)數(shù)據(jù)方式,是把數(shù)據(jù)放到一個(gè)文件中,存放在磁盤(pán)上。當(dāng)程序要用時(shí),cpu會(huì)把數(shù)據(jù)加載到內(nèi)核內(nèi)存,然后內(nèi)核內(nèi)存將數(shù)據(jù)復(fù)制到程序內(nèi)存。程序進(jìn)行調(diào)用
當(dāng)數(shù)據(jù)文件很大時(shí),幾百個(gè)G。此時(shí)硬件資源不足以支持調(diào)用整個(gè)數(shù)據(jù)文件。而且我們的程序可能就調(diào)用整個(gè)數(shù)據(jù)中的一行數(shù)據(jù)。此時(shí)我們就需要一個(gè)特定的數(shù)據(jù)存儲(chǔ)系統(tǒng),才幫助我們的應(yīng)用程序來(lái)取得它調(diào)用的一條數(shù)據(jù)。即數(shù)據(jù)存儲(chǔ)系統(tǒng)
MySQL 結(jié)構(gòu)
MySQL是一個(gè)關(guān)系型的數(shù)據(jù)存儲(chǔ)系統(tǒng)。主要存儲(chǔ)關(guān)系型數(shù)據(jù),有主鍵,外鍵,唯一鍵的約束,有事務(wù)
MySQL是一整套的系統(tǒng)。需要給前端提供一個(gè)socket遠(yuǎn)程連接的端口,
當(dāng)要存儲(chǔ)或者查詢(xún)數(shù)據(jù)時(shí),它需要給外界提供一個(gè)接口。供其查詢(xún)和修改,即就是SQL語(yǔ)句。MySQL的數(shù)據(jù)也要以文件的方式存儲(chǔ)在磁盤(pán)上,它需要個(gè)中間件。即把磁盤(pán)上的文件可以以最快和最節(jié)省資源,最優(yōu)的方式提供給前端程序。也要把前端程序,要存儲(chǔ)的數(shù)據(jù),存儲(chǔ)到磁盤(pán)上。因此,此中間件稱(chēng)為存儲(chǔ)引擎

Socket: 提供遠(yuǎn)程連接
SQL語(yǔ)句查詢(xún)接口: 跟linux的bash差不多,它是一個(gè)解釋器來(lái)識(shí)別我們輸入的SQL語(yǔ)句,是否符合語(yǔ)法,并調(diào)用MySQL的函數(shù)來(lái)進(jìn)行執(zhí)行。如果寫(xiě)了一堆SQL語(yǔ)句,MySQL稱(chēng)為存儲(chǔ)過(guò)程。而在bash中稱(chēng)為腳本
存儲(chǔ)引擎: 相當(dāng)于中間件,把程序要存儲(chǔ)的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,并寫(xiě)到磁盤(pán)上。把磁盤(pán)上的數(shù)據(jù),進(jìn)行轉(zhuǎn)換展示給前端程序
MySQL 如何工作
如果MySQL中存在大量數(shù)據(jù),如何高效的提供服務(wù)?
MySQL采用索引方式來(lái)提供服務(wù)。索引就是,把MySQL中的每一行數(shù)據(jù),提取一部分,單獨(dú)的放到一張表中。當(dāng)程序查詢(xún)時(shí),首先查詢(xún)索引。找到索引,然后去找對(duì)應(yīng)的數(shù)據(jù)。幾次查詢(xún)即可找到數(shù)據(jù)。無(wú)需遍歷整個(gè)表。它采用的是Btree數(shù)索引,一般會(huì)有2次索引頭遍歷。根據(jù)實(shí)際情況去。索引上面再加索引

MySQL索引相當(dāng)于字典前面的筆畫(huà)查詢(xún)
優(yōu)點(diǎn): 能夠加速查詢(xún),增加查詢(xún)效率
缺點(diǎn):每進(jìn)行數(shù)據(jù)的一次修改,就相當(dāng)于修改了索引和數(shù)據(jù)兩塊區(qū)域。即增加了IO,MySQL索引是按照順序排序。如果修改的數(shù)據(jù),打亂了索引的順序,還需要對(duì)索引進(jìn)行重新排序
如果數(shù)據(jù)量龐大,我們還要對(duì)數(shù)據(jù)庫(kù)進(jìn)行垂直分庫(kù)和水平分表
因?yàn)镸ySQL是關(guān)系型數(shù)據(jù)庫(kù),有主鍵,外鍵,唯一鍵等各種約束。如果插入一條數(shù)據(jù),MySQL首先會(huì)進(jìn)行查詢(xún)??床迦氲臄?shù)據(jù),存不存在主鍵沖突,如果不存在則插入。相對(duì)應(yīng)的修改和刪除也是如此。從廣義來(lái)說(shuō),無(wú)論MySQL做
垂直分庫(kù): 拆分?jǐn)?shù)據(jù)庫(kù)實(shí)例,把一個(gè)實(shí)例上的多個(gè)數(shù)據(jù)庫(kù),分別部署到多個(gè)實(shí)例上
水平分表: 把一張大表,進(jìn)行分片(shards)。
一般水平分表后,數(shù)據(jù)庫(kù)前面會(huì)有一個(gè)路由機(jī)器,來(lái)調(diào)度前面的請(qǐng)求,進(jìn)行修改數(shù)據(jù)庫(kù)。如果查詢(xún)的話(huà),水平分片后表不會(huì)滿(mǎn)足。因?yàn)椴樵?xún)會(huì)查詢(xún)每一個(gè)分片,然后對(duì)每一個(gè)分片查詢(xún)的結(jié)果再次進(jìn)行聚合查詢(xún)。非常浪費(fèi)性能和時(shí)間。一般此時(shí),系統(tǒng)中會(huì)有專(zhuān)門(mén)的大數(shù)據(jù)系統(tǒng)來(lái)處理查詢(xún)操作。
水平分表,一般是前端路由器,跟據(jù)某一個(gè)字段,對(duì)分片的數(shù)量進(jìn)行hash計(jì)算,然后確定在哪一個(gè)分片上進(jìn)行修改操作。水平分表,是直接把表的數(shù)據(jù),進(jìn)行分片。插入不是按照后端服務(wù)器的數(shù)量進(jìn)行hash計(jì)算取模,因?yàn)楹蠖朔?wù)器的數(shù)量的增加和修改,都會(huì)直接造hash 取模的結(jié)果不一樣,從而要重新進(jìn)行數(shù)據(jù)分布。所以直接按照分片數(shù)量進(jìn)行取模,當(dāng)增加或者減少后端數(shù)據(jù)庫(kù)服務(wù)器時(shí),只需要?jiǎng)討B(tài)把分片復(fù)制到相對(duì)應(yīng)的服務(wù)器上即可(即就是排干模式)。冗余的話(huà),也是對(duì)分片進(jìn)行冗余。此功能MySQL需要借助第三方插件完成,而NoSQL則原生支持