订单分页查询:

老的代码是顺序执行查询数据和计算总记录数,但是如果条件复杂的话(比如关联子表)查询的时间要超过20s种

    public static PagedList<Map<String, Object>> query(ITemplateService service, Identity tenantId, Identity userId, String entityName,
Map<String, Object> params, String columns, TCondition cond) {
int page = WebHelper.getPageNo(params);
int pageSize = WebHelper.getPageSize(params);
String orderColumn = (String) params.get(JqgridConstant.ORDER_COLUMN); // 排序字段
String orderSord = (String) params.get(JqgridConstant.ORDER_METHOD); // 排序方式,desc or asc handleOrderByColumn(cond, orderColumn, orderSord);
int totalCount = service.getBaseService().query4Count(tenantId, entityName, cond);
List<Map<String, Object>> list = service.query(columns, entityName, cond, tenantId, userId, pageSize, page);
Translator.prepare(list, tenantId, service); // TODO
return new PagedList<>(page, pageSize, totalCount, list);
}

优化方法:

1.通过新启动一个线程来同时做之前需要顺序执行的两个Sql查询,最后等待全部计算完成,统一进行返回

2.对于一些特别复杂的条件的查询,如果内容的条数少于PageSize,那么计算总条数的sql就是不需要执行,可以用返回的list的szie当做总记录数

public static PagedList<Map<String, Object>> queryAsyn(ITemplateService service, Identity tenantId, Identity userId, String entityName,
Map<String, Object> params, String columns, TCondition cond) {
int page = WebHelper.getPageNo(params);
int pageSize = WebHelper.getPageSize(params);
String orderColumn = (String) params.get(JqgridConstant.ORDER_COLUMN); // 排序字段
String orderSord = (String) params.get(JqgridConstant.ORDER_METHOD); // 排序方式,desc or asc
ExecutorService slaver = Executors.newSingleThreadExecutor();
FutureTask<Integer> totalCountFuture = new FutureTask<>(new TotalCountJob(service, tenantId, entityName, cond));
slaver.execute(totalCountFuture);
handleOrderByColumn(cond, orderColumn, orderSord);
slaver.shutdown();
//主线程来取数据
long time1 = System.nanoTime();
List<Map<String, Object>> list = service.query(columns, entityName, cond, tenantId, userId, pageSize, page);
long time2 = System.nanoTime();
long diff = time2 - time1;
logger.debug("查询方案统计-----查询分页list部分,用时:{}s,条件:{}", translateToSecond(diff), cond);
Integer totalCount = null;
int listSize = list.size();
if (listSize < pageSize) {
logger.info("本次查询不需要sql进行count操作");
totalCount = listSize + (page - ) * pageSize;
slaver.shutdownNow();
} else {
try {
//没做完就等着
totalCount = totalCountFuture.get();
} catch (Exception e) {
totalCountFuture.cancel(true);
logger.error("totalCount发生异常", e);
}
} Translator.prepare(list, tenantId, service);
return new PagedList<>(page, pageSize, totalCount, list);
} private static double translateToSecond(long diff) {
return diff * 0.000000001;
} static class TotalCountJob implements Callable<Integer> { private String tableName;
private TCondition condition;
private Identity tenantId;
private ITemplateService service; public TotalCountJob(ITemplateService service, Identity tenantId, String tableName, TCondition condition) {
this.service = service;
this.tableName = tableName;
this.condition = condition;
this.tenantId = tenantId;
} @Override
public Integer call() throws Exception {
long time1 = System.nanoTime();
Integer totalCount = service.getBaseService().query4Count(tenantId, tableName, condition);
long time2 = System.nanoTime();
long diff = time2 - time1;
logger.debug("查询方案统计-----查询分页count部分,用时:{}s,条件:{}", translateToSecond(diff), condition);
return totalCount;
}
}

这是第一次优化的文章,欢迎访问:

http://www.cnblogs.com/victor2302/p/6073821.html

  

mysql优化---订单查询优化(2):异步分页处理的更多相关文章

  1. mysql优化---订单查询优化:异步分页处理

    订单分页查询: 老的代码是顺序执行查询数据和计算总记录数,但是如果条件复杂的话(比如关联子表)查询的时间要超过20s种 public static PagedList<Map<String ...

  2. mysql优化---订单查询优化:视图优化+索引创建

    订单的表结构采用了垂直分表的策略,将订单相关的不同模块的字段维护在不同表中 在订单处理这个页面,需要查询各种维度, 因此为了方便查询创建了v_sale_order视图(老版本) drop view v ...

  3. mysql优化---订单查询优化(1):视图优化+索引创建

    订单的表结构采用了垂直分表的策略,将订单相关的不同模块的字段维护在不同表中 在订单处理这个页面,需要查询各种维度, 因此为了方便查询创建了v_sale_order视图(老版本) drop view v ...

  4. 【mysql优化】大数据量分页优化

    limit 翻页原理 limit offset,N, 当offset非常大时, 效率极低, 原因是mysql并不是跳过offset行,然后单取N行, 而是取offset+N行,返回放弃前offset行 ...

  5. mysql优化之查询优化

    Posted by Money Talks on 2012/02/24 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四片 查询优化第五篇 到实战中去 查询优化 查询优化涉及到用户查询数据时使用到 ...

  6. mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护

    理想的索引,高效的索引建立考虑: :查询频繁度(哪几个字段经常查询就加上索引) :区分度要高 :索引长度要小 : 索引尽量能覆盖常用查询字段(如果把所有的列都加上索引,那么索引就会变得很大) : 索引 ...

  7. MySQL——优化嵌套查询和分页查询

    优化嵌套查询 嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.嵌套查询写起来简单,也容易理解.但是,有时候可以被更有效率的连接(JOIN ...

  8. [MySQL优化案例]系列 — 分页优化

    通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询.例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY ...

  9. MySQL优化 - 性能分析与查询优化(转)

    出处:  MySQL优化 - 性能分析与查询优化 优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载 ...

随机推荐

  1. HDU 2089:不要62(数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Problem Description   杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer) ...

  2. C++学习书籍推荐《More Effective C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...

  3. Windows 10打开远程桌面的方法

    今天使用windows 10,想要用远程桌面连接,可是怎么都找不到,哎,win10相比于win7和XP系统,感觉还是有点使用不习惯.不过后来还是找到了两个方法,在此记录下来,分享给需要的朋友. 1. ...

  4. android_MultiAutoCompleteTextView

    package cn.com.sxp;import android.app.Activity;import android.os.Bundle;import android.view.View;imp ...

  5. Netty-Channel架构体系源码解读

    全文围绕下图,Netty-Channel的简化版架构体系图展开,从顶层Channel接口开始入手,往下递进,闲言少叙,直接开撸 概述: 从图中可以看到,从顶级接口Channel开始,在接口中定义了一套 ...

  6. Kubernetes1.15 部署 coredns

    coredns.yaml文件如下所示 # __MACHINE_GENERATED_WARNING__ apiVersion: v1 kind: ServiceAccount metadata: nam ...

  7. k8s学习 - 概念 - Deployment

    k8s学习 - 概念 - Deployment 有了 ReplicaSet 还需要有 Deployment 的原因是希望有一个控制器能管理部署更新时候的版本控制问题.一个 Deployment 可以管 ...

  8. SpringBoot快速入门01--环境搭建

    SpringBoot快速入门--环境搭建 1.创建web工程 1.1 创建新的工程. 1.2  选择maven工程,点击下一步. 1.3 填写groupid(maven的项目名称)和artifacti ...

  9. 创建 gif

    1.动态创建 <Container name="layLoading"/> if (m_pLoadingGif == NULL)  {   m_pLoadingGif ...

  10. 常用的re模块的正则匹配的表达式

    07.01自我总结 常用的re模块的正则匹配的表达式 一.校验数字的表达式 1.数字 ^[0-9]\*$ 2.n位的数字 ^\d{n}$ 3.至少n位的数字 ^\d{n,}$ 4.m-n位的数字 ^\ ...