成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一次顯著的性能提升,從8s到0.7s

數(shù)據(jù)庫 其他數(shù)據(jù)庫
發(fā)現(xiàn)spu表走了全表掃描,sku表走了eq_ref類型的索引,而mall_sku和supplier_sku表走了ref類型的索引。可以看出,有時候sql語句走了4個索引,性能未必比走了3個索引好。

前言

最近我在公司優(yōu)化了一些慢查詢SQL,積累了一些SQL調(diào)優(yōu)的實戰(zhàn)經(jīng)驗。

這篇文章從實戰(zhàn)的角度出發(fā),給大家分享一下如何做SQL調(diào)優(yōu)。

經(jīng)過兩次優(yōu)化之后,慢SQL的性能顯著提升了,耗時從8s優(yōu)化到了0.7s。

現(xiàn)在拿出來給大家分享一下,希望對你會有所幫助。

1 案發(fā)現(xiàn)場

前幾天,我收到了一封報警郵件,提示有一條慢查詢SQL。

我打開郵件查看了詳情,那條SQL大概是這樣的:

SELECT count(*)
FROM spu s1
WHERE EXISTS (
 SELECT *
 FROM sku s2
  INNER JOIN mall_sku s3 ON s3.sku_id = s2.id
 WHERE s2.spu_id = s1.id
  AND s2.status = 1
  AND NOT EXISTS (
   SELECT *
   FROM supplier_sku s4
   WHERE s4.mall_sku_id = s3.id
    AND s4.supplier_id = 123456789
    AND s4.status = 1
  )
)

這條SQL的含義是統(tǒng)計id=123456789的供應(yīng)商,未發(fā)布的spu數(shù)量是多少。

這條SQL的耗時竟然達(dá)標(biāo)了8s,必須要做優(yōu)化了。

我首先使用explain關(guān)鍵字查詢該SQL的執(zhí)行計劃,發(fā)現(xiàn)spu表走了type類型的索引,而sku、mall_sku、supplier_sku表都走了ref類型的索引。

也就是說,這4張表都走了索引。

不是簡單的增加索引,就能解決的事情。

那么,接下來該如何優(yōu)化呢?

2 第一次優(yōu)化

這條SQL語句,其中兩個exists關(guān)鍵字引起了我的注意。

一個exists是為了查詢存在某些滿足條件的商品,另一個not exists是為了查詢出不存在某些商品。

這個SQL是另外一位已離職的同事寫的。

不清楚spu表和sku表為什么不用join,而用了exists。

我猜測可能是為了只返回spu表的數(shù)據(jù),做的一種處理。如果join了sku表,則可能會查出重復(fù)的數(shù)據(jù),需要做去重處理。

從目前看,這種寫性能有瓶頸。

因此,我做出了第一次優(yōu)化。

使用join + group by組合,將sql優(yōu)化如下:

SELECT count(*) FROM
(
  select s2.spu_id from spu s1
  inner join from sku s2
  inner join mall_sku s3 on s3.sku_id=s2.id
  where s2.spu_id=s1.id ans s2.status=1
  and not exists 
  (
     select * from supplier_sku s4
     where s4.mall_sku_id=s3.id
     and s4.supplier_id=
  )
  group by s2.spu_id
) a

由于spu_id在sku表中是增加了索引的,因此group by的性能其實是挺快的。

這樣優(yōu)化之后,sql的執(zhí)行時間變成了2.5s。

性能提升了3倍多,但是還是不夠快,還需要做進(jìn)一步優(yōu)化。

3 第二次優(yōu)化

還有一個not exists可以優(yōu)化一下。

如果是小表驅(qū)動大表的時候,使用not exists確實可以提升性能。

但如果是大表驅(qū)動小表的時候,使用not exists可能有點弄巧成拙。

這里exists右邊的sql的含義是查詢某供應(yīng)商的商品數(shù)據(jù),而目前我們平臺一個供應(yīng)商的商品并不多。

于是,我將not exists改成了not in。

sql優(yōu)化如下:

SELECT count(*) FROM
(
  select s2.spu_id from spu s1
  inner join from sku s2
  inner join mall_sku s3 on s3.sku_id=s2.id
  where s2.spu_id=s1.id ans s2.status=1
  and s3.id not IN 
  (
     select s4.mall_sku_id 
     from supplier_sku s4
     where s4.mall_sku_id=s3.id
     and s4.supplier_id=
  )
  group by s2.spu_id
) a

這樣優(yōu)化之后,該sql的執(zhí)行時間下降到了0.7s。

之后,我再用explain關(guān)鍵字查詢該SQL的執(zhí)行計劃。

發(fā)現(xiàn)spu表走了全表掃描,sku表走了eq_ref類型的索引,而mall_sku和supplier_sku表走了ref類型的索引。

可以看出,有時候sql語句走了4個索引,性能未必比走了3個索引好。

多張表join的時候,其中一張表走了全表掃描,說不定整個SQL語句的性能會更好,我們一定要多測試。

說實話,SQL調(diào)優(yōu)是一個比較復(fù)雜的問題,需要考慮的因素有很多,有可能需要多次優(yōu)化才能滿足要求。

責(zé)任編輯:武曉燕 來源: 蘇三說技術(shù)
相關(guān)推薦

2025-02-14 09:30:42

2021-08-26 22:26:55

性能優(yōu)化技術(shù)

2022-06-29 09:43:14

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

2020-12-01 07:00:10

K8S集群

2021-07-14 10:39:28

JqueryVue 編程

2021-08-20 11:35:04

服務(wù)運維 故障

2023-12-05 08:33:44

滴滴故障k8s

2020-08-10 11:00:02

Python優(yōu)化代碼

2020-11-02 13:44:56

CentOSK8SLinux

2019-08-12 08:36:33

K8S網(wǎng)絡(luò)Pod

2020-02-23 17:15:29

SQL分析查詢

2022-02-23 08:01:04

KubernetesK8sPod

2015-07-17 10:04:33

MKMapView優(yōu)化

2022-06-16 10:33:14

代碼AI

2025-07-03 07:00:00

運維K8s磁盤

2024-10-16 12:45:01

2023-05-14 17:16:22

分類樹SpringBoot

2011-06-28 10:41:50

DBA

2020-09-23 10:40:50

Centos7k8sJava

2023-09-11 15:35:25

點贊
收藏

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

主站蜘蛛池模板: 亚洲精品久久久久久久久久久久久 | 亚洲国产精品一区二区久久 | 日韩免费一区二区 | 成人免费在线播放视频 | 国产国产精品久久久久 | 国产成人综合网 | 午夜免费在线观看 | 日本亚洲一区 | 美国一级片在线观看 | 国产精品九九九 | 精品中文视频 | 久久福利网站 | 中文字幕日韩一区 | 日本不卡一区二区 | 日韩欧美专区 | 久久久黑人 | 在线免费观看成人 | 欧美一级毛片在线播放 | 91精品国产乱码久久蜜臀 | 国产日韩免费观看 | 久草资源网站 | 成人性视频免费网站 | 精品一区在线免费观看 | 国产精品一区二区三区四区 | 91视视频在线观看入口直接观看 | 伊人免费在线观看 | 久久精品国产清自在天天线 | 成人欧美一区二区三区色青冈 | 永久看片 | 高清欧美性猛交xxxx黑人猛交 | 亚洲第一视频 | 精品久久久久久久 | 亚洲高清视频一区二区 | 综合视频在线 | 丁香六月伊人 | 米奇7777狠狠狠狠视频 | 欧美日韩国产精品激情在线播放 | 日本精品一区二区三区在线观看 | 黑人巨大精品欧美一区二区免费 | 日韩在线免费观看视频 | www成人啪啪18 |