關於SQL優化

来源:https://www.cnblogs.com/qq1455453805/archive/2019/10/11/11655144.html
-Advertisement-
Play Games

建立索引常用的規則 表的主鍵、外鍵必須有索引; 數據量超過300的表應該有索引; 經常與其他表進行連接的表,在連接欄位上應該建立索引; 經常出現在Where子句中的欄位,特別是大表的欄位,應該建立索引; 索引應該建在選擇性高的欄位上; 索引應該建在小欄位上,對於大的文本欄位甚至超長欄位,不要建索引; ...


建立索引常用的規則

  • 表的主鍵、外鍵必須有索引;

  • 數據量超過300的表應該有索引;

  • 經常與其他表進行連接的表,在連接欄位上應該建立索引;

  • 經常出現在Where子句中的欄位,特別是大表的欄位,應該建立索引;

  • 索引應該建在選擇性高的欄位上;

  • 索引應該建在小欄位上,對於大的文本欄位甚至超長欄位,不要建索引;

  • 複合索引的建立需要進行仔細分析;儘量考慮用單欄位索引代替:

    A、正確選擇複合索引中的主列欄位,一般是選擇性較好的欄位;

    B、複合索引的幾個欄位是否經常同時以AND方式出現在Where子句中?單欄位查詢是否極少甚至沒有?如果是,則可以建立複合索引;否則考慮單欄位索引;

    C、如果複合索引中包含的欄位經常單獨出現在Where子句中,則分解為多個單欄位索引;

    D、如果複合索引所包含的欄位超過3個,那麼仔細考慮其必要性,考慮減少複合的欄位;

    E、如果既有單欄位索引,又有這幾個欄位上的複合索引,一般可以刪除複合索引;

  • 頻繁進行數據操作的表,不要建立太多的索引;

  • 刪除無用的索引,避免對執行計劃造成負面影響;

 以上是一些普遍的建立索引時的判斷依據。一言以蔽之,索引的建立必須慎重,對每個索引的必要性都應該經過仔細分析,要有建立的依據。

 因為太多的索引與不充分、不正確的索引對性能都毫無益處:在表上建立的每個索引都會增加存儲開銷,索引對於插入、刪除、更新操作也會增加處理上的開銷。

 另外,過多的複合索引,在有單欄位索引的情況下,一般都是沒有存在價值的;相反,還會降低數據增加刪除時的性能,特別是對頻繁更新的表來說,負面影響更大。

SQL優化

  • 對查詢進行優化,要儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

  • 應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描

  • 應儘量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描。

  • 應儘量避免在 where 子句中使用 or 來連接條件,如果一個欄位有索引,一個欄位沒有索引,將導致引擎放棄使用索引而進行全表掃描

  • 應儘量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描

  • 任何地方都不要使用 select * from t ,用具體的欄位列表代替“*”,不要返回用不到的任何欄位。

  • 儘量避免大事務操作,提高系統併發能力。

  • 儘量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫

資料庫事務

  事務的四個特性:原子性(Atomic)、一致性(Consistency)、隔離性(Isolation)和持久性(Durabiliy),簡稱為ACID

數據索引類型

  根據資料庫的功能,可以在資料庫設計器中創建四種索引:唯一索引、非唯一索引、主鍵索引和聚集索引。 儘管唯一索引有助於定位信息,但為獲得最佳性能結果,建議改用主鍵或唯一約束。

 

  唯一索引:

  唯一索引是不允許其中任何兩行具有相同索引值的索引。 當現有數據中存在重覆的鍵值時,大多數資料庫不允許將新創建的唯一索引與表一起保存。資料庫還可能防止添加將在表中創建重覆鍵值的新數據。

  例如,如果在 employee 表中職員的姓 (lname) 上創建了唯一索引,則任何兩個員工都不能同姓。

 

  非唯一索引:

  非唯一索引是相對唯一索引,允許其中任何兩行具有相同索引值的索引。 當現有數據中存在重覆的鍵值時,資料庫是允許將新創建的索引與表一起保存。這時資料庫不能防止添加將在表中創建重覆鍵值的新數據。

 

  主鍵索引:

  資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。 在資料庫關係圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。

  該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。

 

  聚集索引(也叫聚簇索引):

  在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。

  如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的[數據訪問]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "點我查看秘籍連載" 操作系統的服務埠:系統調用 用戶進程工作在用戶態,它是受限的,很多涉及到硬體的操作都無法執行,但是它們又想要取得結果,就只能請求工作在內核態的操作系統幫助完成這些操作,並將操作結果交給用戶進程。 系統調用 (system call)就是操作系統提供給用戶進程請求操作系統做一些 ...
  • 安裝最簡單的環境: apt-get install gnome-shell apt-get install gnome-panel apt-get install gnome-menus apt-get install gnome-session apt-get install gdm 安裝vncs ...
  • Samba服務: 本內容為samba服務學習者提供參考 案例描述: 某公司的管理員需要搭建SAMBA伺服器,IP地址及允許的訪問網段自定義。SAMBA伺服器的安全級別為user級,所在工作組為WORKGROUP,使添加的用戶可以訪問其個人目錄及共用目錄/smb_share,並可以對目錄讀、寫、執行。 ...
  • 背景分析 消息隊列這個類型的組件一直是非常重要的組件,當經過兩家企業後我就很堅信這個結論了。隊列這種東西,最廣泛的作用還是在於解耦,寬泛一點的說,它可以將不同部門的工作內容進行有效的整合,基於一個約定好的格式,就可以兩頭互相不幹擾的進行開發。可以說這個生產消費的思想不僅僅適用於程式也適用於非常多的地 ...
  • [20191011]拆分rowid 2.txt--//有了鏈接http://blog.itpub.net/267265/viewspace-2659612/=>[20191011]bash任意進位編碼表.txt --//轉化拆分rowid在bash變得非常容易,自己寫一個腳本看看.--//Rowid ...
  • 使用 Windows 身份驗證方式登錄 出現錯誤 無法連接到 本地伺服器 解決問題: SQL server配置管理器:服務遠程過程調用失敗 https://blog.csdn.net/gfjjggg/article/details/83721445 修改TCP/IP屬性:https://www.cn ...
  • 創建一個只讀用戶user2,只能查詢管理員用戶user1下的表,不能增刪改。 ...
  • mongodb中的全部數據: 查詢結果: 通過嵌入文檔中查詢指定title的數據,然後根據price排序,註意需要排序時將查詢的title也一併作為排序欄位,否則順序會錯亂。 查詢結果: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...