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

1.Mysql

1.1mysql存儲引擎

引擎查看:show engines


image.png

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

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

引擎對比
常用到三個引擎:InnoDB耿焊、MyisAM揪惦、Memory
1.InnoDB(Mysql默認(rèn)的引擎)
InnoDB是一個事務(wù)型的數(shù)據(jù)引擎、支持行級鎖定和外鍵約束罗侯。
Innodb引擎提供了對數(shù)據(jù)庫ACID事務(wù)的支持器腋。該引擎還提供了行級鎖和外鍵約束,它的設(shè)計目標(biāo)是處理大容量數(shù)據(jù)庫系統(tǒng)钩杰,它本身其實就是基于MySQL后臺的完整數(shù)據(jù)庫系統(tǒng)纫塌,MySQL運行時Innodb會在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引讲弄。但是該引擎不支持FULLTEXT類型的索引(5.7已經(jīng)支持)措左,而且它沒有保存表的行數(shù),當(dāng)SELECT COUNT(*) FROM TABLE時需要掃描全表垂睬。當(dāng)需要使用數(shù)據(jù)庫事務(wù)時媳荒,該引擎當(dāng)然是首選抗悍。由于鎖的粒度更小,寫操作不會鎖定全表钳枕,所以在并發(fā)較高時缴渊,使用Innodb引擎會提升效率。但是使用行級鎖也不是絕對的鱼炒,如果在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍衔沼,InnoDB表同樣會鎖全表。
適用場景:
1)經(jīng)常更新的表昔瞧,適合處理多重并發(fā)的更新請求指蚁。
2)支持事務(wù)。
3)可以從災(zāi)難中恢復(fù)(通過bin-log日志等)自晰。
4)外鍵約束凝化。只有他支持外鍵。
5)支持自動增加列屬性auto_increment酬荞。

2. MyisAM
它不提供數(shù)據(jù)庫對事務(wù)對支持搓劫、不支持行級鎖和外鍵約束,因此在insert和update的時候會全表鎖導(dǎo)致效率低一些混巧。
MyisAM獨立與操作系統(tǒng)枪向,引擎在創(chuàng)建表的時候會創(chuàng)建三個文件,一個是.frm文件用于存儲表的定義咧党,一個是.MYD文件用于存儲表的數(shù)據(jù)秘蛔,另一個是.MYI文件,存儲的是索引傍衡。操作系統(tǒng)對大文件的操作是比較慢的深员,這樣將表分為三個文件,那么.MYD這個文件單獨來存放數(shù)據(jù)自然可以優(yōu)化數(shù)據(jù)庫的查詢等操作聪舒。有索引管理和字段管理辨液。MyISAM還使用一種表格鎖定的機(jī)制虐急,來優(yōu)化多個并發(fā)的讀寫操作箱残,其代價是你需要經(jīng)常運行OPTIMIZE TABLE命令,來恢復(fù)被更新機(jī)制所浪費的空間

適用場景

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

缺點:
就是不能在表損壞后恢復(fù)數(shù)據(jù)。(是不能主動恢復(fù))

3. Memory(也叫HEAP)堆內(nèi)存
定義
使用存在內(nèi)存中的內(nèi)容來創(chuàng)建表抓艳。每個MEMORY表只實際對應(yīng)一個磁盤文件触机。MEMORY類型的表訪問非常得快,因為它的數(shù)據(jù)是放在內(nèi)存中的玷或,并且默認(rèn)使用HASH索引儡首。

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

適用場景:
1)那些內(nèi)容變化不頻繁的代碼表迈勋,或者作為統(tǒng)計操作的中間結(jié)果表炬灭,便于高效地堆中間結(jié)果進(jìn)行分析并得到最終的統(tǒng)計結(jié)果。
2)目標(biāo)數(shù)據(jù)比較小靡菇,而且非常頻繁的進(jìn)行訪問重归,在內(nèi)存中存放數(shù)據(jù),如果太大的數(shù)據(jù)會造成內(nèi)存溢出厦凤”撬保可以通過參數(shù)max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小较鼓。
3)數(shù)據(jù)是臨時的椎木,而且必須立即可用得到,那么就可以放在內(nèi)存中博烂。
4)存儲在Memory表中的數(shù)據(jù)如果突然間丟失的話也沒有太大的關(guān)系香椎。

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

特性要求:
1)要求存儲的數(shù)據(jù)是數(shù)據(jù)長度不變的格式躺率,比如玛界,Blob和Text類型的數(shù)據(jù)不可用(長度不固定的)万矾。
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實現(xiàn)其索引結(jié)構(gòu)们颜,B+tree是B-tree的一個變種,B是balance猎醇,使用B-tree結(jié)構(gòu)可以顯著減少定位記錄時所經(jīng)歷的中間過程窥突,從而加快存取速度

B+tree.png

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

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

image.png

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

Hash.png

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

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

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

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

2.Mongodb和mysql對比

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

一翔横、關(guān)系型數(shù)據(jù)庫-MySQL
1、在不同的引擎上有不同的存儲方式梗搅。
2禾唁、查詢語句是使用傳統(tǒng)的sql語句,擁有較為成熟的體系无切,成熟度很高荡短。
3、開源數(shù)據(jù)庫的份額在不斷增加哆键,mysql的份額頁在持續(xù)增長掘托。
4、缺點就是在海量數(shù)據(jù)處理的時候效率會顯著變慢籍嘹。

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

1祝辣、存儲方式:虛擬內(nèi)存+持久化。
2切油、查詢語句:是獨特的MongoDB的查詢方式蝙斜。
3、適合場景:事件的記錄澎胡,內(nèi)容管理或者博客平臺等等孕荠。
4、架構(gòu)特點:可以通過副本集攻谁,以及分片來實現(xiàn)高可用稚伍。
5、數(shù)據(jù)處理:數(shù)據(jù)是存儲在硬盤上的戚宦,只不過需要經(jīng)常讀取的數(shù)據(jù)會被加載到內(nèi)存中个曙,將數(shù)據(jù)存儲在物理內(nèi)存中,從而達(dá)到高速讀寫受楼。
6垦搬、成熟度與廣泛度:新興數(shù)據(jù)庫呼寸,成熟度較低,Nosql數(shù)據(jù)庫中最為接近關(guān)系型數(shù)據(jù)庫猴贰,比較完善的DB之一对雪,適用人群不斷在增長。

Mongodb優(yōu)勢:

  1. 快速 :熱點數(shù)據(jù)存儲在物理內(nèi)存中米绕,使讀寫非成罚快速從而提高了整體性能
  2. 高擴(kuò)展性:MongoDB高可用與集群框架擁有十分高的擴(kuò)展性,通過物理機(jī)的增加以及sharding增加栅干,MongoDB的擴(kuò)展達(dá)到十分驚人的底部
  3. 自身的failover機(jī)制:mongoDB的副本集配置中迈套,當(dāng)主庫遇到問題,無法繼續(xù)提供服務(wù)時非驮,副本集將選舉一個新的主庫來繼續(xù)提供服務(wù)
  4. json的存儲格式交汤,json與bson存儲格式十分適合文檔格式的存儲與查詢

劣勢:
1、 不支持事務(wù)操作(4.0開始已經(jīng)支持)劫笙。MongoDB本身沒有自帶事務(wù)機(jī)制芙扎,若需要在MongoDB中實現(xiàn)事務(wù)機(jī)制,需通過一個額外的表填大,從邏輯上自行實現(xiàn)事務(wù)戒洼。
2、 應(yīng)用經(jīng)驗少允华,由于NoSQL興起時間短圈浇,應(yīng)用經(jīng)驗相比關(guān)系型數(shù)據(jù)庫較少。
3靴寂、MongoDB占用空間過大磷蜀。

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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市百炬,隨后出現(xiàn)的幾起案子褐隆,更是在濱河造成了極大的恐慌,老刑警劉巖剖踊,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶弃,死亡現(xiàn)場離奇詭異,居然都是意外死亡德澈,警方通過查閱死者的電腦和手機(jī)歇攻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門耕突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赡磅,“玉大人,你說我怎么就攤上這事题篷。” “怎么了斧散?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵供常,是天一觀的道長摊聋。 經(jīng)常有香客問我鸡捐,道長,這世上最難降的妖魔是什么麻裁? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任箍镜,我火速辦了婚禮,結(jié)果婚禮上煎源,老公的妹妹穿的比我還像新娘色迂。我一直安慰自己,他們只是感情好手销,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布歇僧。 她就那樣靜靜地躺著,像睡著了一般锋拖。 火紅的嫁衣襯著肌膚如雪诈悍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天兽埃,我揣著相機(jī)與錄音侥钳,去河邊找鬼。 笑死柄错,一個胖子當(dāng)著我的面吹牛舷夺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播售貌,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼给猾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颂跨?” 一聲冷哼從身側(cè)響起敢伸,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毫捣,沒想到半個月后详拙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蔓同,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年饶辙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斑粱。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弃揽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矿微,我是刑警寧澤痕慢,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站涌矢,受9級特大地震影響掖举,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娜庇,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一塔次、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧名秀,春花似錦励负、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汁掠,卻和暖如春略吨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背调塌。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工晋南, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羔砾。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓负间,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姜凄。 傳聞我的和親對象是個殘疾皇子政溃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354