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

8個SQL錯誤:您是否犯了這些錯誤?

數據庫 SQL Server
SQL編程既令人興奮又具有挑戰性。 即使是經驗豐富的SQL程序員,開發人員和數據庫管理員(DBA)有時也要面對SQL語言的挑戰。 本文旨在幫助用戶識別此類嚴重錯誤并學習克服它們。

 SQL編程既令人興奮又具有挑戰性。 即使是經驗豐富的SQL程序員,開發人員和數據庫管理員(DBA)有時也要面對SQL語言的挑戰。 本文旨在幫助用戶識別此類嚴重錯誤并學習克服它們。

[[331839]]

讓我們深入研究以下幾節中最嚴重的8個SQL錯誤。

1)LIMIT語句

分頁查詢是最常見的情況之一,但也是一個非常普遍的問題。 例如,對于以下簡單語句,DBA通常為type,name和create_time字段添加復合索引。 這種條件排序可有效使用索引并快速提高性能。 這是90%以上的DBA解決此問題的常用方法。 但是,當LIMIT子句更改為" LIMIT 1000000,10"時,程序員經常抱怨僅檢索10條記錄會花費太長時間。 發生這種情況是因為數據庫不知道第1,000,000條記錄從何處開始。 因此,即使索引可用,也必須從頭開始計算。 通常由于程序員的懶惰而導致出現此性能問題。 在前端數據瀏覽和分頁或大數據的批量導出之類的方案中,可以將上一頁的最大值用作查詢條件。 重寫SQL代碼,如下所示:

8個SQL錯誤:您是否犯了這些錯誤?

使用新設計,查詢時間基本上是固定的,并且不會隨著數據量的增加而改變。

2)隱式轉換

當查詢變量與SQL語句中的字段定義類型不匹配時,會發生另一種常見錯誤。 以下語句就是這樣的一個例子:

8個SQL錯誤:您是否犯了這些錯誤?

bpn字段定義為varchar(20),MySQL策略是在比較之前將字符串轉換為數字。 當函數作用于表字段時,索引變為無效。 前面的問題可能是由應用程序框架自動完成的參數引起的,而不是由于程序員的有意識的錯誤。 當前,許多應用程序框架都很復雜。 盡管它們使用起來非常方便,但是您還必須意識到它們可能引起的潛在問題。

3)更新和刪除加入

盡管實例化功能是MySQL 5.6中引入的,但是請注意,目前僅針對查詢語句進行了優化。 手動將UPDATE或DELETE語句重寫為JOIN語句。

例如,在下面的UPDATE語句中,MySQL實際上運行循環或嵌套子查詢(DEPENDENT SUBQUERY),并且執行時間相對較長。

8個SQL錯誤:您是否犯了這些錯誤?

考慮以下執行計劃。

8個SQL錯誤:您是否犯了這些錯誤?

將語句重寫為JOIN語句后,子查詢選擇模式將從DEPENDENT SUBQUERY更改為DERIVED,從而將所需時間從7秒減少到2毫秒。

8個SQL錯誤:您是否犯了這些錯誤?

請參考以下簡化的執行計劃。

8個SQL錯誤:您是否犯了這些錯誤?

4)混合排序

MySQL不能將索引用于混合排序。 但是,在某些情況下,用戶仍然可以使用特殊方法來提高性能。

8個SQL錯誤:您是否犯了這些錯誤?

執行計劃以全表掃描形式呈現。

由于is_reply在按照方法重寫后僅具有狀態0和1,因此執行時間從1.58秒減少到2毫秒。

8個SQL錯誤:您是否犯了這些錯誤?

5)EXISTS 陳述

MySQL仍然使用嵌套子查詢來處理EXISTS子句。 例如,考慮下面的SQL語句:

8個SQL錯誤:您是否犯了這些錯誤?

請參考以下執行計劃。

8個SQL錯誤:您是否犯了這些錯誤?

將EXISTS語句更改為JOIN語句可避免嵌套子查詢,并將執行時間從1.93秒減少到1毫秒。

8個SQL錯誤:您是否犯了這些錯誤?

考慮下面的新執行計劃。

8個SQL錯誤:您是否犯了這些錯誤?

6)有條件下推

在以下情況下,無法將外部查詢條件下推到復雜視圖或子查詢:

  • 匯總子查詢
  • LIMIT個子查詢
  • UNION或UNION ALL子查詢
  • 輸出字段中的子查詢

在以下語句的執行計劃中,請注意,條件在聚集子查詢之后起作用。

8個SQL錯誤:您是否犯了這些錯誤?

 

8個SQL錯誤:您是否犯了這些錯誤?

確保直接向下推語義查詢條件,然后將其重寫如下:

 8個SQL錯誤:您是否犯了這些錯誤?

請參考以下更新的執行計劃。

8個SQL錯誤:您是否犯了這些錯誤?

7)提前縮小范圍

從初始SQL語句開始,如下所示。

8個SQL錯誤:您是否犯了這些錯誤?

數量為900,000,執行時間為12秒。

8個SQL錯誤:您是否犯了這些錯誤?

由于最后一個WHERE條件和排序是在最左邊的主表上執行的,因此在執行左連接之前,首先要縮小數據量以進行my_order排序。 如下所示重寫SQL語句后,執行時間減少到大約1毫秒。

8個SQL錯誤:您是否犯了這些錯誤?

查看執行計劃。 實現子查詢后,select_type = DERIVED參與JOIN操作。 盡管估計要掃描的行數仍為900,000,但在應用索引和LIMIT子句后,實際的執行時間會減少。

8個SQL錯誤:您是否犯了這些錯誤?

8)下推中間結果集

讓我們看一下以下最初優化的示例(查詢條件首先作用于左聯接中的主表):

8個SQL錯誤:您是否犯了這些錯誤?

此聲明還有其他問題嗎? 不難看出,子查詢c是全表聚合查詢。 因此,當表的數量特別多時,整個語句的性能會下降。

實際上,對于子查詢c,左聯接的最終結果集僅與匹配主表resourceid的數據有關。 因此,按如下所示重寫該語句,以將執行時間從2秒減少到2毫秒。

8個SQL錯誤:您是否犯了這些錯誤?

但是,子查詢多次出現在SQL語句中。 此方法不僅會導致額外的開銷,而且會使整個語句更加復雜。 使用WITH語句再次重寫該語句。

8個SQL錯誤:您是否犯了這些錯誤?

摘要

數據庫編譯器生成一個執行計劃,該計劃確定SQL語句的實際執行方法。 但是,編譯器僅盡其所能提供服務,而沒有哪個數據庫編譯器是完美的。

在大多數上述情況下,其他數據庫中也會出現性能問題。 您必須了解數據庫編譯器的功能,以避免其缺點并編寫高性能的SQL語句。

在設計數據模型和編寫SQL語句時,請結合您的算法思想和認識。 例如,在編寫復雜的SQL語句時,請盡可能使用WITH子句。 簡單明了的SQL語句還可以減輕數據庫的負擔。

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2021-06-11 09:33:33

索引SQL語句

2023-04-24 08:11:02

圖片alt語音

2016-10-18 10:55:03

java調試問題

2022-09-20 10:22:00

CIOIT業務管理者

2012-05-02 09:16:49

ERP

2025-06-26 08:12:11

2010-05-24 09:11:13

Facebook隱私政策

2020-12-17 10:55:54

SQL數據庫語言

2021-01-01 14:37:51

SQL數據庫語言

2023-07-14 07:05:27

優化首席信息官IT

2021-01-14 21:37:01

JavaScript開發代碼

2016-03-17 16:57:39

SaaSSaaS公司指標

2019-11-07 21:17:07

數字化轉型公司

2022-09-28 08:40:52

CIO工具軟件

2019-05-31 15:10:33

SQL數據庫MySQL

2024-04-22 13:54:28

url代碼緩存

2019-09-21 21:32:34

數據庫SQL分布式

2013-07-09 13:52:31

程序員Android

2012-07-06 09:05:22

2022-05-11 09:04:50

Go函數數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 人人玩人人干 | 一区二区三区影院 | 亚洲日韩中文字幕一区 | 日韩精品在线免费观看视频 | 精品国产免费一区二区三区五区 | 精品欧美在线观看 | 欧美精品黄 | 国产欧美在线一区 | 黄色一级大片在线免费看产 | 国产一区二区毛片 | 一区影视 | 91在线一区| 日韩欧美一区二区三区免费观看 | 久久精品色欧美aⅴ一区二区 | 国产一区二区视频免费在线观看 | 日韩和的一区二在线 | 91色视频在线 | 中文日本在线 | 91在线视频观看 | 国产成人福利 | 国产精品一区二区三区在线 | 国产精品揄拍一区二区久久国内亚洲精 | 在线视频三区 | 中文字幕免费 | 成人福利在线观看 | 色视频在线播放 | 日本污视频 | 亚洲天堂中文字幕 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 午夜影院网站 | 欧美日韩综合 | 国产成人99av超碰超爽 | 免费黄色在线 | 国产精品1区2区 | 精品国产精品一区二区夜夜嗨 | 国产黄色在线观看 | 亚洲444eee在线观看 | 久久国产精品视频免费看 | 91视频久久| 免费看欧美一级片 | 亚洲 欧美 日韩在线 |