zoukankan      html  css  js  c++  java
  • SQL优化 COUNT()优化 SUM(ID='ID')替代COUNT()

    SQL优化 COUNT()优化 COUNT(*)优化 SUM(ID=‘ID’)替代COUNT()

    平时使用count来计算数据库中的数据的数量,
    但是在数据量大的时候考虑用sum。
    以下的例子是在一千万的表中查询数据,结果是采用连续查询五次的平均值,
    可以发现:
    1.在只是查询一个结果的时候,count的时间和sum的时间是相差很小,
    不过我的项目部署上线测试发现,实际上count的效率比count的效率高,
    具体原因暂时也没想明白。
    2.如果是查询多个结果,用sum的效率是比count的效率高很多的,而且sql语句也比较

    1.第一次测试是采用count(*)

    public void test33() {
    		Connection conn = new ConnectionManager().newConnection();
            PreparedStatement ps = null;
            String sql = "";
            int count = 0;
            try {
            	Long start = System.currentTimeMillis();
    			sql = "SELECT COUNT(*) FROM `mmscm`.uuidtest WHERE ACCOUNT_NO=? AND USERID=?" ;
    			ps = conn.prepareStatement(sql);
    			ps.setString(1, "Jim");
    			ps.setString(2, "demo2");
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
    				count = rs.getInt("COUNT(*)");
    			}
    			System.out.println("count: "+count);
    			Long end = System.currentTimeMillis();
    			System.out.println("time: "+(end-start));
    			
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    	}
    

    运行结果:count: 9899990
    time: 12006

    2.第二次是采用count(主键名)

    public void test34() {
    		Connection conn = new ConnectionManager().newConnection();
            PreparedStatement ps = null;
            String sql = "";
            int count = 0;
            try {
            	Long start = System.currentTimeMillis();
    			sql = "SELECT COUNT(ACCOUNT_NO) FROM `mmscm`.uuidtest WHERE ACCOUNT_NO=? AND USERID=?" ;
    			ps = conn.prepareStatement(sql);
    			ps.setString(1, "Jim");
    			ps.setString(2, "demo2");
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
    				count = rs.getInt("COUNT(ACCOUNT_NO)");
    			}
    			System.out.println("count: "+count);
    			Long end = System.currentTimeMillis();
    			System.out.println("time: "+(end-start));
    			
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    	}
    

    运行结果:count: 9899990
    time: 12177

    3.第三次是用sum(列名=条件)查询

    public void test35() {
    		Connection conn = new ConnectionManager().newConnection();
            PreparedStatement ps = null;
            String sql = "";
            int count = 0;
            try {
            	Long start = System.currentTimeMillis();
    			sql = "SELECT IFNULL(SUM(USERID='demo2'),0) AS TOTAL "
    					+ "FROM `mmscm`.uuidtest WHERE ACCOUNT_NO=? AND USERID=?" ;
    			ps = conn.prepareStatement(sql);
    //			ps.setString(1, "demo2");
    			ps.setString(1, "Jim");
    			ps.setString(2, "demo2");
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
    				count = rs.getInt("TOTAL");
    			}
    			System.out.println("count: "+count);
    			Long end = System.currentTimeMillis();
    			System.out.println("time: "+(end-start));
    			
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    	}
    

    运行结果:count: 9899990
    time: 12745

    4.如果需要同时查询几个结果,使用sum的效率会更快!

    public void test36() {
    		Connection conn = new ConnectionManager().newConnection();
            PreparedStatement ps = null;
            String sql = "";
            int count = 0;
            int count1 = 0;
            int count2 = 0;
            try {
            	Long start = System.currentTimeMillis();
    			sql = "SELECT IFNULL(SUM(USERID='demo2'),0) AS TOTAL2, IFNULL(SUM(USERID='demo1'),0) AS TOTAL1, "
    					+ "IFNULL(SUM(USERID='demo'),0) AS TOTAL "
    					+ "FROM `mmscm`.uuidtest WHERE ACCOUNT_NO=?" ;
    			ps = conn.prepareStatement(sql);
    			ps.setString(1, "Jim");
    //			ps.setString(2, "demo2");
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
    				count = rs.getInt("TOTAL");
    				count1 = rs.getInt("TOTAL1");
    				count2 = rs.getInt("TOTAL2");
    			}
    			System.out.println("count: "+count);
    			System.out.println("count1: "+count1);
    			System.out.println("count2: "+count2);
    			Long end = System.currentTimeMillis();
    			System.out.println("time: "+(end-start));
    			
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    	}
    
  • 相关阅读:
    偶感
    数据库脚本开发中应注意的事项
    事务与隔离级别笔记
    Spring MVC学习笔记
    Eclipse环境配置与快捷命令
    告别2016,展望2017
    待总结项
    常见问题汇总
    我的工具箱
    精品文章收藏
  • 原文地址:https://www.cnblogs.com/jimloveq/p/10609486.html
Copyright © 2011-2022 走看看