5.數(shù)據(jù)庫(kù)章(Mysql、Mongodb、Redis)

1.Mysql

1.1mysql存儲(chǔ)引擎

引擎查看:show engines


image.png

為什么有不同的引擎:
mysql中通過(guò)各種不同的技術(shù)引擎將數(shù)據(jù)存儲(chǔ)在文件或內(nèi)存中。這些技術(shù)使用不同的存儲(chǔ)、索引、鎖定方法 從而提供不同的功能和能力。通過(guò)選擇不同的引擎 你能獲得額外的速度或功能,從而改善你應(yīng)用的整體功能。

如何更改引擎:
不同的表可以使用不同的引擎
默認(rèn)引擎是innoDB。
1. 修改配置文件my.ini
2. 創(chuàng)建表的時(shí)候type指定
3. alter table type=InnoDB
查看修改:show table status from db; show create table table_name

引擎對(duì)比
常用到三個(gè)引擎:InnoDB、MyisAM、Memory
1.InnoDB(Mysql默認(rèn)的引擎)
InnoDB是一個(gè)事務(wù)型的數(shù)據(jù)引擎、支持行級(jí)鎖定和外鍵約束。
Innodb引擎提供了對(duì)數(shù)據(jù)庫(kù)ACID事務(wù)的支持。該引擎還提供了行級(jí)鎖和外鍵約束,它的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫(kù)系統(tǒng),它本身其實(shí)就是基于MySQL后臺(tái)的完整數(shù)據(jù)庫(kù)系統(tǒng),MySQL運(yùn)行時(shí)Innodb會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是該引擎不支持FULLTEXT類(lèi)型的索引(5.7已經(jīng)支持),而且它沒(méi)有保存表的行數(shù),當(dāng)SELECT COUNT(*) FROM TABLE時(shí)需要掃描全表。當(dāng)需要使用數(shù)據(jù)庫(kù)事務(wù)時(shí),該引擎當(dāng)然是首選。由于鎖的粒度更小,寫(xiě)操作不會(huì)鎖定全表,所以在并發(fā)較高時(shí),使用Innodb引擎會(huì)提升效率。但是使用行級(jí)鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表。
適用場(chǎng)景:
1)經(jīng)常更新的表,適合處理多重并發(fā)的更新請(qǐng)求。
2)支持事務(wù)。
3)可以從災(zāi)難中恢復(fù)(通過(guò)bin-log日志等)。
4)外鍵約束。只有他支持外鍵。
5)支持自動(dòng)增加列屬性auto_increment。

2. MyisAM
它不提供數(shù)據(jù)庫(kù)對(duì)事務(wù)對(duì)支持、不支持行級(jí)鎖和外鍵約束,因此在insert和update的時(shí)候會(huì)全表鎖導(dǎo)致效率低一些。
MyisAM獨(dú)立與操作系統(tǒng),引擎在創(chuàng)建表的時(shí)候會(huì)創(chuàng)建三個(gè)文件,一個(gè)是.frm文件用于存儲(chǔ)表的定義,一個(gè)是.MYD文件用于存儲(chǔ)表的數(shù)據(jù),另一個(gè)是.MYI文件,存儲(chǔ)的是索引。操作系統(tǒng)對(duì)大文件的操作是比較慢的,這樣將表分為三個(gè)文件,那么.MYD這個(gè)文件單獨(dú)來(lái)存放數(shù)據(jù)自然可以?xún)?yōu)化數(shù)據(jù)庫(kù)的查詢(xún)等操作。有索引管理和字段管理。MyISAM還使用一種表格鎖定的機(jī)制,來(lái)優(yōu)化多個(gè)并發(fā)的讀寫(xiě)操作,其代價(jià)是你需要經(jīng)常運(yùn)行OPTIMIZE TABLE命令,來(lái)恢復(fù)被更新機(jī)制所浪費(fèi)的空間

適用場(chǎng)景

1)不支持事務(wù)的設(shè)計(jì),但是并不代表著有事務(wù)操作的項(xiàng)目不能用MyIsam存儲(chǔ)引擎,可以在service層進(jìn)行根據(jù)自己的業(yè)務(wù)需求進(jìn)行相應(yīng)的控制。
2)不支持外鍵的表設(shè)計(jì)。
3)查詢(xún)速度很快,如果數(shù)據(jù)庫(kù)insert和update的操作比較少的話比較適用。
4)整天 對(duì)表進(jìn)行加鎖的場(chǎng)景。
5)MyISAM極度強(qiáng)調(diào)快速讀取操作。
6)MyIASM中存儲(chǔ)了表的行數(shù),于是SELECT COUNT(*) FROM TABLE時(shí)只需要直接讀取已經(jīng)保存好的值而不需要進(jìn)行全表掃描。如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作且不需要數(shù)據(jù)庫(kù)事務(wù)的支持,那么MyIASM也是很好的選擇。

缺點(diǎn):
就是不能在表?yè)p壞后恢復(fù)數(shù)據(jù)。(是不能主動(dòng)恢復(fù))

3. Memory(也叫HEAP)堆內(nèi)存
定義
使用存在內(nèi)存中的內(nèi)容來(lái)創(chuàng)建表。每個(gè)MEMORY表只實(shí)際對(duì)應(yīng)一個(gè)磁盤(pán)文件。MEMORY類(lèi)型的表訪問(wèn)非常得快,因?yàn)樗臄?shù)據(jù)是放在內(nèi)存中的,并且默認(rèn)使用HASH索引。

但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會(huì)丟失掉。 HEAP允許只駐留在內(nèi)存里的臨時(shí)表格。駐留在內(nèi)存里讓HEAP要比ISAM和MYISAM都快,但是它所管理的數(shù)據(jù)是不穩(wěn)定的,而且如果在關(guān)機(jī)之前沒(méi)有進(jìn)行保存,那么所有的數(shù)據(jù)都會(huì)丟失。在數(shù)據(jù)行被刪除的時(shí)候,HEAP也不會(huì)浪費(fèi)大量的空間。HEAP表格在你需要使用SELECT表達(dá)式來(lái)選擇和操控?cái)?shù)據(jù)的時(shí)候非常有用。

適用場(chǎng)景:
1)那些內(nèi)容變化不頻繁的代碼表,或者作為統(tǒng)計(jì)操作的中間結(jié)果表,便于高效地堆中間結(jié)果進(jìn)行分析并得到最終的統(tǒng)計(jì)結(jié)果。
2)目標(biāo)數(shù)據(jù)比較小,而且非常頻繁的進(jìn)行訪問(wèn),在內(nèi)存中存放數(shù)據(jù),如果太大的數(shù)據(jù)會(huì)造成內(nèi)存溢出??梢酝ㄟ^(guò)參數(shù)max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小。
3)數(shù)據(jù)是臨時(shí)的,而且必須立即可用得到,那么就可以放在內(nèi)存中。
4)存儲(chǔ)在Memory表中的數(shù)據(jù)如果突然間丟失的話也沒(méi)有太大的關(guān)系。

注意: Memory同時(shí)支持散列索引和B樹(shù)索引,B樹(shù)索引可以使用部分查詢(xún)和通配查詢(xún),也可以使用<,>和>=等操作符方便數(shù)據(jù)挖掘,散列索引相等的比較快但是對(duì)于范圍的比較慢很多。

特性要求:
1)要求存儲(chǔ)的數(shù)據(jù)是數(shù)據(jù)長(zhǎng)度不變的格式,比如,Blob和Text類(lèi)型的數(shù)據(jù)不可用(長(zhǎng)度不固定的)。
2)要記住,在用完表格之后就刪除表格。

https://blog.csdn.net/Jack__Frost/article/details/72904318

索引

索引:索引是一種幫助mysql高效的獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用數(shù)據(jù),這種結(jié)構(gòu)就是索引。

MySQL普遍使用B+tree實(shí)現(xiàn)其索引結(jié)構(gòu),B+tree是B-tree的一個(gè)變種,B是balance,使用B-tree結(jié)構(gòu)可以顯著減少定位記錄時(shí)所經(jīng)歷的中間過(guò)程,從而加快存取速度

B+tree.png

InnoDB索引:葉子節(jié)點(diǎn)存儲(chǔ)的是數(shù)據(jù)data
image.png

MyISAM索引:葉子節(jié)點(diǎn)存儲(chǔ)是數(shù)據(jù)的地址

image.png

Hash索引
通過(guò)hash函數(shù)將索引列值映射到對(duì)應(yīng)碼值,索引存儲(chǔ)的是數(shù)據(jù)地址

Hash.png

如果多個(gè)列的哈希值相同(hash沖突),索引會(huì)以鏈表的方式存放多個(gè)記錄指針到同一個(gè)哈希條目中去。

全文索引(fulltext)
通過(guò)關(guān)鍵字的匹配來(lái)進(jìn)行查詢(xún)過(guò)濾,那么就需要基于相似度的查詢(xún),而不是原來(lái)的精確數(shù)值比較。全文索引就是為這種場(chǎng)景設(shè)計(jì),全文索引在大量的數(shù)據(jù)面前,能比 like + % 快 N 倍
MySQL 5.6 以前的版本,只有 MyISAM 存儲(chǔ)引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存儲(chǔ)引擎均支持全文索引;
只有字段的數(shù)據(jù)類(lèi)型為 char、varchar、text 及其系列才可以建全文索引。

全文索引場(chǎng)景
和常用的模糊匹配使用 like + % 不同,全文索引有自己的語(yǔ)法格式,使用 match 和 against 關(guān)鍵字,比如
select * from fulltext_test
where match(content,tag) against('xxx xxx');

1)使用全文索引前,搞清楚版本支持情況;
2)全文索引比 like + % 快 N 倍,但是可能存在精度問(wèn)題(?);
3)如果需要全文索引的是大量數(shù)據(jù),建議先添加數(shù)據(jù),再創(chuàng)建索引;
4)對(duì)于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。

2.Mongodb和mysql對(duì)比

比較類(lèi)別 MongoDB Mysql
數(shù)據(jù)庫(kù)模型 非關(guān)系型 關(guān)系型
存儲(chǔ)方式 虛擬內(nèi)存+磁盤(pán)持久化 磁盤(pán)
架構(gòu)特點(diǎn) 副本集分片實(shí)現(xiàn)高可用 單點(diǎn)、主從、集群等
數(shù)據(jù)處理 基于內(nèi)存、將熱點(diǎn)數(shù)據(jù)存在物理內(nèi)存中實(shí)現(xiàn)高速讀寫(xiě) 不同引擎有不同特點(diǎn)
成熟度 新興數(shù)據(jù)庫(kù)成熟度較低 成熟體系
廣泛度 完善開(kāi)源使用越來(lái)越廣 開(kāi)源數(shù)據(jù)庫(kù)使用越來(lái)越廣
事務(wù)性 僅支持單文檔事務(wù)操作,弱一致性 支持事務(wù)操作

一、關(guān)系型數(shù)據(jù)庫(kù)-MySQL
1、在不同的引擎上有不同的存儲(chǔ)方式。
2、查詢(xún)語(yǔ)句是使用傳統(tǒng)的sql語(yǔ)句,擁有較為成熟的體系,成熟度很高。
3、開(kāi)源數(shù)據(jù)庫(kù)的份額在不斷增加,mysql的份額頁(yè)在持續(xù)增長(zhǎng)。
4、缺點(diǎn)就是在海量數(shù)據(jù)處理的時(shí)候效率會(huì)顯著變慢。

二、非關(guān)系型數(shù)據(jù)庫(kù)-MongoDB
非關(guān)系型數(shù)據(jù)庫(kù)(nosql ),屬于文檔型數(shù)據(jù)庫(kù)。先解釋一下文檔的數(shù)據(jù)庫(kù),即可以存放xml、json、bson類(lèi)型系那個(gè)的數(shù)據(jù)。這些數(shù)據(jù)具備自述性,呈現(xiàn)分層的樹(shù)狀數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。

1、存儲(chǔ)方式:虛擬內(nèi)存+持久化。
2、查詢(xún)語(yǔ)句:是獨(dú)特的MongoDB的查詢(xún)方式。
3、適合場(chǎng)景:事件的記錄,內(nèi)容管理或者博客平臺(tái)等等。
4、架構(gòu)特點(diǎn):可以通過(guò)副本集,以及分片來(lái)實(shí)現(xiàn)高可用。
5、數(shù)據(jù)處理:數(shù)據(jù)是存儲(chǔ)在硬盤(pán)上的,只不過(guò)需要經(jīng)常讀取的數(shù)據(jù)會(huì)被加載到內(nèi)存中,將數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,從而達(dá)到高速讀寫(xiě)。
6、成熟度與廣泛度:新興數(shù)據(jù)庫(kù),成熟度較低,Nosql數(shù)據(jù)庫(kù)中最為接近關(guān)系型數(shù)據(jù)庫(kù),比較完善的DB之一,適用人群不斷在增長(zhǎng)。

Mongodb優(yōu)勢(shì):

  1. 快速 :熱點(diǎn)數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,使讀寫(xiě)非??焖?gòu)亩岣吡苏w性能
  2. 高擴(kuò)展性:MongoDB高可用與集群框架擁有十分高的擴(kuò)展性,通過(guò)物理機(jī)的增加以及sharding增加,MongoDB的擴(kuò)展達(dá)到十分驚人的底部
  3. 自身的failover機(jī)制:mongoDB的副本集配置中,當(dāng)主庫(kù)遇到問(wèn)題,無(wú)法繼續(xù)提供服務(wù)時(shí),副本集將選舉一個(gè)新的主庫(kù)來(lái)繼續(xù)提供服務(wù)
  4. json的存儲(chǔ)格式,json與bson存儲(chǔ)格式十分適合文檔格式的存儲(chǔ)與查詢(xún)

劣勢(shì):
1、 不支持事務(wù)操作(4.0開(kāi)始已經(jīng)支持)。MongoDB本身沒(méi)有自帶事務(wù)機(jī)制,若需要在MongoDB中實(shí)現(xiàn)事務(wù)機(jī)制,需通過(guò)一個(gè)額外的表,從邏輯上自行實(shí)現(xiàn)事務(wù)。
2、 應(yīng)用經(jīng)驗(yàn)少,由于NoSQL興起時(shí)間短,應(yīng)用經(jīng)驗(yàn)相比關(guān)系型數(shù)據(jù)庫(kù)較少。
3、MongoDB占用空間過(guò)大。

mongo基礎(chǔ):
https://www.cnblogs.com/clsn/p/8214194.html#auto-id-14

MongoDB水平擴(kuò)展:
https://www.infoq.cn/article/scale-out-mongodb

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容