百萬數據量 mysql 模糊搜索提速
在 mysql 中,當數據量達到百萬級時,執行模糊查詢可能會變得非常緩慢。本文提供的解決方案無需借助第三方中間件,即可在 512m 的 Java 堆內存限制下顯著提升模糊搜索的速度。
基于索引表的方案
創建一個索引表,包含三列:”當前詞”、”下一詞”和”原記錄主鍵 id”。其中,”當前詞”和”下一詞”表示搜索關鍵詞中的連續單詞,”原記錄主鍵 id”指向滿足條件的原始記錄。
索引表結構
當前詞 | 下一詞 | 原記錄主鍵 id |
---|---|---|
mysql | 一 | 1 |
一 | 千 | 1 |
千 | 萬 | 1 |
萬 | 的 | 1 |
… | … | … |
模 | 糊 | 1 |
糊 | 搜 | 1 |
搜 | 索 | 1 |
索 | null | 1 |
搜索算法
搜索關鍵詞時,按順序查詢索引表,獲得滿足每個單詞條件的原記錄id。然后使用這些 id 在原始表中查找匹配記錄。
例:搜索“模糊搜索”
SELECT 原記錄主鍵ID FROM (SELECT 原記錄主鍵ID FROM 索引表 WHERE 當前詞 = '模' AND 下一詞 = '糊') JOIN (SELECT 原記錄主鍵ID FROM 索引表 WHERE 當前詞 = '糊' AND 下一詞 = '搜') USING(原記錄主鍵ID) JOIN (SELECT 原記錄主鍵ID FROM 索引表 WHERE 當前詞 = '搜' AND 下一詞 = '索') USING(原記錄主鍵ID) JOIN (SELECT 原記錄主鍵ID FROM 索引表 WHERE 當前詞 = '索' AND 下一詞 IS NULL) USING(原記錄主鍵ID)
jvm 優化
為了充分利用有限的內存,建議使用如下的jvm 優化技術:
- 縮小永久代尺寸
- 設置metaspace 垃圾回收參數(-xx:metaspacesize、-xx:maxmetaspacesize)
- 使用壓縮引用和指針
- 啟用分代垃圾回收
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END