sql優化提速整理

来源:https://www.cnblogs.com/xiaoXuZhi/archive/2019/10/25/xyh_sql_optimised.html
-Advertisement-
Play Games

我們實際開發中,隨著業務的不斷增加,數據量也在不斷的攀升,這樣就離不開一個問題:數據查詢效率優化 根據自己的以往實際項目工作經驗和學習所知,現在對SQL查詢優化做一個簡單的梳理總結,總結的不好之處,望多多指點交流學習 主要通過以下幾個點來進行總結分析:索引、語句本身、分區存儲、分庫分表 ...


sql優化提速整理

場景描述

在我們實際開發中,隨著業務的不斷增加,數據量也在不斷的攀升,這樣就離不開一個問題:數據查詢效率優化
根據自己的以往實際項目工作經驗和學習所知,現在對SQL查詢優化做一個簡單的梳理總結,總結的不好之處,望多多指點交流學習
主要通過以下幾個點來進行總結分析:索引、語句本身、分區存儲、分庫分表

索引

   在實際工作中,sql優化第一想到的應該就是索引,因為添加索引能夠很直觀的提升查詢效率,但是在添加索引的時也不是越多多好,下麵簡單總結一下索引的實際使用

  索引簡介

   關於索引的定義,在此不詳細說明,網上的資料很多。索引簡單的理解就是數據的目錄,就好比一個字典的目錄,其目的是提高查詢效率

  索引分類

    SQL索引根據存儲關係,分為兩類:聚合索引和非聚合索引

  聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚合索引的索引排序與表記錄的排序是一致的,非聚合索引正好相反。
  在一個表中,只會存在一個聚合索引,主鍵預設就是聚合索引,聚合索引的關鍵詞為:clustered
  創建聚合索引的SQL語句:

  ---- 根據數據表的欄位1、欄位2創建一個組合的聚合索引
  use 庫名
  create clustered index 索引名稱 on 表名(欄位1,欄位2)

 

  SQL索引根據使用關係,分為四類:主鍵索引、唯一索引、普通索引(組合索引)、全文索引
  主鍵索引:
  表的主鍵自動為主鍵索引,每條數據的唯一標識,一個表只有一個主鍵索引
  唯一索引:
  唯一索引也是確保數據的唯一性,一個表可以多有多個唯一索引,這也是和主鍵索引的區別所在
  創建唯一索引sql語句:  

create UNIQUE index 索引名稱 on 表名(欄位1,欄位2)

 

  普通索引:
  普通索引可以對任意欄位或者多個欄位添加索引

  

----創建普通索引sql語句:
  create index 索引名稱 on 表名(欄位1,欄位2) 

 

  索引創建技巧

   

動作描述

使用聚集索引 

 使用非聚集索引

 外鍵列

 應

 應

 主鍵列

 應

 應

 列經常被分組排序(order by)

 應

 應

 返回某範圍內的數據

 應

 不應

 小數目的不同值

 應

 不應

 大數目的不同值

 不應

 應

 頻繁更新的列

不應 

 應

 頻繁修改索引列

 不應

 應

 一個或極少不同值

 不應

 不應

  建立索引的原則

  • 定義主鍵的數據列一定要建立索引。
  • 定義有外鍵的數據列一定要建立索引。
  • 對於經常查詢的數據列最好建立索引。
  • 對於需要在指定範圍內的快速或頻繁查詢的數據列;
  • 經常用在WHERE子句中的數據列。
  • 經常出現在關鍵字order by、group by、distinct後面的欄位,建立索引。如果建立的是複合索引,索引的欄位順序要和這些關鍵字後面的欄位順序一致,否則索引不會被使用。
  • 對於那些查詢中很少涉及的列,重覆值比較多的列不要建立索引。
  • 對於定義為text、image和bit的數據類型的列不要建立索引。
  • 對於經常存取的列避免建立索引
  • 限製表上的索引數目。對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響數據的更新操作。
  • 對複合索引,按照欄位在查詢條件中出現的頻度建立索引。在複合索引中,記錄首先按照第一個欄位排序。對於在第一個欄位上取值相同的記錄,系統再按照第二個欄位的取值排序,以此類推。因此只有複合索引的第一個欄位出現在查詢條件中,該索引才可能被使用,因此將應用頻度高的欄位,放置在複合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。

 

  索引碎片化處理(重構索引)

   關於索引的定義,在此不詳細說明,網上的資料很多。索引簡單的理解就是數據的目錄,就好比一個字典的目錄,其目的是提高查詢效率

  索引簡介

   在實際開發中,有時候會發現新增了索引,但是效率還是沒有明顯提升,這時候需要考慮是否由於數據的更新編輯產生了索引碎片化,並處理

  如果檢查是否有索引碎片:

---- 檢查一個表索引碎片化        
  use 庫名
    DBCC ShowContig(待查詢的表)


---- 執行結果實例:

DBCC SHOWCONTIG 正在掃描 'SYS_Confige' 表...
表: 'SYS_Confige' (37575172);索引 ID: 1,資料庫 ID: 7
已執行 TABLE 級別的掃描。
- 掃描頁數................................: 7885
- 掃描區數..............................: 986
- 區切換次數..............................: 985
- 每個區的平均頁數........................: 8.0
- 掃描密度 [最佳計數:實際計數].......: 100.00% [986:986]
- 邏輯掃描碎片 ..................: 0.01%
- 區掃描碎片 ..................: 1.12%
- 每頁的平均可用位元組數.....................: 23.0
- 平均頁密度(滿).....................: 99.72%
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。

----數據結構分析:處理

  Logical Scan Fragmentation-邏輯掃描碎片:無序頁的百分比。該百分比應該在0%到10%之間,高了則說明有外部碎片。

  解決方式:
  解決方式有兩種方式:整理索引碎片、重建索引,在實際操過程中建議採用:重建索引。
  重建索引的SQL語句:
  use 庫名
  DBCC DBREINDEX(待重建索引的表名稱)

查詢語句優化

  在處理好索引後,接下來就是分析查詢語句,查詢語句可以藉助專業的分析工具來分析,一個好的語句和不好的語句也會很影響效率,現在簡單總結一下在查詢語句的優化方向:

  1、查詢欄位禁止出現 selete * 

2、where 及 order by 涉及的列上建立索引。

  3、where避免出現非空判斷:比如:select from table where num is null
    此時可以給num賦一個預設值0,語句修改為:select from table where num=0
  4、應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描
  5、應儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
    -----查詢value值為1 或者 4 的數據集合
    select Id from SYS_Confige where Value=1 or Value=4

    ---- 可以這樣查詢:
    select * from SYS_Confige where Value=1
    union all
    select * from SYS_Confige where Value=4
  6、in 和 not in 也要慎用,否則會導致全表掃描,如:
    select id from SYS_Configet where Value in(1,2,3)
    對於連續的數值,能用 between 就不要用 in 了:
    select id from SYS_Configet where num Value 1 and 3
  7、查詢時避免使用like '%待查詢關鍵字%' 查詢
  8、在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,
  否則該索引將不會被使用,並且應儘可能的讓欄位順序與索引順序相一致
  9、能夠用關聯查詢的不要用exists
  10、避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
  11、儘量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理

分區存儲

  當單表的數量達到一定量時,為了提高查詢效率,數據表分區存儲也是一個不錯的優化方案。
  分區呢就是把一張表的數據分成N多個區塊,這些區塊可以在同一個磁碟上,也可以在不同的磁碟上,通過提高減少文件大小,提高IO處理效率,間接的提高查詢效率
  分區存儲,只是在數據存儲上採用分區,但是在表現上還是一張表。

  表分區有以下優點:
    1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
    2、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
    3、維護方便:如果表的某個分區出現故障,需要修複數據,只修複該分區即可;
    4、均衡I/O:可以把不同的分區映射到磁碟以平衡I/O,改善整個系統性能。
  缺點:
  分區表相關:已經存在的表沒有方法可以直接轉化為分區表

分庫分表

  分庫分表其實原理也是將一個大表拆分不同的小表,在拆分上有兩種拆分方式:
  橫向拆分:主要針對一個表的欄位比較多,可以根據欄位的查詢頻率、更新頻率進行分割存儲,可以理解為表擴展
  縱向拆分:縱向拆分主要是根據數據量,將數據存儲在不同的表,常用的拆分方式有:按照時間、按照哈希等等
  分庫分表和分區存儲兩者看上去是有點矛盾,實際上兩者的出發點不一樣。分區:是降低大單表數據分區存儲,分庫分表:直接將單表拆分為多表

  同時分庫分表不僅僅會增加數據維護難度,同時也會需要投入大量的開發工作,所以分庫分表一般是要系統有一定的規模,公司有一定的資源支持
  分庫分表兩種可以配合使用,比如在分表後,還可以對錶進行分區存儲。

總結

  在數據優化過程中,索引是第一齣發點,語句優化必不可少,分區、分庫、分表也得考慮。


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

-Advertisement-
Play Games
更多相關文章
  • 在當前文件中查找包含的字元串 find . -name "*.txt" | xargs grep 'abc' ,例如:查找txt文件中包含字元串a的字元串 ...
  • 發現自己的linux水平楞個瓜皮,找個視屏教程學習一哈1 linux系統簡介1.1 UNIX和Linux發展史unix發展歷史:1969年,美國貝爾實驗室的肯.湯普森開發出unix系統,1971年丹尼斯·里奇發明C語言,1973年,unix用c重寫硬體平臺的概念 也就是cpu架構PowerPC IB... ...
  • 遇到有項目要在內網環境下安裝python項目,所以空餘時寫了自動化部署python環境和python項目的腳本,由於項目涉密,這裡僅提供自動化部署python環境的shell腳本,包括openssl的版本判斷和安裝 註 需要將相關安裝包放在data目錄下,或者修改腳本中的路徑 沒找到上傳附件的地方, ...
  • 1.1 文檔背景 CentOS 7 / RHEL 7部署圖形化界面 安裝VNCserver實現linux系統雲主機桌面化,通過普通用戶實現桌面化操作 2. Vncserver服務端部署 2.1 安裝vncserver 更新包,安裝桌面 2.2 配置vncserver 1、拷貝配置文件 2、修改配置文 ...
  • nmap工具通俗一點說,就是利用nmap工具來對靶機的所有埠及其開啟的服務進行掃描,以便於黑客入侵靶機時,知道用什麼漏洞去攻擊. nmap常用的命令集(標為紅色的一般為常用參數): sV 掃描版本O 系統掃描sC 漏洞掃描vuln 腳本掃描漏洞A 綜合掃描(激烈掃描)F 快速掃描T5 運行級別 默 ...
  • 前言 上一篇 "樹莓派也跑Docker和.NET Core" 有對樹莓派做簡單的介紹。包括系統的燒錄、基本的設置、docker的安裝、.net core的運行等。有人問我是不是一定要跑docker,答案肯定是否定的。我之所以用docker,完全是因為它的便利(帶環境)、對系統無污染和方便系統資源的查 ...
  • 最左匹配原則 1、先定位該sql的查詢條件,有哪些,那些是等值的,那些是範圍的條件。 2、等值的條件去命中索引最左邊的一個欄位,然後依次從左往右命中,範圍的放在最後。 分析講解 1、mysql的索引分為聚簇索引和非聚簇索引,mysql的表是聚集索引組織表。 聚集規則是:有主鍵則定義主鍵索引為聚集索引 ...
  • 前面我們介紹了MyCat的分庫分表操作,那麼同一張表中的數據會被保存在不同的資料庫中,那麼這就涉及到了主鍵維護的問題,此時肯定不能使用單個資料庫中id自增的方式來處理了,這時我們就可以通過MyCat中提供的幾種增長的方式來實現 全局主鍵自增 一、本地文件自增方式 首先我們來看下第一種方式,也就是本地 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...