SQL チューニング: Java メモリで計算を共有できるようにする

作者: 勇敢な子ウサギ

CSDN の高品質なフロントエンド作成者、プログラミング小説の次元の壁を最初に突破した人、『JavaScript Hundred Refinements and Immortals』の著者は、Java のハードコア乾物共有、共有が幸福を生み出す、そしてテクノロジーに焦点を当てています夢を実現させます!

仕事をしていると、SQLが遅いために調整に時間がかかることがよくあります。このセクションでは、クエリの効率を向上させる方法を紹介します。それは、Java メモリを使用して一部の操作を共有できるようにすることです。

この事例では依然として springBoot 日記システムが使用されており、ソース コードのダウンロード アドレスとチュートリアルは記事の最後にあります。

まずバグを修正してください

以前解決すべきバグがあり、日記の詳細ページで日記の種類が変換されていませんでした。

コントローラーを見てみましょう。

@RequestMapping("diary/{id}.html")
@SaCheckLogin
public ModelAndView getDiary(@PathVariable Long id, ModelAndView mav){
    TblSynBlog tblSynBlog = blogService.selectOne(id);
    mav.addObject("blog",tblSynBlog);
    mav.addObject("statistics",blogService.getBlogsStatistics());
    mav.setViewName("detail");
    return mav;
}

このケースは解決され、コードは Type に対する特別な処理を行わずに、tblSynBlog を直接 modelAndView に配置します。

ここでバグの修正を開始します。

アイデアは非常に単純で、日記のタイプに従って、タイプ テーブルに移動して特定の中国語をクエリし、それを返します。

@RequestMapping("diary/{id}.html")
@SaCheckLogin
public ModelAndView getDiary(@PathVariable Long id, ModelAndView mav){
    TblSynBlog tblSynBlog = blogService.selectOne(id);
    //对Type进行中文转义
    SysBlogType type = sysBlogTypeService.getByTypeId(tblSynBlog.getBlogType());
    mav.addObject("blogType",type.getTypeName());

    mav.addObject("blog",tblSynBlog);
    mav.addObject("statistics",blogService.getBlogsStatistics());
    mav.setViewName("detail");
    return mav;
}

ISysBlogTypeService

SysBlogType getByTypeId(String blogType);

SysBlogTypeServiceImpl

@Override
public SysBlogType getByTypeId(String blogType) {
    return baseMapper.selectById(Integer.parseInt(blogType));
}

マッパーをコントローラーに直接導入することは基本的には推奨しませんが、これは仕様なので正直にサービスを書きましょう。

詳細.jsp

<div class="title2">发布时间:${blog.createDate} &nbsp;&nbsp;&nbsp; 日志类别:${blogType}</div>

成果

終わり。

新たな需要

ここまでの一連の操作は順調に進んだので、次は問題を考えてみましょう。データベースからリストをクエリする場合、リストにフィールドを追加する必要があります。この新しいフィールドは他のテーブルからクエリする必要があります。どうすればよいですか?

たとえば、タイプ管理ページで該当するタイプの日記の数を増やしたいと考えています。

こちらは型管理ページです。

記事の総数を示す列を追加します。

簡単なアイデアは、まずタイプのリストを取得し、次にタイプごとに一度に対応する記事の数をクエリすることです。

このページは、axios 非同期クエリからのデータを使用します。

getData(){
  var index = layer.load(1); //添加laoding,0-2两种方式
  axios.post('${basePath}/sys-blog-type/selectAll',{}).then(r =>{
    layer.close(index);    //返回数据关闭loading
    if(r.data.code != '0000'){
      layer.msg(r.data.message,{icon:2});
      return;
    }
    console.log(r.data.data);
    this.listData = r.data.data;
  }).catch(error => {
    layer.msg(error.response.status,{icon:2});
    layer.close(index);    //返回数据关闭loading
  })
},

SysBlogTypeController

@RequestMapping("/selectAll")
public List<SysBlogType> selectAll(){
    return sysBlogTypeService.selectAll();
}

SysBlogTypeServiceImpl

@Override
public List<SysBlogType> selectAll() {
    QueryWrapper<SysBlogType> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user_id", StpUtil.getLoginId());
    return sysBlogTypeMapper.selectList(queryWrapper);
}

コードは一目瞭然で、MybatisPlus と組み合わせた条件付きクエリです。コントローラーを通じてフロントエンドに返されるのはリストであることがわかりました。列を追加する必要があるため、ここにフィールドを追加する必要があります。

@TableField(exist = false)
private Integer blogNumber;

@TableField(exist = false)このフィールドはフロントエンドにのみ返され、データベース テーブルにバインドする必要がないため、注釈が追加されます。

サービスの変更

@Autowired
BlogMapper blogMapper;

@Override
public List<SysBlogType> selectAll() {
    QueryWrapper<SysBlogType> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user_id", StpUtil.getLoginId());
    List<SysBlogType> sysBlogTypes = sysBlogTypeMapper.selectList(queryWrapper);
    sysBlogTypes.forEach(e -> {
        Integer typeId = e.getId();
        Integer count = blogMapper.selectCount(new LambdaQueryWrapper<TblSynBlog>()
                .eq(TblSynBlog::getBlogType, typeId));
        e.setBlogNumber(count);
    });
    return sysBlogTypes;
}

これらの数行のコードは、ブログ タイプを横断し、各タイプのブログの数を計算し、その数をブログ タイプ エンティティ クラスの blogNumber 属性に設定します。

ページコードの変更:

効果:

目的は達成できましたが、種類が多いとforループが長くなってしまいます。したがって、通常は for ループでデータベースにクエリを実行することはお勧めしません。

最適化: 最初にブログ情報をクエリし、次にメモリを使用して計算できます。

@Override
public List<SysBlogType> selectAll() {
  // 创建查询条件对象
  QueryWrapper<SysBlogType> queryWrapper = new QueryWrapper<>();
  // 设置查询条件:用户ID等于当前登录用户的ID
  queryWrapper.eq("user_id", StpUtil.getLoginId());
  // 查询符合条件的博客分类列表
  List<SysBlogType> sysBlogTypes = sysBlogTypeMapper.selectList(queryWrapper);
  // 获取所有博客分类的ID
  Set<Integer> blogIds = sysBlogTypes.stream().map(SysBlogType::getId).collect(Collectors.toSet());
  // 根据博客分类ID查询对应的博客列表
  List<TblSynBlog> tblSynBlogs = blogMapper.selectList(new LambdaQueryWrapper<TblSynBlog>()
          .in(TblSynBlog::getBlogType, blogIds));
  // 将博客列表按照分类ID进行分组
  Map<String, List<TblSynBlog>> tblSynBlogsMap = tblSynBlogs.stream().collect(Collectors.groupingBy(TblSynBlog::getBlogType));
  // 遍历博客分类列表,设置每个博客分类对应的博客数量
  sysBlogTypes.forEach(e -> {
      List<TblSynBlog> synBlogs = tblSynBlogsMap.get(e.getId() + "");
      if (synBlogs != null) {
          e.setBlogNumber(synBlogs.size());
      } else {
          e.setBlogNumber(0);
      }
  });
  // 返回博客分类列表
  return sysBlogTypes;
}

データが少ないと何も見えませんが、データが多いとパフォーマンスが大幅に向上します。

ソースコードのダウンロード

このケースは springboot 日記システムで完了しました。ソース コードが必要な場合は、プロジェクトを直接クローンできます。

テキストチュートリアル:

https://blog.csdn.net/weixin_39570751/category_11699146.html https://blog.csdn.net/weixin_39570751/category_11699146.html

https://gitee.com/skyblue0678/diary

おすすめ

転載: blog.csdn.net/weixin_39570751/article/details/131182533