原創(chuàng)不易,轉(zhuǎn)載請標(biāo)明地址,或者直接附上我的博客首頁https://georgedage.blog.csdn.net/
文中有些并沒有解釋過于清楚,本篇更適合有基礎(chǔ)的同學(xué)閱讀,思考,思考,思考。
千億級(jí)實(shí)時(shí)搜索,要滿足的條件
》高并發(fā),要能支持百萬級(jí)以上的并發(fā)
》實(shí)時(shí)性,響應(yīng)時(shí)間不超過3秒
那么我們考慮,這樣的情況下,使用數(shù)據(jù)庫是否可以?
Mysql / pgsql / db2 / Oracle
首先先說出我們的結(jié)論,那就是不可以,那么為什么呢?請聽我細(xì)細(xì)給你叨嘮,本篇博客通過由淺入深,并且根據(jù)一個(gè)個(gè)問題去探討,或許你看完之后會(huì)有一點(diǎn)想法,不過如果有不妥之處,歡迎指出。
我們經(jīng)常瀏覽博客,新聞,商品等,存儲(chǔ)這些數(shù)據(jù)的表應(yīng)當(dāng)具有什么樣的字段呢?
提出問題:
在數(shù)據(jù)庫中如何做到下面的查詢?以新聞表為例
或許對于稍微掌握點(diǎn)數(shù)據(jù)庫知識(shí)的同僚們,這些都不是問題!
那么,請看問題二!
當(dāng)數(shù)據(jù)量變大時(shí),這四個(gè)查詢都變慢了,該如何優(yōu)化?
我們都知道,數(shù)據(jù)庫的常用數(shù)據(jù)庫優(yōu)化方法為:
》建索引
》分區(qū)表
由此提出問題三。
建索引對“查詢標(biāo)題與釣魚島有關(guān)的新聞”和“查詢與蒼老師有 關(guān)的新聞”有效果嗎?
或許對索引有點(diǎn)基本概念的同僚們,會(huì)想,沒關(guān)系呀。
嗯,好,那我問你,為什么呢?
(⊙o⊙)…(⊙o⊙)…(⊙o⊙)…
所以我們需要理解索引的原理是什么?
索引的原理是什么
即: 對列值創(chuàng)建排序存儲(chǔ),數(shù)據(jù)結(jié)構(gòu)={列值、行地址}。在有序數(shù)據(jù)列表中就可以利用二分查找快速找到要查找的行的地址,再根據(jù)地址直接取行數(shù)據(jù)。
或許這樣看會(huì)有點(diǎn)抽象,這里我們可以補(bǔ)充一下自己的基礎(chǔ)知識(shí),當(dāng)然也是面試中經(jīng)常問到的。
數(shù)組,鏈表,樹,二叉樹,紅黑樹,mysql的b+tree
對于b+tree:
b+tree,葉子存儲(chǔ)數(shù)據(jù),節(jié)點(diǎn)關(guān)鍵值
這里補(bǔ)充一道面試題:大劍無鋒之簡單說一下聚簇索引和非聚簇索引?【面試推薦】
然后根據(jù)索引的原理進(jìn)一步思考索引!
索引的排序,是怎么排的?
》數(shù)值列
》時(shí)間列
》文本列
這里相信學(xué)過語言基礎(chǔ)的都知道,編碼字符集的應(yīng)用。
就像漢字,在計(jì)算機(jī)中的存儲(chǔ)也是二進(jìn)制,所以也就是我們常說的字典序。詳細(xì)這里不做過多的闡述。
在新聞標(biāo)題列上建索引,當(dāng)我們查詢標(biāo)題=‘釣魚島’ ,數(shù)據(jù)庫會(huì)怎么去查?
但是我們查詢的是這樣一個(gè)字段呢?
或者說數(shù)據(jù)庫中有這樣一個(gè)字段,“中國擁有釣魚島”
如果走索引,這個(gè)是會(huì)被忽視的查詢不到,所以需要全局進(jìn)行查詢。
【補(bǔ)充】這里我在網(wǎng)上看到有說到覆蓋索引可以解決類似問題,不過這個(gè)我并沒有進(jìn)行研究呢,后續(xù)補(bǔ)上!
如果要對查詢出來的結(jié)果進(jìn)行相關(guān)度排名,數(shù)據(jù)庫能否做到?

如果要對搜索的新聞字段設(shè)置不同的權(quán)重,比如新聞標(biāo)題中包含這三個(gè)關(guān)鍵字的新聞的
相關(guān)性就遠(yuǎn)高于新聞內(nèi)容中包含這三個(gè)字。數(shù)據(jù)庫能否做到?
最后我們得出結(jié)論
結(jié)論:
數(shù)據(jù)庫適合結(jié)構(gòu)化數(shù)據(jù)的精確查詢,而不適合半結(jié)構(gòu)化、非結(jié)構(gòu)化數(shù)據(jù)的模糊查詢及靈活搜索(特別是數(shù)據(jù)量大時(shí)),無法提供想要的實(shí)時(shí)性。
【補(bǔ)充】
