亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mysql優(yōu)化系列 DELETE子查詢改寫優(yōu)化

 更新時間:2016年08月31日 11:20:32   投稿:mdxy-dxy  
有個采用子查詢的DELETE執(zhí)行得非常慢,改寫成SELECT后執(zhí)行卻很快,最后把這個子查詢DELETE改寫成JOIN優(yōu)化過程

1、問題描述

朋友遇到一個怪事,一個用子查詢的DELETE,執(zhí)行效率非常低。把DELETE改成SELECT后執(zhí)行起來卻很快,百思不得其解。

下面就是這個用了子查詢的DELETE了:

[yejr@imysql.com]mydb > EXPLAIN delete from trade_info where id in (
select id from (
select a.id from trade_info a, order_info b, user c where
b.buyer = c.id and c.itv_account='90000248′ and a.order_id = b.id) temp)\G

delete1

幾個表的DDL是這樣的:

delete2

上面這個SQL的執(zhí)行耗時是:31.74秒
Query OK, 5 rows affected (31.74 sec)
如果我們把DELETE改寫成SELECT的話,執(zhí)行耗時僅是:0秒,來對比看下執(zhí)行計劃:

[yejr@imysql.com]mydb >EXPLAIN select id from trade_info where
id in (
select id from (
select a.id from trade_info a, order_info b, user c where
b.buyer = c.id and c.itv_account='90000248′ and a.order_id = b.id) temp)\G

delete3

可以看到,trade_info 表從的全表掃描(type=ALL)變成了基于主鍵的等值查詢(type=eq_ref),計劃掃描數(shù)據(jù)量也從571萬變成了1條,而且還可以避免回表,這2個SQL對比代價相差巨大。

2、優(yōu)化思路

既然這個SQL把DELETE改成SELECT后執(zhí)行效率就可以獲得很大提升,除此外沒特別區(qū)別,可能是查詢優(yōu)化器方面有些不足,導(dǎo)致無法直接優(yōu)化,就得另想辦法了。
我們的思路是把基于子查詢的DELETE簡化改寫成多表JOIN后DELETE(一般來說,子查詢效率比較低的話,可以考慮改寫成JOIN),多表DELETE的語法課參考:https://dev.mysql.com/doc/refman/5.7/en/delete.html#idm140469624466800,例如這樣的:

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

參照上面的形式,改寫之后的SQL變成了下面這樣:

DELETE trade_info
FROM
trade_info,
(
SELECT
a.id
FROM
trade_info a
JOIN order_info b ON a.order_id = b.id
JOIN user c ON b.buyer = c.id
WHERE
c.itv_account = ‘90000248'
) t2 where trade_info.id = t2.id;

delete4

可以看到新的SQL執(zhí)行效率相對就高很多了,不需要再掃描571萬條記錄,執(zhí)行耗時只需:0.01秒。

Query OK, 5 rows affected (0.01 sec)

3、其他建議

雖然MySQL 5.6及以上的版本對子查詢做了優(yōu)化,但從本案例的結(jié)果來看,在一些情況下還是不如意。
因此,如果發(fā)現(xiàn)有些子查詢SQL效率比較差的話,可以嘗試改寫成JOIN形式,看看是否有所提升。此外,也要勇于懷疑查詢優(yōu)化器個別情況下存在不足,想辦法繞過這些坑。

相關(guān)文章

  • mysql中l(wèi)imit查詢踩坑實戰(zhàn)記錄

    mysql中l(wèi)imit查詢踩坑實戰(zhàn)記錄

    在MySQL中我們常常用order by來進行排序,使用limit來進行分頁,下面這篇文章主要給大家介紹了關(guān)于mysql中l(wèi)imit查詢踩坑的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • MySQL索引優(yōu)化實例分析

    MySQL索引優(yōu)化實例分析

    這篇文章主要介紹了MySQL索引優(yōu)化實例分析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • 淺談Mysql insert on duplicate key 死鎖問題定位與解決

    淺談Mysql insert on duplicate key 死鎖問

    本文介紹了在并發(fā)場景下的 insert on duplicate key update sql 出現(xiàn)的死鎖,經(jīng)過分析發(fā)現(xiàn)這種sql確實比較容易造成死鎖,這篇文章就從分析死鎖展開,到最終如何解決這樣的問題 分享相應(yīng)的思路,感興趣的可以了解一下
    2022-05-05
  • MySQL如何優(yōu)雅的刪除大表實例詳解

    MySQL如何優(yōu)雅的刪除大表實例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL如何優(yōu)雅的刪除大表的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • MySQL如何修改字段類型和字段長度

    MySQL如何修改字段類型和字段長度

    這篇文章主要介紹了MySQL如何修改字段類型和字段長度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • mysql服務(wù)1067錯誤多種解決方案分享

    mysql服務(wù)1067錯誤多種解決方案分享

    今天我的mysql服務(wù)器突然出來了1067錯誤提示,無法正常啟動了,我今天從網(wǎng)上找尋了大量的解決mysql服務(wù)1067錯誤的辦法,有需要的朋友可以看看
    2012-03-03
  • mysql 登錄時閃退的問題解決方法

    mysql 登錄時閃退的問題解決方法

    這篇文章主要介紹了mysql 登錄時閃退的問題解決方法的相關(guān)資料,mysql 出現(xiàn)閃退問題,很是棘手在做項目的時候,這里對解決這樣的問題提供了解決方案,需要的朋友可以參考下
    2016-11-11
  • MySQL檢索數(shù)據(jù)操作方法梳理

    MySQL檢索數(shù)據(jù)操作方法梳理

    SELECT語句是SQL中最常用的語句。它的用途是從一個或多個表中檢索信息。為了使用SELECT檢索表數(shù)據(jù),必須至少給出兩條信息:想選擇什么、從什么地方選擇
    2022-10-10
  • MySQL 常見的數(shù)據(jù)表設(shè)計誤區(qū)匯總

    MySQL 常見的數(shù)據(jù)表設(shè)計誤區(qū)匯總

    雖然會有一些常規(guī)意義上的數(shù)據(jù)表錯誤設(shè)計和優(yōu)秀設(shè)計原則,但是同樣也會有 MySQL 特定的一些情況,這會導(dǎo)致我們犯一些 MySQL 特定的錯誤。本篇討論常見的設(shè)計誤區(qū)。
    2021-06-06
  • 使用JDBC連接Mysql數(shù)據(jù)庫會出現(xiàn)的問題總結(jié)

    使用JDBC連接Mysql數(shù)據(jù)庫會出現(xiàn)的問題總結(jié)

    這篇文章主要給大家介紹了關(guān)于使用JDBC連接Mysql數(shù)據(jù)庫會出現(xiàn)的問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10

最新評論