mysql优化---订单查询优化(2):异步分页处理
订单分页查询:
老的代码是顺序执行查询数据和计算总记录数,但是如果条件复杂的话(比如关联子表)查询的时间要超过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):异步分页处理的更多相关文章
- mysql优化---订单查询优化:异步分页处理
订单分页查询: 老的代码是顺序执行查询数据和计算总记录数,但是如果条件复杂的话(比如关联子表)查询的时间要超过20s种 public static PagedList<Map<String ...
- mysql优化---订单查询优化:视图优化+索引创建
订单的表结构采用了垂直分表的策略,将订单相关的不同模块的字段维护在不同表中 在订单处理这个页面,需要查询各种维度, 因此为了方便查询创建了v_sale_order视图(老版本) drop view v ...
- mysql优化---订单查询优化(1):视图优化+索引创建
订单的表结构采用了垂直分表的策略,将订单相关的不同模块的字段维护在不同表中 在订单处理这个页面,需要查询各种维度, 因此为了方便查询创建了v_sale_order视图(老版本) drop view v ...
- 【mysql优化】大数据量分页优化
limit 翻页原理 limit offset,N, 当offset非常大时, 效率极低, 原因是mysql并不是跳过offset行,然后单取N行, 而是取offset+N行,返回放弃前offset行 ...
- mysql优化之查询优化
Posted by Money Talks on 2012/02/24 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四片 查询优化第五篇 到实战中去 查询优化 查询优化涉及到用户查询数据时使用到 ...
- mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护
理想的索引,高效的索引建立考虑: :查询频繁度(哪几个字段经常查询就加上索引) :区分度要高 :索引长度要小 : 索引尽量能覆盖常用查询字段(如果把所有的列都加上索引,那么索引就会变得很大) : 索引 ...
- MySQL——优化嵌套查询和分页查询
优化嵌套查询 嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.嵌套查询写起来简单,也容易理解.但是,有时候可以被更有效率的连接(JOIN ...
- [MySQL优化案例]系列 — 分页优化
通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询.例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY ...
- MySQL优化 - 性能分析与查询优化(转)
出处: MySQL优化 - 性能分析与查询优化 优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载 ...
随机推荐
- HDU 2089:不要62(数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer) ...
- C++学习书籍推荐《More Effective C++》下载
百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...
- Windows 10打开远程桌面的方法
今天使用windows 10,想要用远程桌面连接,可是怎么都找不到,哎,win10相比于win7和XP系统,感觉还是有点使用不习惯.不过后来还是找到了两个方法,在此记录下来,分享给需要的朋友. 1. ...
- android_MultiAutoCompleteTextView
package cn.com.sxp;import android.app.Activity;import android.os.Bundle;import android.view.View;imp ...
- Netty-Channel架构体系源码解读
全文围绕下图,Netty-Channel的简化版架构体系图展开,从顶层Channel接口开始入手,往下递进,闲言少叙,直接开撸 概述: 从图中可以看到,从顶级接口Channel开始,在接口中定义了一套 ...
- Kubernetes1.15 部署 coredns
coredns.yaml文件如下所示 # __MACHINE_GENERATED_WARNING__ apiVersion: v1 kind: ServiceAccount metadata: nam ...
- k8s学习 - 概念 - Deployment
k8s学习 - 概念 - Deployment 有了 ReplicaSet 还需要有 Deployment 的原因是希望有一个控制器能管理部署更新时候的版本控制问题.一个 Deployment 可以管 ...
- SpringBoot快速入门01--环境搭建
SpringBoot快速入门--环境搭建 1.创建web工程 1.1 创建新的工程. 1.2 选择maven工程,点击下一步. 1.3 填写groupid(maven的项目名称)和artifacti ...
- 创建 gif
1.动态创建 <Container name="layLoading"/> if (m_pLoadingGif == NULL) { m_pLoadingGif ...
- 常用的re模块的正则匹配的表达式
07.01自我总结 常用的re模块的正则匹配的表达式 一.校验数字的表达式 1.数字 ^[0-9]\*$ 2.n位的数字 ^\d{n}$ 3.至少n位的数字 ^\d{n,}$ 4.m-n位的数字 ^\ ...