国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java查詢(xún)數(shù)據(jù)庫(kù)百萬(wàn)條數(shù)據(jù),優(yōu)化之:多線(xiàn)程+數(shù)據(jù)庫(kù)

這篇具有很好參考價(jià)值的文章主要介紹了java查詢(xún)數(shù)據(jù)庫(kù)百萬(wàn)條數(shù)據(jù),優(yōu)化之:多線(xiàn)程+數(shù)據(jù)庫(kù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

java百萬(wàn)查詢(xún)語(yǔ)句優(yōu)化

業(yè)務(wù)需求

今天去面試時(shí)hr問(wèn)了個(gè)關(guān)于大量數(shù)據(jù)查詢(xún)的問(wèn)題。

面試官:“我們公司是做數(shù)據(jù)分析的,每次需要從數(shù)據(jù)庫(kù)中查詢(xún)100萬(wàn)條數(shù)據(jù)進(jìn)行分析,該接口不能用分頁(yè)(不限制具體怎么實(shí)現(xiàn)),請(qǐng)問(wèn)怎么優(yōu)化sql或者java代碼呢??”

如果用普通查詢(xún)需要5分多分鐘才查詢(xún)完畢,所以我們用索引加多線(xiàn)程來(lái)實(shí)現(xiàn)。

那我們就開(kāi)始吧!GO??!GO!!

數(shù)據(jù)庫(kù)設(shè)計(jì)

編寫(xiě)數(shù)據(jù)庫(kù)字段

然后要生成100萬(wàn)條數(shù)據(jù)

多線(xiàn)程查詢(xún)數(shù)據(jù)庫(kù),maven,spring boot,java,數(shù)據(jù)庫(kù),servlet

在數(shù)據(jù)庫(kù)添加索引

多線(xiàn)程查詢(xún)數(shù)據(jù)庫(kù),maven,spring boot,java,數(shù)據(jù)庫(kù),servlet

索引這個(gè)方面我還是不太了解,大家懂的可以?xún)?yōu)化索引

代碼實(shí)現(xiàn)

java編寫(xiě)

controller類(lèi)編寫(xiě)
package com.neu.controller;
 
import com.neu.mapper.UserMapper;
import com.neu.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 用戶(hù)查詢(xún)多線(xiàn)程用戶(hù)Controller
 * @author 薄荷藍(lán)檸
 * @since 2023/6/6
 */
@Controller
public class ExecutorUtils {

   @Resource
   private UserMapper userMapper;

 
   // 一個(gè)線(xiàn)程最大處理數(shù)據(jù)量
   private static final int THREAD_COUNT_SIZE = 5000;



   @RequestMapping("Executor")
   public List<User> executeThreadPool() {

      //計(jì)算表總數(shù)
      Integer integer = userMapper.UserSum();

      //記錄開(kāi)始時(shí)間
      long start = System.currentTimeMillis();


      //new個(gè)和表總數(shù)一樣長(zhǎng)的ArrayList
      List<User> threadList=new ArrayList<>(integer);

      // 線(xiàn)程數(shù),以5000條數(shù)據(jù)為一個(gè)線(xiàn)程,總數(shù)據(jù)大小除以5000,再加1
      int round = integer / THREAD_COUNT_SIZE + 1;

      //new一個(gè)臨時(shí)儲(chǔ)存List的Map,以線(xiàn)程名為k,用做list排序
      Map<Integer,ArrayList> temporaryMap = new HashMap<>(round);

      // 程序計(jì)數(shù)器
      final CountDownLatch count = new CountDownLatch(round);

      // 創(chuàng)建線(xiàn)程
      ExecutorService executor = Executors.newFixedThreadPool(round);

      // 分配數(shù)據(jù)
      for (int i = 0; i < round; i++) {
         //該線(xiàn)程的查詢(xún)開(kāi)始值
         int startLen = i * THREAD_COUNT_SIZE;
         int k = i + 1;
         executor.execute(new Runnable() {
            @Override
            public void run() {
               ArrayList<User> users = userMapper.subList(startLen);
               //把查出來(lái)的List放進(jìn)臨時(shí)Map
               temporaryMap.put(k,users);
               System.out.println("正在處理線(xiàn)程【" + k + "】的數(shù)據(jù),數(shù)據(jù)大小為:" + users.size());
               // 計(jì)數(shù)器 -1(喚醒阻塞線(xiàn)程)
               count.countDown();
            }
         });
      }
      try {
         // 阻塞線(xiàn)程(主線(xiàn)程等待所有子線(xiàn)程 一起執(zhí)行業(yè)務(wù))
         count.await();
         //結(jié)束時(shí)間
         long end = System.currentTimeMillis();
         System.out.println("100萬(wàn)數(shù)據(jù)查詢(xún)耗時(shí):" + (end - start) + "ms");
         //通過(guò)循環(huán)遍歷臨時(shí)map,把map的值有序的放進(jìn)List里
         temporaryMap.keySet().forEach(k->{
            threadList.addAll(temporaryMap.get(k));
         });
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         //清除臨時(shí)map,釋放內(nèi)存
         temporaryMap.clear();
         // 終止線(xiàn)程池
         // 啟動(dòng)一次順序關(guān)閉,執(zhí)行以前提交的任務(wù),但不接受新任務(wù)。若已經(jīng)關(guān)閉,則調(diào)用沒(méi)有其他作用。
         executor.shutdown();
      }
      //輸出list的長(zhǎng)度
      System.out.println("list長(zhǎng)度為:"+threadList.size());
      return threadList;
   }
}
編寫(xiě)Mapper
package com.neu.mapper;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.annotations.*;

import com.neu.pojo.User;

/**
 * 用戶(hù)查詢(xún)多線(xiàn)程用戶(hù)Controller
 * @author 薄荷藍(lán)檸
 * @since 2023/6/6
 */
@Mapper
public interface UserMapper {
    
    /**
	 * 檢索user表的長(zhǎng)度
	 * @return 表長(zhǎng)度
	 */
	@Select("SELECT count(id) as sum FROM sysuser")
	Integer UserSum();

     /**
	 * 檢索user表的所有記錄,
	 * SELECT * 無(wú)法使用 MySQL 優(yōu)化器覆蓋索引的優(yōu)化(基于 MySQL 優(yōu)化器的“覆蓋索引”策略又是速度極快,效率極高,業(yè)界極為推薦的查詢(xún)優(yōu)化方式)
	 * @return 所有記錄信息
	 */
	@Select("select id,account,password,name,job,rights,roleId,createUserId,createTime,updateUserId,updateTime,del,enable from sysuser LIMIT #{startLen},5000")
	ArrayList<User> subList(@Param("startLen") int startLen);
}

編寫(xiě)完成后我們測(cè)試一波–>

多線(xiàn)程查詢(xún)數(shù)據(jù)庫(kù),maven,spring boot,java,數(shù)據(jù)庫(kù),servlet

測(cè)試結(jié)果20秒內(nèi),比之前快了好多

模糊查詢(xún)

模糊查詢(xún)呢?

咱測(cè)試一下:

修改Mapper
package com.neu.mapper;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.annotations.*;

import com.neu.pojo.User;

/**
 * 用戶(hù)查詢(xún)多線(xiàn)程用戶(hù)Controller
 * @author 薄荷藍(lán)檸
 * @since 2023/6/6
 */
@Mapper
public interface UserMapper {
	
    
     /**
	 * 檢索user表id包含有“0”的長(zhǎng)度
	 * @return 表長(zhǎng)度
	 */
	@Select("SELECT count(id) as sum FROM sysuser where id like concat('%',0,'%')")
	Integer UserSum();

     /**
	 * 檢索user表id包含有“0”的所有記錄
	 * SELECT * 無(wú)法使用 MySQL 優(yōu)化器覆蓋索引的優(yōu)化(基于 MySQL 優(yōu)化器的“覆蓋索引”策略又是速度極快,效率極高,業(yè)界極為推薦的查詢(xún)優(yōu)化方式)
	 * @return 所有記錄信息
	 */
	@Select("select id,account,password,name,job,rights,roleId,createUserId,createTime,updateUserId,updateTime,del,enable from sysuser  where id like concat('%',0,'%') LIMIT #{startLen},5000")
	ArrayList<User> subList(@Param("startLen") int startLen);
}

修改完成后我們?cè)贉y(cè)試一波–>

多線(xiàn)程查詢(xún)數(shù)據(jù)庫(kù),maven,spring boot,java,數(shù)據(jù)庫(kù),servlet

耗時(shí)5秒左右,可以滿(mǎn)足業(yè)務(wù)需求

結(jié)束

目前基本的查詢(xún)已經(jīng)寫(xiě)完

看到這個(gè)文章的還可以對(duì)以下方面進(jìn)行優(yōu)化:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-615072.html

  1. 索引進(jìn)行優(yōu)化。
  2. 每個(gè)線(xiàn)程查詢(xún)多少條數(shù)據(jù)最為合適??
  3. 如果配置有線(xiàn)程池可以使用:總條數(shù)/線(xiàn)程數(shù)==每個(gè)線(xiàn)程需要查詢(xún)多少條數(shù)據(jù)。
  4. 進(jìn)行代碼優(yōu)化,優(yōu)化一些耗時(shí)的代碼。

到了這里,關(guān)于java查詢(xún)數(shù)據(jù)庫(kù)百萬(wàn)條數(shù)據(jù),優(yōu)化之:多線(xiàn)程+數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MYSQL中1000萬(wàn)條數(shù)據(jù)你是怎么查詢(xún)的,查詢(xún)非常慢怎么優(yōu)化

    MYSQL中1000萬(wàn)條數(shù)據(jù)你是怎么查詢(xún)的,查詢(xún)非常慢怎么優(yōu)化

    ?數(shù)據(jù)量越大,花費(fèi)時(shí)間越長(zhǎng) ? 偏移量越大,花費(fèi)時(shí)間越長(zhǎng)(淺層分頁(yè)到深層分頁(yè)) SQL優(yōu)化: 1.MySQL自身 2.網(wǎng)絡(luò)IO 3.SQL自身 --原SQL --避免使用select * ?全表掃描,查詢(xún)效率慢 --按需查找字段 ? ?使用索引掃描,主鍵索引,進(jìn)行提升 --覆蓋索引 查詢(xún)字段索引覆蓋,通過(guò)輔助索引提

    2024年02月06日
    瀏覽(17)
  • for循環(huán)查詢(xún)數(shù)據(jù)庫(kù)優(yōu)化(挺好用的)

    前段時(shí)間在完成一個(gè)列表功能的時(shí)候發(fā)現(xiàn)我for循環(huán)里嵌套了2個(gè)查詢(xún)語(yǔ)句,然后就感覺(jué)太影響性能了,而且也體現(xiàn)一個(gè)人的水平, 這里我舉下例子(方便回憶)。 如果性能還是沒(méi)有得到解決的話(huà),建議結(jié)合定時(shí)器以及檢查sql是否失效,或者走索引。 1.sql優(yōu)化 sql優(yōu)化 2.數(shù)據(jù)庫(kù)做

    2023年04月08日
    瀏覽(22)
  • 近8萬(wàn)條中國(guó)歷史野史秘聞ACCESS數(shù)據(jù)庫(kù)

    有很多朋友對(duì)中國(guó)文化歷史相關(guān)的數(shù)據(jù)感興趣,現(xiàn)有的中華上下五千年、世界五千年這類(lèi)的數(shù)據(jù)記錄數(shù)還太少太少,于是今天就采集了一個(gè)中華歷史網(wǎng)站,共有效采集到近8萬(wàn)條記錄。 分類(lèi)匯總情況:野史秘聞(12273)、歷史人物(8840)、歷史雜談(7928)、文史百科(5635)、

    2024年02月07日
    瀏覽(24)
  • MySQL數(shù)據(jù)庫(kù)索引優(yōu)化指南:提升查詢(xún)效率的利器

    MySQL數(shù)據(jù)庫(kù)索引優(yōu)化指南:提升查詢(xún)效率的利器

    本文將詳細(xì)探討MySQL數(shù)據(jù)庫(kù)索引的概念、作用以及不同類(lèi)型的索引,包括主鍵索引、唯一索引和普通索引。通過(guò)實(shí)際案例分析,我們將深入理解索引的工作原理,并提供實(shí)用的優(yōu)化建議,幫助讀者提升數(shù)據(jù)庫(kù)性能。

    2024年02月09日
    瀏覽(123)
  • 上萬(wàn)條全球各國(guó)紙幣大全含圖ACCESS數(shù)據(jù)庫(kù)

    《上萬(wàn)條全球各國(guó)紙幣大全含圖ACCESS數(shù)據(jù)庫(kù)》是今天采集自錢(qián)幣大全網(wǎng)站的紙幣資料,大類(lèi)包含:中國(guó)大陸、中國(guó)臺(tái)灣、中國(guó)香港、中國(guó)澳門(mén)、亞洲紙鈔、歐洲紙鈔、美洲紙鈔、非洲紙鈔 、大洋洲、其他紙鈔等,而且紙幣信息包含:國(guó)家名稱(chēng)、英文名稱(chēng)、目錄編號(hào)、紙鈔面額

    2024年02月06日
    瀏覽(21)
  • Django筆記二十八之?dāng)?shù)據(jù)庫(kù)查詢(xún)優(yōu)化匯總

    Django筆記二十八之?dāng)?shù)據(jù)庫(kù)查詢(xún)優(yōu)化匯總

    本文首發(fā)于公眾號(hào):Hunter后端 原文鏈接:Django筆記二十八之?dāng)?shù)據(jù)庫(kù)查詢(xún)優(yōu)化匯總 這一篇筆記將從以下幾個(gè)方面來(lái)介紹 Django 在查詢(xún)過(guò)程中的一些優(yōu)化操作,有一些是介紹如何獲取 Django 查詢(xún)轉(zhuǎn)化的 sql 語(yǔ)句,有一些是理解 QuerySet 是如何獲取數(shù)據(jù)的。 以下是本篇筆記目錄: 性

    2023年04月22日
    瀏覽(87)
  • 玩轉(zhuǎn)MySQL數(shù)據(jù)庫(kù)之SQL優(yōu)化之慢查詢(xún)

    本系列為:MySQL數(shù)據(jù)庫(kù)詳解,為千鋒資深教學(xué)老師獨(dú)家創(chuàng)作,致力于為大家講解清晰MySQL數(shù)據(jù)庫(kù)相關(guān)知識(shí)點(diǎn),含有豐富的代碼案例及講解。如果感覺(jué)對(duì)大家有幫助的話(huà),可以【關(guān)注】持續(xù)追更~ 文末有本文重點(diǎn)總結(jié),技術(shù)類(lèi)問(wèn)題,也歡迎大家和我們溝通交流! 從今天開(kāi)始本系列

    2024年02月06日
    瀏覽(98)
  • 2萬(wàn)條中華燈謎精選ACCESS\EXCEL數(shù)據(jù)庫(kù)

    燈謎,即寫(xiě)在彩燈上面的謎語(yǔ),又叫“燈虎”。猜燈謎又叫“射燈虎”。謎語(yǔ)來(lái)源于民間口謎,后經(jīng)文人加工成為謎,它在中國(guó)源遠(yuǎn)流長(zhǎng)。春秋戰(zhàn)國(guó)時(shí)期,出現(xiàn)了“隱語(yǔ)”或“庾辭”。秦漢時(shí)則成為一種書(shū)面創(chuàng)作。三國(guó)時(shí)代,猜謎盛行。在宋代出現(xiàn)了燈謎。人們將謎條系于五

    2024年02月07日
    瀏覽(22)
  • 近8萬(wàn)條謎語(yǔ)燈謎大全ACCESS\EXCEL數(shù)據(jù)庫(kù)

    其實(shí)互聯(lián)網(wǎng)上關(guān)于謎語(yǔ)和燈謎的資料仍然是挺多的,但是要想數(shù)據(jù)量以萬(wàn)來(lái)計(jì)算并且是接近10萬(wàn)的量來(lái)看的話(huà),就只能是《近8萬(wàn)條謎語(yǔ)燈謎大全ACCESS數(shù)據(jù)庫(kù)》了。而且《近8萬(wàn)條謎語(yǔ)燈謎大全ACCESS數(shù)據(jù)庫(kù)》的數(shù)據(jù)表字段中也包含分類(lèi)字段,可以根據(jù)分類(lèi)字段有針對(duì)性的給出謎語(yǔ)

    2024年02月06日
    瀏覽(38)
  • 近萬(wàn)條英文智力問(wèn)答題庫(kù)ACCESS\EXCEL數(shù)據(jù)庫(kù)

    今天弄到了一份很不錯(cuò)的英文版智力問(wèn)答題庫(kù),屬于那種我很滿(mǎn)意的數(shù)據(jù)庫(kù),原因有:1.記錄數(shù)將近1萬(wàn)條達(dá)到庫(kù)的基礎(chǔ);2.分類(lèi)表信息包含大小分類(lèi)非常詳細(xì);3.題目?jī)?nèi)容包含六七百條含有圖片的題;4.題庫(kù)除了選擇題外還包含判斷題,具體看以下截圖: 題止表中的QUIZ_PK_ID字

    2024年02月07日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包