自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

問(wèn)題SQL優(yōu)化:從超過(guò)300s優(yōu)化到1s案例分析

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
今天發(fā)現(xiàn)有個(gè)項(xiàng)目應(yīng)用每次一啟動(dòng)后使用就會(huì)導(dǎo)致另外一個(gè)應(yīng)用服務(wù)直接崩潰,而這兩個(gè)應(yīng)用使用的是同個(gè)數(shù)據(jù)庫(kù),經(jīng)過(guò)排查可以發(fā)現(xiàn)是報(bào)表應(yīng)用的某個(gè)查詢功能導(dǎo)致,而咨詢開(kāi)發(fā)但卻查不出是哪條sql,那就只能靠自己排查了..下面是解決的大致過(guò)程。

概述

今天發(fā)現(xiàn)有個(gè)項(xiàng)目應(yīng)用每次一啟動(dòng)后使用就會(huì)導(dǎo)致另外一個(gè)應(yīng)用服務(wù)直接崩潰,而這兩個(gè)應(yīng)用使用的是同個(gè)數(shù)據(jù)庫(kù),經(jīng)過(guò)排查可以發(fā)現(xiàn)是報(bào)表應(yīng)用的某個(gè)查詢功能導(dǎo)致,而咨詢開(kāi)發(fā)但卻查不出是哪條sql,那就只能靠自己排查了..下面是解決的大致過(guò)程。

1、開(kāi)啟慢查詢

修改my.ini配置,增加參數(shù) 

  1. slow-query-log=1  
  2. slow_query_log_file="epms-slow.log"  
  3. long_query_time=10 

修改后重啟,觀察epms-slow.log日志內(nèi)容。

2、定位慢sql

重新點(diǎn)擊報(bào)表模塊,選擇日期后點(diǎn)擊查詢,等系統(tǒng)崩潰后,觀察日志涉及的慢查詢sql

發(fā)現(xiàn)問(wèn)題sql如下: 

  1. select id, parent, project, name  
  2.  from zentao.zt_task  
  3.  where parent = 0  
  4.  /*and exists (select t.parent from zentao.zt_task t where t.parent > 0)*/  
  5.  and id in (  
  6.  select t.parent from zentao.zt_task t where t.parent > 0  
  7.  ); 

3、查看執(zhí)行計(jì)劃 

  1. explain select id, parent, project, name  
  2.  from zentao.zt_task  
  3.  where parent = 0  
  4.  /*and exists (select t.parent from zentao.zt_task t where t.parent > 0)*/  
  5.  and id in (  
  6.  select t.parent from zentao.zt_task t where t.parent > 0  
  7.  ); 

這里可以看到因?yàn)樽叩娜珤撸看味紥?萬(wàn)條,產(chǎn)生笛卡爾積,5萬(wàn)*5萬(wàn)就導(dǎo)致數(shù)據(jù)庫(kù)崩潰了。

4、考慮用exists改寫(xiě)sql 

  1. explain select id, parent, project, name  
  2. from zentao.zt_task t  
  3. where parent = 0 and exists (  
  4. select a.parent from zentao.zt_task a where a.parent = t.id   

這里改寫(xiě)后問(wèn)題還是沒(méi)解決。

5、考慮with改寫(xiě)

后來(lái)發(fā)現(xiàn)zt_task表查詢了兩次,所以考慮with改寫(xiě)來(lái)簡(jiǎn)化,只查一次 

  1. WITH tmp AS ( SELECT * FROM zt_task ) SELECT  
  2. *   
  3. FROM  
  4.  tmp t1  
  5.  JOIN tmp t2 ON t1.id = t2.parent 

好吧,mysql5.7還不支持with改寫(xiě),只有到mysql 8版本才支持,所以這里只能放棄這種辦法了

6、用子查詢join改寫(xiě) 

  1. SELECT  
  2.  distinct t1.parent,  
  3.  t1.id,  
  4.  t1.project,  
  5.  t1.NAME   
  6. FROM  
  7.  zentao.zt_task t1  
  8.  JOIN ( SELECT t.parent FROM zentao.zt_task t WHERE t.parent > 0 ) ta ON t1.id = ta.parent   
  9.  AND t1.parent =0 

這里要記得去重,改寫(xiě)后查詢?cè)?秒內(nèi)得出結(jié)果,滿足需求。

總結(jié)

通過(guò)這道案例一定要記住,多表查詢的性能是很差的,當(dāng)然,性能差是有一個(gè)前提的:數(shù)據(jù)量大。子查詢 = 簡(jiǎn)單查詢 + 限定查詢 + 多表查詢 + 統(tǒng)計(jì)查詢的綜合體;

在之前強(qiáng)調(diào)過(guò)多表查詢不建議大家使用,因?yàn)樾阅芎懿?,但是多表查詢最有利的替代者就是子查詢,所以子查詢(子查詢指的就是在一個(gè)查詢之中嵌套了其他的若干查詢)在實(shí)際的工作之中使用的相當(dāng)?shù)亩唷?/p>

責(zé)任編輯:龐桂玉 來(lái)源: 今日頭條
相關(guān)推薦

2021-09-10 08:31:36

技術(shù)Prometheus監(jiān)控

2025-02-14 09:30:42

2022-09-27 08:40:44

慢查詢MySQL定位優(yōu)化

2022-07-05 10:50:31

數(shù)據(jù)庫(kù)查詢實(shí)戰(zhàn)

2020-02-23 17:15:29

SQL分析查詢

2023-05-14 17:16:22

分類樹(shù)SpringBoot

2023-12-25 08:24:03

雙異步數(shù)據(jù)庫(kù)Excel

2024-09-29 08:21:06

2020-01-16 18:30:07

技術(shù)SQL優(yōu)化

2022-06-29 09:43:14

SQL優(yōu)化數(shù)據(jù)庫(kù)

2024-10-28 07:00:00

分頁(yè)查詢優(yōu)化索引數(shù)據(jù)歸檔

2022-09-19 08:41:02

數(shù)據(jù)查詢分離

2024-05-28 08:47:52

2023-09-27 08:21:00

查詢分離數(shù)據(jù)API

2024-08-30 09:31:36

2022-06-30 19:40:36

查詢接口索引優(yōu)化

2022-08-14 14:32:06

接口優(yōu)化

2017-07-18 11:12:39

環(huán)境設(shè)置內(nèi)存分析Python

2024-03-04 08:29:33

數(shù)據(jù)定制化Java

2022-07-14 14:46:51

數(shù)據(jù)庫(kù)SQL系統(tǒng)設(shè)計(jì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)