假設我有很多 IPv4 以整數形式存盤(特別是在關系資料庫中),我想在給定 IP 的字串表示的情況下對它們進行子字串搜索。
例如,用戶輸入12.3并期望他們回傳諸如12.30.45.67、192.168.12.3、1.12.34.5、 之類的結果9.212.34.5。
如果 IP 是一個字串,我可以做一個簡單的子字串搜索。它可能效率不高,但至少易于實作和理解。但是因為我現在不能輕易地把它改成一個字串,所以我沒有看到任何有效的(在 CPU 周期、記憶體以及我的開發/實作時間方面)這樣做的方法,但也許我只是遺漏了什么。
uj5u.com熱心網友回復:
你沒有錯過任何東西。
例如嘗試12.3變成一系列范圍。無論在哪個八位位元組12中,都會有 3 個選項 ( 12, 112, 212)。無論在哪個八位位元組3中,都會有 2 個選項(3和30-39)。這是前面八位位元組的每個組合的 6 個范圍。
但是前面的八位位元組呢?我們1 256 256*256根據您的開始之前是 0、1 還是 2 個八位位元組而定。
這是3 * 2 * (1 256 256*256) = 394758您必須搜索的數字范圍的總數。進行這么多索引搜索不太可能比掃描所有內容更快。
順便說一句,最壞的情況是1.2。在那種情況下,您必須進行17 * 3 * (1 256 256*256) = 3355443范圍查找!
如果他們非常想要這個,您需要對字串進行全文搜索。
uj5u.com熱心網友回復:
在這種情況下,除了一些預處理、索引、快取之外的任何其他東西對我來說聽起來效率太低(并且很難實作)。
這里有一些想法:
- 如果可能,請考慮創建自定義索引,以便您進行字串搜索。
- 向表中添加一個自動欄位,將 ip 表示為字串,并使您能夠進行字串搜索。當然添加相應的索引。
- 如果您不能或不想更改該表的架構,請創建另一個表,其中包含 ip 表中行的字串表示以及映射到 ip 表主鍵的相應外鍵。
- 如果您根本不想或不能編輯該資料庫,請創建一個外部鍵/值存盤/資料庫,其中鍵是 ips 的字串表示形式,值在(現在)外部保存 ip 表的相應記錄資料庫或指向它。
無論如何,考慮到您的要求,我認為使用當前形式(整數)在該表中搜索是不可行的(性能方面和實作復雜性方面)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/380271.html
