JAVA 提高查詢效率,sql優化


問題

在前端像后端請求數據時,后台查詢時間過久,導致傳輸超時

解決思路

  1. 增加超時時間(治標不治本)
  2. 找到后台查詢時間久的原因(在前端請求后台的接口上,給調用的方法打上時間戳,以此來找到對應耗時的方法,以及耗時的時間)

過程

經過時間戳的增加,發現,后台查詢數據過久的原因,在於,查詢數據庫上。
本人查詢數據庫的方式

List<Order> orderList = new ArrayList();
List<User> userList = userDao.selectByType(type);
for(User user : userList){
      Order order = orderDao.selectByUser(user.getId());
      orderList.add(order);
}
return orderList;

由此可以發現,問題出現在,對兩個表的查詢操作,用,先查詢一個表獲得數據,再循環遍歷數據查詢另外一個表。導致時間耗費久。
對於兩個表的查詢操作,可以通過多表聯查來進行。
多表聯查,推薦博客https://www.cnblogs.com/shineguang/p/11354570.html

在查找優化過程的時候,也找到了一些使用sql的小方法

  1. 寫好 where,縮短查詢范圍
  2. select 指定獲取的字段 ,而不是 *
  3. sql 模糊查詢的配合變量的方式 (LIKE CONCAT('%', 變量名 , '%'))
  4. 判斷空值,設為 0,IFNULL(進行判斷的屬性名 , 0)

結果

最后使用的 sql 語句,時間優化(從原來的 3.5s 提升到 0.3s)

SELECT
	sys.`id` id ,sys.`real_name` NAME, 
	IFNULL( a.`finish`,0) finish,
	IFNULL(b.`unfinish`,0) unfinish 
	FROM sys_user sys
	LEFT JOIN (
	SELECT 
        sys_user.`id` id,
        sys_user.`real_name`,
        COUNT( * ) AS finish
        FROM sys_user 
        LEFT JOIN wo_order ON  wo_order.`handler_user_ids` LIKE CONCAT('%' , sys_user.`id` , '%')
        WHERE 
        sys_user.`org_code`='1300B00' AND
        sys_user.`is_handle_user` != 0 AND
        
        wo_order.`create_time` BETWEEN '2020-00-00 16:54:21' AND '2020-12-30 16:54:21'
        GROUP BY sys_user.`id`
        ) AS a ON sys.`id`=a.`id`
        LEFT JOIN(
		SELECT 
        sys_user.`id` id,
        sys_user.`real_name`,
        COUNT( * ) AS unfinish
        FROM sys_user 
        LEFT JOIN wo_order ON  wo_order.`handler_user_ids` LIKE CONCAT('%', sys_user.`id` , '%')
        WHERE 
        sys_user.`org_code`='1300B00' AND
        sys_user.`is_handle_user` != 0 AND
        wo_order.`handling_status` = 20 AND
        wo_order.`create_time` BETWEEN '2020-00-00 16:54:21' AND '2020-12-30 16:54:21'
        
        GROUP BY sys_user.`id`
        )AS b ON sys.`id` = b.`id`
        
        WHERE
        sys.`org_code`='1300B00' AND
        sys.`is_handle_user` != 0 
        ORDER BY a.`finish` DESC;


免責聲明!

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



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