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);
		}
	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM