3.2.索引
索引是特殊的數(shù)據(jù)結(jié)構(gòu)号枕,索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,建立索引陨享,通常能夠極大的提高查詢的效率葱淳,如果沒(méi)有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄抛姑,這種掃描全集合的查詢效率是非常低的赞厕,特別是在數(shù)據(jù)量特別大的時(shí)候,話費(fèi)的時(shí)間就非常的多
舉個(gè)例子:目前我的一個(gè)集合中有170多萬(wàn)條數(shù)據(jù)定硝,我們?cè)跊](méi)有建立索引的情況下測(cè)試一下查詢時(shí)間
db.course.find({"name": "mongodb入門8888"}).explain("executionStats")
執(zhí)行時(shí)間:
接下來(lái)皿桑,我們創(chuàng)建索引:
//語(yǔ)法: db.集合名稱.createIndex({})
db.course.createIndex({name:1})
createIndex方法中,name表示查詢的字段蔬啡,1表示升序诲侮,-1表示降序
創(chuàng)建好索引后,我們?cè)俅螆?zhí)行查詢
db.course.find({"name": "mongodb入門8888"}).explain("executionStats")
以下是執(zhí)行時(shí)間:
#3.3.關(guān)系型數(shù)據(jù)庫(kù)中表的關(guān)系
#3.3.1.一對(duì)一關(guān)系
一對(duì)一的關(guān)系比較簡(jiǎn)單箱蟆,例如:一個(gè)人只有一張身份證沟绪,一張身份證只對(duì)應(yīng)一個(gè)人
數(shù)據(jù)庫(kù)中表關(guān)系舉例:
一張user表對(duì)應(yīng)一張driver表,意味著我們可以通過(guò)user表中的uid去查詢driver表中和這個(gè)uid相同的這個(gè)人的駕駛證信息
#3.3.2.一對(duì)多關(guān)系
一對(duì)多的關(guān)系簡(jiǎn)單的說(shuō)就是一個(gè)對(duì)應(yīng)多個(gè)空猜,例如:一個(gè)母親可以有多個(gè)兒女绽慈,但是每個(gè)兒女只對(duì)應(yīng)著一個(gè)親生母親
數(shù)據(jù)庫(kù)中表關(guān)系舉例:
在上面這種應(yīng)用場(chǎng)景中,一張category表和goods表關(guān)聯(lián)辈毯,關(guān)系為一對(duì)多關(guān)系坝疼,一個(gè)分類下面有多種商品,一種商品只放入一個(gè)分類谆沃,我們可以根據(jù)category中的分類id去goods表中查詢出當(dāng)前分類下到底有多少商品钝凶,同時(shí)也可以用goods表中的cate_id來(lái)查詢出當(dāng)前分類的一些信息
#3.3.3.多對(duì)多關(guān)系
多對(duì)多關(guān)系舉例:一個(gè)學(xué)生可以選擇多門課程學(xué)習(xí),例如管毙,語(yǔ)文腿椎、數(shù)學(xué)桌硫、計(jì)算機(jī)夭咬,同時(shí)一門課程也可以有多個(gè)學(xué)生來(lái)學(xué)習(xí),例如铆隘,數(shù)學(xué)課程有50人學(xué)習(xí)卓舵,英語(yǔ)課程有100人學(xué)習(xí)等
數(shù)據(jù)庫(kù)中表關(guān)系舉例:
多對(duì)多關(guān)系在數(shù)據(jù)庫(kù)中通常需要第三張表來(lái)存儲(chǔ)對(duì)應(yīng)關(guān)系,上面的圖中膀钠,我們使用student_course來(lái)存儲(chǔ)關(guān)系掏湾,在這張表中裹虫,sid和cid分別是學(xué)生表中的id和課程表中的id,當(dāng)我們想知道一個(gè)學(xué)生選擇了多少門課程的時(shí)候融击,我們只需要在student_course表中筑公,根據(jù)sid來(lái)查詢出對(duì)應(yīng)的cid就可以了