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 - 1) * 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

  

时间: 2024-10-25 01:25:30

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

mysql优化之查询优化

Posted by Money Talks on 2012/02/24 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四片 查询优化第五篇 到实战中去 查询优化 查询优化涉及到用户查询数据时使用到的索引.排序.group 等操作,以及其书写习惯.(原文链接http://ddbiz.com/?p=990) 影响查询的服务器参数调整 除了用户的查询习惯外,在整个数据查询的处理期间,mysql服务器中有些参数同样影响这些查询的执行,比如临时表.临时文件等. max_heap_table_size

Mysql 优化之延迟索引和分页优化

什么是延迟索引?使用索引查询出来数据,之后把查询结果和同一张表中数据进行连接查询,进而提高查询速度! 分页是一个很常见功能,select   **  from tableName limit  ($page -  1 )  * $n ,$n 通过一个存储过程进行测试: create table smth1 ( id int auto_increment , ver int(11) default null, content varchar(1000) not null, intro varcha

MySQL优化 - 性能分析与查询优化

MySQL优化 - 性能分析与查询优化 优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载选择合理的硬件配置等. 1.性能分析 性能分析包含多方面:CPU.Memory.磁盘/网络IO.MySQL服务器本身等. 1.1 操作系统分析 常规的操作系统分析,在Linux中通常包含一些性能监控命令,如top.vmstat.iostat.strace.iptraf等. 1.内存:内存是大项,高查询消耗大量

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

出处:  MySQL优化 - 性能分析与查询优化 优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载选择合理的硬件配置等. 1.性能分析 性能分析包含多方面:CPU.Memory.磁盘/网络IO.MySQL服务器本身等. 1.1 操作系统分析 常规的操作系统分析,在Linux中通常包含一些性能监控命令,如top.vmstat.iostat.strace.iptraf等. 1.内存:内存是大项,高查

MySQL单表百万数据记录分页性能优化

原文地址:http://www.cnblogs.com/lyroge/p/3837886.html MySQL单表百万数据记录分页性能优化 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 use infomation_schemaSELECT * FROM TABLES WHERE TABLE_SCHEMA = 'dbna

mysql优化笔记之分页

过年闲得蛋疼,于是看看mysql优化,看了网上好多关于分页的优化方法,但是呢,我亲自试上一把的时候,没有出现他们说的现象...难道是我的机器问题么? 下面看看我的实践记录,希望看到的加入进来交流一下O(∩_∩)O~ 以下采用常规分页和网上大伙都提倡的做法: offset较小时: 常规做法 可以看出当limit offset较小时分页用常规做法的执行时间是0.01s. 当limit offset较小时采用另一种特殊的方法,在这种情况下,确实是符合大伙的推荐做法,即在 limit offset 较小

php+Mysql 优化,百万至千万级快速分页

php+Mysql 优化,百万至千万级快速分页 MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始.有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发.可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!好了,不那么多废话了.用事实说话,看例子: 数据表 collect ( id,

MVC 简单的AJAX异步分页+MYSQL

留资料,以后学习用 1.后台 public ActionResult textPage() { return View(); } [HttpPost] public ActionResult textPage(FormCollection collection) { //实例化对象 BLL.pc_dialog bll_pcdialog = new BLL.pc_dialog(); Model.pc_dialog model_pcdialog = new Model.pc_dialog(); //

单表60亿记录等大数据场景的MySQL优化和运维之道

此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据存储平台建设和架构设计.前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存储选型设计. 前言 MySQL数据库大家应该都很熟悉,而且随着前几年的阿里的去IOE,MySQL逐渐引起更多人的重视. MySQL历史 1979年,Monty Widenius写了最初的版本,