關(guān)于查詢
查詢數(shù)據(jù)分為精確查找和模糊查找
- 精確查找:對(duì)于精確查找,我們都非常熟悉愈犹,就是這個(gè)值必須等于這個(gè)條件。比如我們常用的數(shù)據(jù)庫(kù)查詢中:
select * from user_info where user_id = ?- 模糊查找:對(duì)于模糊查找勋颖,我們需要查找的范圍就是結(jié)果中的某個(gè)值必須包含這個(gè)條件饭玲。平時(shí)我們?cè)谝粋€(gè)文檔中查找某個(gè)
單詞怪得,這就是模糊查找。
對(duì)于普通的查找蚕断,我們是從一個(gè)文檔中亿乳,一個(gè)一個(gè)的去遍歷匹配葛假。比如我們要從10w個(gè)數(shù)據(jù)中滋恬,
查找包含字符串“abc”的恢氯,那就相當(dāng)?shù)寐狻H绻@些數(shù)據(jù)在數(shù)據(jù)庫(kù)中敢靡,我們通常會(huì)建立索引,去優(yōu)化查詢速度赶站。對(duì)于比較大的文本內(nèi)容亲怠,
我們通常使用全文檢索的方式团秽∠扒冢總結(jié):對(duì)于優(yōu)化查詢焙格,我們使用數(shù)據(jù)庫(kù)建立索引和使用全文檢索图毕。
關(guān)于數(shù)據(jù)庫(kù)建立索引
為了優(yōu)化查詢速度,我們會(huì)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)建立索引眷唉。在mysql數(shù)據(jù)庫(kù)中予颤,有兩種索引方法:Btree和Hash
這兩種方式為什么會(huì)加速查詢囤官。兩種方式有什么區(qū)別,這是我們必須了解的蛤虐。
- Hash方法建立索引
Hash党饮,就是我們所謂的散列表,它的存儲(chǔ)是key-value結(jié)構(gòu)的驳庭。當(dāng)我們對(duì)數(shù)據(jù)建立索引后刑顺,我們的每個(gè)數(shù)據(jù)都會(huì)有一個(gè)對(duì)于的Hash值。當(dāng)我們?nèi)ゲ檎覕?shù)據(jù)的時(shí)候饲常,只要取條件
的Hash值即可蹲堂。數(shù)據(jù)存儲(chǔ)的位置通過(guò)Hash值快速找到柒竞。我們也從Hash算法的原理中可以看到,這種索引方式比較適合精確查找。下面舉個(gè)簡(jiǎn)單的Hash查找的例子:
HashCode = 2x+1
|hashcode|value|
|----|----|
|11|5|
|101|50|
|121|60|
...
假設(shè)庫(kù)中有大量的數(shù)據(jù),此時(shí)我們的搜索條件是60,我們?nèi)〉肏ashCode = 2*60+1 = 121茸苇,然后拿著121去庫(kù)中尋找其存放的位置。這樣就非常的速度。當(dāng)然這只是一個(gè)簡(jiǎn)單的Hash哭靖。
對(duì)于優(yōu)化散列表,減少?zèng)_突這些我們這里就不做討論铺坞。
如果想實(shí)現(xiàn)以下Hash算法整個(gè)過(guò)程,可以看下此博客哈希算法的Java實(shí)現(xiàn)
- Btree方法建立索引
看到這個(gè)名字,我想大學(xué)里面學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)這門課程的都會(huì)首先想到數(shù)據(jù)結(jié)構(gòu)中的樹這個(gè)概念。用于搜索,我們肯定會(huì)想到二叉樹凝颇。不管數(shù)據(jù)庫(kù)索引它用的是哪種樹瘪弓,
它肯定是一種基于二叉搜索樹優(yōu)化的樹袱饭,所以我們只要了解二叉搜索樹這個(gè)結(jié)構(gòu)算法晾虑,我們就可以知道為什么使用Btree方式建立索引會(huì)加速查找了。它把原來(lái)的時(shí)間復(fù)雜度從
O(n) 轉(zhuǎn)變成了 O(log2(n))继找。因?yàn)槎鏄涞闹行虮闅v的結(jié)果就是根據(jù)key值排序的列表幻锁,所以這種方式對(duì)于范圍查找是非常合適的。
如果想實(shí)現(xiàn)以下二叉搜索樹的建立和查找的整個(gè)過(guò)程,可以看下此博客二叉搜索樹的Java實(shí)現(xiàn)
關(guān)于全文檢索
對(duì)于大偏的文檔,使用數(shù)據(jù)庫(kù)建立索引就非常不合適了。此時(shí)我們會(huì)建立全文索引入偷,而建立全文索引体捏,有正排索引和倒排索引
兩者的區(qū)別從名字上就可以看出來(lái)。
- 正排索引:通過(guò)文章查找關(guān)鍵詞
- 倒排索引:通過(guò)關(guān)鍵詞查找文章
對(duì)于正排索引薄霜,也就是我們一般得搜索方式否副,對(duì)所有文章遍歷,查找包含關(guān)鍵詞得文章。而倒排索引呢纽乱,是給每個(gè)關(guān)鍵詞對(duì)應(yīng)匹配文檔敛熬,建立好索引夕吻。當(dāng)你查找得時(shí)候稚矿,這些關(guān)鍵詞在
哪些文檔出現(xiàn)過(guò)朱灿,出現(xiàn)得次數(shù)侣灶,出現(xiàn)得位置煞檩,一目了然注暗。倒排索引的解讀