mysql如何針對很長的字符串建立索引

今天面試小米,面試官出了一道題,一個表有urlrank兩個字段,其中url代表的是鏈接,值唯一,如www.baidu.com/1/2,rank代表的是這個鏈接的權重,範圍在(1,10)。假如這張表中有1w條數據,現在要求給定一個url,如何查詢到它的rank值。

很明顯,這道題不是考sql語句的 。這道題考察的是索引。根據url,來查詢rank,爲了避免權標掃描,只能對url建立索引。可現在的問題時,這個url很長,如果直接對url建立索引,那麼索引的維護是個很耗時的操作。因此,這道題考察的是如何對一個很長的字符串建立索引

方法1 :構造hash索引

既然url很長不適合建立索引,那麼有沒有可能把url轉換成一個整數或者較短的字符串,然後對轉換後的字段建立索引呢?這是我面試時首先想到的,利用hash函數,將url轉換成一個整數。但這樣做會有一個問題,hash衝突。換句話說,對於不同的url,利用hash函數轉換後可能會得到同一個hash值。然後我就卡在這了,不知道怎麼處理了。之後一直在考慮如何構造一個不產生hash衝突的函數。(很傻逼,對不對)。苦苦思考,無果而終,面試官就在旁邊靜靜看着。然後我將問題重新捋了下,想着hash衝突既然很難避免,那就不管它了,如果查詢結果只有一條,那就是沒有產生hash衝突,返回結果即可。然後查詢結果有多條記錄,說明此時產生了hash衝突,我說再利用全表搜索。是的,你沒聽錯,我又犯了一個很傻逼的錯誤。前半句沒有問題,面試官聽到我的後半句後,說產生hash衝突後那你直接在返回的結果裏進行局部搜索不就行了。

參考答案

表結構如下圖所示,其中url_hash字段由url通過hash函數生成得到。

SELECT rank FROM tableName WHERE url_hash=hash("www.baidu.com/1/2") AND url="www.baidu.com/1/2"

 方法2 前綴索引

面試的問題解決了,然後我在網上搜了下,發現構造前綴索引也能解決這個問題。可參考mysql對於很長的字符列的索引方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章