精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

查詢飛起!SpringBoot樹形結構從3秒飆到30毫秒的“神級加速”實錄

開發 前端
從遞歸查詢到高性能樹構建,我們完成了 從 O(n2) 到 O(n) 的質變。? 這一優化讓首頁分類樹的響應時間從 3 秒降到 30 毫秒,真正達到了用戶“無感知”的速度,系統穩定性和可維護性也得到極大提升。

在實際業務中,分類樹(Category Tree)往往是電商、內容管理、權限體系等系統的核心數據結構。隨著業務規模不斷擴張,原本毫無壓力的樹形查詢,突然變成了系統性能的瓶頸。

我所在的項目在首頁加載分類樹時,最初需要 3–5 秒 才能渲染完成,用戶大量投訴“卡頓、慢”,運維監控顯示 高峰期數據庫連接池被耗盡,甚至引發系統崩潰。開發團隊雖然嘗試過各種優化,但基本都屬于“打補丁”,沒能解決根本問題。

最終我們通過一次性查詢 + 高效內存構建樹的方式,將性能從 3 秒直接壓縮到 30 毫秒,實現了 100 倍提速。本文將完整還原這個過程,幫助你在遇到類似問題時快速找到正確的解決方案。

性能瓶頸:遞歸查詢的災難

傳統做法通常是遞歸調用 getChildren(),每次訪問數據庫查詢子節點,看似簡潔,實則暗藏殺機。

public List<Category> getCategoryTree() {
    List<Category> roots = categoryMapper.getRootCategories(); // 1次查詢
    for (Category root : roots) {
        loadChildren(root); // 每個節點觸發遞歸查詢
    }
    return roots;
}


private void loadChildren(Category parent) {
    List<Category> children = categoryMapper.getByParentId(parent.getId()); // N次查詢
    parent.setChildren(children);
    for (Category child : children) {
        loadChildren(child);
    }
}

問題分析:

  • 1 萬節點 = 1 萬次 SQL
  • 單次查詢平均 2ms → 總耗時 20 秒
  • 數據庫連接池被瞬間榨干
  • 內存中反復創建對象,GC 壓力暴增

結果就是:首頁分類樹幾乎不可用

性能測試對比

我們對比了不同規模下的執行耗時:

節點數

遞歸查詢方案

優化后方案

提升倍數

1,000

800ms

15ms

53x

5,000

2.8s

25ms

112x

10,000

5.2s

30ms

173x

50,000

超時

45ms

1000x+

根本解決思路:一次查詢 + O(n) 算法

核心理念

  • 數據庫只查一次 → 獲取所有節點
  • HashMap 建索引 → O(1) 查找父子關系
  • 單次遍歷構建樹 → O(n) 時間復雜度
  • 結果緩存 → 避免重復構建

數據庫表設計(鄰接表 + level 字段)

CREATE TABLE category (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    parent_id BIGINT,
    level INT NOT NULL DEFAULT 0,
    sort_order INT DEFAULT 0,
    status TINYINT DEFAULT 1,
    create_time DATETIME,
    update_time DATETIME,
    INDEX idx_parent_id (parent_id),
    INDEX idx_level (level),
    INDEX idx_status (status)
);

設計要點:

  • level:支持批量層級查詢和排序優化
  • (parent_id, sort_order) 復合索引 → 高效排序
  • status:軟刪除、狀態過濾

復雜度對比

維度

遞歸方案

優化后方案

提升

時間復雜度

O(n2)

O(n)

線性提升

空間復雜度

O(h)(遞歸棧深度)

O(n)(HashMap)

更可控

數據庫查詢

O(n)

O(1)

極大減少

網絡 I/O

n 次

1 次

n 倍減少

優化后的算法實現

通用樹構建器

@Component
public class TreeBuilder {


    public <T extends TreeNode<T>> List<T> buildTree(List<T> nodes, Object rootValue) {
        if (CollectionUtils.isEmpty(nodes)) {
            return new ArrayList<>();
        }


        // 1. 建立快速索引 O(n)
        Map<Object, T> nodeMap = nodes.stream()
            .collect(Collectors.toMap(TreeNode::getId, node -> node));


        List<T> rootNodes = new ArrayList<>();


        // 2. 單次遍歷構建父子關系 O(n)
        for (T node : nodes) {
            Object parentId = node.getParentId();
            if (Objects.equals(parentId, rootValue)) {
                rootNodes.add(node);
            } else {
                T parent = nodeMap.get(parentId);
                if (parent != null) {
                    parent.addChild(node);
                }
            }
        }


        // 3. 可選:遞歸排序 O(n log n)
        sortTree(rootNodes);


        return rootNodes;
    }


    private <T extends TreeNode<T>> void sortTree(List<T> nodes) {
        if (CollectionUtils.isEmpty(nodes)) return;
        nodes.sort(Comparator.comparing(TreeNode::getSortOrder,
            Comparator.nullsLast(Comparator.naturalOrder())));
        for (T node : nodes) {
            if (node.hasChildren()) sortTree(node.getChildren());
        }
    }
}
樹節點基類
public interface TreeNode<T> {
    Object getId();
    Object getParentId();
    Integer getSortOrder();
    List<T> getChildren();
    void setChildren(List<T> children);


    default void addChild(T child) {
        if (getChildren() == null) setChildren(new ArrayList<>());
        getChildren().add(child);
    }


    default boolean hasChildren() {
        return getChildren() != null && !getChildren().isEmpty();
    }
}

業務實現

實體類

package com.icoderoad.module.category;


import com.icoderoad.core.tree.TreeNode;
import lombok.Data;


import java.util.List;


@Data
public class Category implements TreeNode<Category> {
    private Long id;
    private String name;
    private Long parentId;
    private Integer level;
    private Integer sortOrder;
    private Integer status;
    private List<Category> children;


    @Override
    public Object getId() {
        return id;
    }


    @Override
    public Object getParentId() {
        return parentId;
    }


    @Override
    public Integer getSortOrder() {
        return sortOrder;
    }
}

Mapper

package com.icoderoad.module.category;


import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;


import java.util.List;


@Mapper
public interface CategoryMapper {


    @Select("SELECT id, name, parent_id AS parentId, level, sort_order AS sortOrder, status " +
            "FROM category WHERE status = 1 ORDER BY sort_order ASC")
    List<Category> findAllActive();
}

Service 接口

package com.icoderoad.module.category;


import java.util.List;


public interface CategoryService {
    List<Category> getCategoryTree();
}

 Service 實現類

package com.icoderoad.module.category;


import com.icoderoad.core.tree.TreeBuilder;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;


import java.util.List;


@Service
@RequiredArgsConstructor
public class CategoryServiceImpl implements CategoryService {


    private final CategoryMapper categoryMapper;
    private final TreeBuilder treeBuilder;


    @Override
    @Cacheable(value = "categoryTree", key = "'all'")
    public List<Category> getCategoryTree() {
        List<Category> all = categoryMapper.findAllActive();
        return treeBuilder.buildTree(all, 0L); // 假設根節點 parentId=0
    }
}

Controller

package com.icoderoad.module.category;


import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


import java.util.List;


@RestController
@RequiredArgsConstructor
public class CategoryController {


    private final CategoryService categoryService;


    @GetMapping("/categories/tree")
    public List<Category> getCategoryTree() {
        return categoryService.getCategoryTree();
    }
}

緩存優化

我們采用 多級緩存(Caffeine + Redis),既能保證高并發下的讀性能,又能兼顧分布式環境中的一致性。

  • L1:Caffeine(本地內存,10 分鐘過期)
  • L2:Redis(分布式,2 小時過期)
  • 啟動時預熱,定時刷新,避免冷啟動雪崩

監控與保障

  • 使用 Micrometer 統計樹構建耗時
  • 結合 Prometheus + Grafana 做性能監控
  • 高峰期壓力測試驗證可承載 5 萬節點,毫秒級響應

結論

從遞歸查詢到高性能樹構建,我們完成了 從 O(n2) 到 O(n) 的質變。 這一優化讓首頁分類樹的響應時間從 3 秒降到 30 毫秒,真正達到了用戶“無感知”的速度,系統穩定性和可維護性也得到極大提升。

如果你正面臨類似的 N+1 查詢困境,建議優先考慮:

  1. 一次查詢 + 內存建樹,徹底消滅遞歸 SQL
  2. 合理索引 + Level 字段,讓樹形結構查詢更高效
  3. 多級緩存策略,提升并發訪問下的可用性
  4. 監控與預警,持續觀察系統性能變化

性能優化沒有銀彈,但思路正確,就能實現百倍提升。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-06-27 09:05:47

2013-11-11 11:17:45

AngularJS性能優化

2025-06-25 09:30:14

2024-11-08 15:08:17

2021-04-27 06:20:25

MySQL集群優化

2017-12-25 11:15:06

JavaArray數組

2022-06-15 11:27:15

開源代碼項目

2019-08-21 14:35:18

壓縮文件優化過程Java

2024-04-10 08:00:00

PostgresNoSQL

2020-11-12 18:51:43

Java編程語言

2025-09-15 03:00:00

2012-03-11 15:27:57

微軟

2025-03-24 08:51:16

2017-05-31 13:58:05

戴爾宕機服務器

2021-05-19 15:35:19

數據庫工具技術

2015-03-20 10:01:50

Android StuGradle

2019-01-30 09:34:56

ElasticSearLogstashKibana

2018-12-21 10:39:31

華為

2024-11-01 12:10:57

2017-08-11 14:28:02

58同城推薦系統
點贊
收藏

51CTO技術棧公眾號

国产精品视频xxxx| 亚洲片国产一区一级在线观看| 日本美女爱爱视频| 国产77777| 亚洲在线国产日韩欧美| 亚洲天堂网在线观看| 超碰成人在线播放| 狂野欧美激情性xxxx欧美| 91丨porny丨在线| 国产精品视频白浆免费视频| 搜索黄色一级片| 中文字幕日韩在线| 狠狠干狠狠久久| 亚洲日本欧美在线| 亚洲免费视频网| 久久午夜精品一区二区| 久久久国产在线视频| 无码国产69精品久久久久网站| 卡通欧美亚洲| 一区二区三区四区av| 欧美一区二区三区四区夜夜大片 | 欧美午夜精彩| 日韩免费在线观看| 国产一级片黄色| 欧美家庭影院| 中文字幕第一页久久| 国内精品久久国产| 国产一区二区三区中文字幕| 国产一区二区精品| 色综合五月天导航| 人妻视频一区二区| 久久婷婷国产| 日韩精品综合一本久道在线视频| 一本久道中文无码字幕av| 少女频道在线观看免费播放电视剧| 久久久久久久久一| 91丝袜脚交足在线播放| 亚洲 小说区 图片区| 一本色道久久| 欧美激情a∨在线视频播放| 极品人妻videosss人妻| 欧美黑白配在线| 欧美成人一区二区三区在线观看| 伊人国产在线视频| 日本电影欧美片| 红桃av永久久久| 亚洲精品少妇一区二区| 一级日本在线| 欧美高清在线一区| 青青草国产精品| 青青九九免费视频在线| 99国内精品久久| 国产精品香蕉视屏| 国产高清视频免费| 国产一区激情在线| 亚洲wwwav| 国产尤物在线观看| 全部av―极品视觉盛宴亚洲| 国产成人精品a视频一区www| 天天操中文字幕| 中文日韩欧美| 88xx成人精品| 性色av免费观看| 羞羞答答国产精品www一本| 国内精品久久久久影院 日本资源| 欧美成人一区二区三区高清| 自产国语精品视频| 欧美国产日韩中文字幕在线| 欧美日韩在线视频免费播放| 欧美日韩亚洲一区在线观看| 欧美福利小视频| 国产在线观看免费视频今夜| 黄色成人91| 97涩涩爰在线观看亚洲| 日韩欧美亚洲一区二区三区| 国产日韩欧美三级| 日本精品久久电影| 国内av在线播放| 免费在线一区观看| 国产精品丝袜视频| 国产成人精品无码高潮| 国产成人av电影免费在线观看| www 成人av com| 性xxxfllreexxx少妇| 久久众筹精品私拍模特| 亚洲国产精品综合| 国产cdts系列另类在线观看| 亚洲成人av电影| www黄色av| 青草综合视频| 日韩欧美一区电影| 国产精品无码专区| 欧美一级淫片| 久久福利视频导航| 日韩在线观看第一页| 久久福利一区| 91精品久久久久久久久久另类| 亚洲AV午夜精品| 久久色视频免费观看| 一区二区三区免费看| 日韩三级免费| 色8久久人人97超碰香蕉987| 在线免费看污网站| 欧美一区二区三区久久| 日韩在线视频网站| 黄色激情视频在线观看| 日本中文字幕一区二区有限公司| 91欧美日韩一区| 天堂中文在线资| 国产精品免费看片| 成人性免费视频| 亚洲电影二区| 国产丝袜一区视频在线观看 | 亚洲欧洲av| 日韩亚洲欧美中文在线| 日韩 欧美 精品| 久久精品日韩一区二区三区| 国产精品久久久久久影视| 国产精品一区二区免费视频| 91色乱码一区二区三区| 中文精品视频一区二区在线观看| 123区在线| 欧美日韩激情一区| 国产肉体xxxx裸体784大胆| 99精品电影| 国产成人精品久久| 国产 欧美 精品| 中文字幕亚洲不卡| 亚洲成熟丰满熟妇高潮xxxxx| 欧州一区二区三区| 一区二区三区动漫| 国产成人免费观看视频| 国内国产精品久久| 三区精品视频| 自拍一区在线观看| 亚洲第一偷拍网| 小泽玛利亚一区二区免费| 视频一区欧美精品| 精品999在线观看| 中文在线手机av| 欧美情侣在线播放| 四虎影视1304t| 久久亚洲电影| 裸体丰满少妇做受久久99精品 | 久久精品国产免费观看| 无码人妻精品一区二| 99精品偷自拍| 2018国产在线| 成人av婷婷| 欧美—级高清免费播放| 精品国产亚洲av麻豆| **性色生活片久久毛片| 亚洲综合欧美激情| 成人影院在线| 国产精品狼人色视频一区| 毛片网站在线观看| 色屁屁一区二区| 国产亚洲精品熟女国产成人| 久久精品日产第一区二区| 精品综合在线| 亚洲美女炮图| 亚洲片av在线| 中文字幕视频一区二区| 中文欧美字幕免费| 色综合色综合色综合色综合| 999精品在线| 国产精品久久久久久久av大片| 国产中文字幕在线视频| 欧美午夜寂寞影院| 一二三四国产精品| 精品亚洲porn| 男人的天堂视频在线| 日本免费一区二区三区视频| 欧美大码xxxx| 日本精品久久久久久| 午夜伦理一区二区| a级在线观看视频| 奇米综合一区二区三区精品视频| 亚洲国产成人不卡| 精品视频国内| 久久免费精品日本久久中文字幕| 天天综合网在线| 色婷婷狠狠综合| 亚洲综合第一区| 国产一区二区在线看| 日韩小视频网站| 亚洲国产网址| 国产精品夜色7777狼人| 秋霞在线视频| 亚洲欧美中文日韩在线v日本| 国内av在线播放| 一级中文字幕一区二区| 日本一区二区三区网站| 久久99精品国产91久久来源| 毛片av在线播放| 亚洲人成网站77777在线观看 | 伦av综合一区| 最新国产成人在线观看| 男人网站在线观看| 日韩精品一卡二卡三卡四卡无卡| 在线一区日本视频| 精品国产午夜肉伦伦影院| 国产精品成人久久久久| av在线导航| 亚洲欧美国产精品| 国产99999| 色偷偷一区二区三区| 91插插插插插插| 久久综合一区二区| 国产无套精品一区二区三区| 天堂av在线一区| 成人免费看片'免费看| 国产一区二区三区四区五区传媒| 2022国产精品| 精品福利在线| 国产91精品久久久久久| xvideos国产在线视频| 亚洲男人天堂2019| 亚洲国产中文字幕在线| 欧美午夜片在线观看| 国产免费观看av| 亚洲乱码国产乱码精品精可以看| 六月婷婷七月丁香| 成人免费毛片高清视频| 亚洲精品性视频| 久久aⅴ国产紧身牛仔裤| 高清无码一区二区在线观看吞精| 亚洲美女15p| 国内外成人免费视频| 懂色av色香蕉一区二区蜜桃| 国产成人精品一区二区在线| 97人人在线视频| 久久综合国产精品台湾中文娱乐网| 日本天堂在线| 日韩国产欧美精品在线| 北条麻妃一二三区| 3d动漫精品啪啪一区二区竹菊| 欧美人一级淫片a免费播放| 亚洲成a人在线观看| 欧美人妻一区二区| 亚洲视频香蕉人妖| 蜜桃av.com| 欧美激情在线一区二区三区| 粉嫩av懂色av蜜臀av分享| 成人做爰69片免费看网站| 91插插插影院| 精品一区二区免费视频| 香蕉视频网站入口| 日韩黄色在线观看| 成人精品小视频| 久久亚洲影院| 粉嫩虎白女毛片人体| 免费一级欧美片在线播放| 极品美女扒开粉嫩小泬| 日韩一级欧洲| 亚洲色欲综合一区二区三区| 亚洲影音一区| 北条麻妃在线观看| 久久资源在线| 青青青在线视频免费观看| 青青草原综合久久大伊人精品优势 | 超碰在线免费av| 精品一区二区在线视频| 手机在线国产视频| 国产一区二区日韩精品| 亚洲精品在线视频播放| 国产精品一区二区三区四区| 丰满少妇中文字幕| 风流少妇一区二区| 国产精品入口麻豆| 99久久国产免费看| 少妇光屁股影院| 久久久久国产精品厨房| 538精品视频| 亚洲欧美怡红院| 欧美日韩人妻精品一区二区三区| 亚洲主播在线播放| 久久久久久久久久久久久久av| 黑人巨大精品欧美一区免费视频| 日韩精品一区二区亚洲av观看| 欧美性生活一区| 国产内射老熟女aaaa∵| 亚洲成人1234| 福利小视频在线观看| 久久精品中文字幕免费mv| av丝袜在线| 国产成人精品视频在线| 欧一区二区三区| 欧美精品在线一区| 亚洲精品一二三区区别| 日韩精品视频一区二区在线观看| 奇米四色…亚洲| 激情综合激情五月| 中文字幕av一区二区三区高| 欧美日韩大片在线观看| 在线视频国内一区二区| 国产v在线观看| 亚洲女人初尝黑人巨大| а√天堂8资源在线官网| 欧美最近摘花xxxx摘花| 国产一区二区三区视频在线| 鲁丝一区二区三区免费| 91成人免费| 日韩av在线综合| 国产凹凸在线观看一区二区| 精品欧美一区二区久久久| 一区二区三区国产| 中文字幕在线观看第二页| 亚洲精品99久久久久中文字幕| 天堂中文8资源在线8| 国产91精品不卡视频| 视频精品一区| 水蜜桃一区二区| 国产欧美一级| 被黑人猛躁10次高潮视频| 久久精品欧美一区二区三区麻豆| 黄页网站免费观看| 欧美理论电影在线| 成人亚洲综合天堂| 性欧美暴力猛交69hd| 香蕉成人影院| 国产欧美在线一区二区| 麻豆精品少妇| 懂色av一区二区三区四区五区| 六月丁香综合| 精品伦一区二区三区| 国产精品久久久久久久久图文区| 日韩 欧美 综合| 5858s免费视频成人| 东凛在线观看| 国内成人精品一区| 一区二区三区日本视频| 日韩av一区二区三区在线观看| 国产一区二区三区四区老人| 在线观看日本www| 中文字幕不卡在线观看| 日韩精品视频播放| 欧美精品一区二区三| 国产在线激情| 成人久久一区二区三区| 欧美热在线视频精品999| 国产黄色激情视频| 国产精品一区二区x88av| 成人激情五月天| 欧美亚洲综合另类| 青青草av免费在线观看| 国自在线精品视频| 国产乱论精品| 日本免费a视频| 国产ts人妖一区二区| 国产激情无码一区二区三区| 日本韩国一区二区三区| 国产在线资源| 日本韩国在线不卡| 精品久久电影| aⅴ在线免费观看| 国产精品中文有码| 精品国产视频在线观看| 欧美裸体bbwbbwbbw| 米奇精品一区二区三区| 国产精品青草久久久久福利99| av在线不卡免费观看| av免费网站观看| 久久久欧美精品sm网站| 欧美超碰在线观看| 亚洲色图在线观看| 99久久伊人| 亚洲国产欧美不卡在线观看 | 中文精品99久久国产香蕉| 韩国成人在线| 翔田千里亚洲一二三区| 狠狠色狠狠色合久久伊人| 亚洲一级二级片| 精品国产亚洲一区二区三区在线观看| 9191在线播放| av在线亚洲男人的天堂| 国产精品综合| 国产精品揄拍100视频| 欧美亚洲高清一区| 欧美日韩视频在线播放| 国产精品欧美日韩久久| 99国产精品免费视频观看| 欧美午夜精品理论片| 亚洲a一区二区| 午夜在线观看视频18| 国产精品露脸自拍| 99视频精品视频高清免费| 亚洲av成人精品一区二区三区 | 老司机免费视频久久| 婷婷综合在线视频| 欧美一区二区三区人| 手机av在线| 日韩免费三级| 国产一区91精品张津瑜| 久久久久久久极品内射| 亚洲欧美日本另类| 97久久中文字幕| 国产 国语对白 露脸 | 黑人精品xxx一区| av网站无病毒在线|