最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL優(yōu)化SQL語句的技巧

 更新時間:2020年08月14日 10:41:12   作者:xcbeyond  
這篇文章主要介紹了常見優(yōu)化SQL語句的技巧,幫助大家更好的提高數據庫的性能,感興趣的朋友可以了解下

在面對不夠優(yōu)化、或者性能極差的SQL語句時,我們通常的想法是將重構這個SQL語句,讓其查詢的結果集和原來保持一樣,并且希望SQL性能得以提升。而在重構SQL時,一般都有一定方法技巧可供參考,本文將介紹如何通過這些技巧方法來重構SQL。

一、分解SQL

有時候對于一個復雜SQL,我們首先想到的是是否需要將一個復雜SQL分解成多個簡單SQL,來完成相同業(yè)務處理結果。

在以前,大家總是強調需要數據庫層來完成盡可能的工作,這也就不難理解在一些老的產品、項目中時常會看見很多超級復雜、超級長的SQL語句,這樣做的邏輯在以前認為多次交互,在網絡帶寬、程序與數據庫間網絡通信等方面是一件代價很高的事情。然后在現在,無論是帶寬還是延遲,網絡速度比以前要快的很多,多次交互也沒有太大的問題。即使在一個通用服務器上,也能夠運行每秒超過10萬的查詢,所以運行多個小查詢現在已經不是大問題了。

復雜SQL的分解,在面對超級復雜SQL語句時,性能提升尤為明顯。所以,在面對超級復雜SQL語句,并且存在性能問題時,推薦分解為小查詢來進行優(yōu)化

不過,在應用設計的時候,如果一個查詢能夠勝任并且不會產生性能問題,這時完全可以用一個稍微復雜的SQL來完成的,倘若再死板的強制拆分成多個小查詢是不明智的。

在當今很多高性能的應用系統中,都是極力推薦使用單表操作,然后將單表查詢結果在應用程序中進行關聯,以滿足復雜業(yè)務的查詢需求。一個SQL可以搞定事情,為何要分開來寫,而且還得在應用程序中多次執(zhí)行SQL查詢,再進行結果集的關聯,這到底為什么要這么做呢?

乍一看,這樣做復雜不說而且沒有什么好處,原本一條查詢,這樣卻變成了多條查詢。事實上,這樣分解有如下的優(yōu)勢:

  • 讓緩存更高效。在應用程序中,可以很方便地緩存單表查詢結果對應的結果對象,便于后續(xù)任何時候可以直接從結果對象中獲取數據。
  • 分解查詢后,執(zhí)行單個查詢可以減少表鎖的競爭。
  • 在程序應用層做關聯,可以更容易對數據庫進行拆分,更容易做到高性能和可擴展。
  • 單表查詢效率高于多表復雜查詢。
  • 減少冗余記錄的查詢。在程序應用層關聯,意味著對于某條記錄應用只需要查詢一次,而在數據庫中做關聯查詢,則可能需要重復地訪問一部分數據記錄。從這點來看,這樣的重構還可能減少網絡和內存的消耗。

二、查詢切分

有時候對于一個大查詢,即:結果集很大的查詢,我們需要采用“分而治之”的思想,將大查詢切分為小查詢,每個查詢功能完全一樣,只是完成一小部分,每次只返回一小部分查詢結果。通俗來講,就是對where條件的過濾范圍進行切分,每次只查詢其中一部分數據,即:類似于分頁查詢。

這樣做,不管對于SQL查詢本身,還是對于上層業(yè)務來說,都是很小的開銷。最典型的的案例就是分頁查詢,目前各類框架都有了很好的支持,如:MyBatis等,只需在實際使用時稍加留意就可避免。

三、執(zhí)行計劃

使用執(zhí)行計劃EXPLAIN關鍵字,可以使我們知道MySQL是如何執(zhí)行SQL語句的,這樣可以幫助我們分析我們的查詢語句或是表結構的性能瓶頸。EXPLAIN的查詢結果還會告訴我們索引主鍵是如何被利用的,數據表是如何被搜索或排序的…等等。

語法格式是:

EXPLAIN SELECT語句;

通過執(zhí)行計劃結果,將會指導我們進一步來重構SQL語句,如:增加索引、調整索引順序、避免使用某些函數等等。

關于執(zhí)行計劃,后續(xù)章節(jié)將會單獨詳細講解。

四、遵守原則

在平時寫SQL時,養(yǎng)成好的習慣,多加留意,很大程度上就會避免一些SQL性能問題。匯總如下:

  • 永遠為每張表設置一個ID主鍵。
  • 避免使用SELECT *。
  • 為搜索字段建立索引。
  • 在Join表的時候使用對應類型的列,并將其索引。
  • 盡可能的使用NOT NULL。
  • 越小的列會越快。
  • 當只要一行數據時使用LIMIT 1。
  • 操作符的優(yōu)化,盡量不采用不利于索引的操作符,目的就是為了避免全表掃描。

             1)in 和not in慎用,盡量用between代替in,用 not exists 代替 not in
             2)is null和is not null慎用
             3)!=或<>操作符能不用就不用,否則將使引擎放棄使用索引而進行全表掃描。

五、使用查詢緩存

當有很多相同的查詢被執(zhí)行了多次的時候,這些查詢結果會被放入一個緩存中,這樣后續(xù)的相同查詢就不用操作而直接訪問緩存結果了。

MySQL查詢緩存保存查詢返回的完整結果。當查詢命中該緩存,MySQL會like返回結果,跳過了解析、優(yōu)化和執(zhí)行截斷。

這是提高查詢性能最有效的方法之一,而且這是被MySQL引擎處理的,通常MySQL默認是不開啟查詢緩存的,需要手動開啟。

查詢緩存對應用程序是完全透明的。應用程序無需關心MySQL是通過查詢返回的還是實際執(zhí)行返回的結果。事實上,這兩種方式執(zhí)行的結果是完全相同的。換句話說,查詢緩存無需使用任何語法。

隨著現在的通用服務器越來越強大,查詢緩存被發(fā)現是一個影響服務器擴展性的因素。它可能成為整個服務器的資源競爭單點,在多核服務器上還可能導致服務器僵死。所以大部分時候應該默認關閉查詢緩存,如果查詢緩存作用很大的話,可以配置個幾十兆的小緩存空間。(在選擇時,需要進行權衡)

關于查詢緩存有如下參數可供配置:

  • query_cache_type

是否打開查詢緩存。可以設置OFF、ON、DEMAND,DEMAND表示只有在查詢語句中明確寫入sql_cache的語句才放入查詢緩存。

  • query_cache_size

查詢緩存使用的總內存空間,單位是字節(jié)。這個值必須是1024的整倍數,否則實際分配的數據會和指定的大小有區(qū)別。

  • query_cache_min_res_unit

在查詢緩存中分配內存塊時的最小單位。

  • query_cache_limit

緩存的最大查詢結果。如果查詢結果大于這個值,則不會被緩存。因為查詢緩存在數據生成的時候就開始嘗試緩存數據,所以只有當結果全部返回后,MySQL才知道查詢結果是否超出限制。

關于查詢緩存,后續(xù)章節(jié)將會單獨詳細講解。

以上就是MySQL優(yōu)化SQL語句的技巧的詳細內容,更多關于MySQL優(yōu)化sql語句的資料請關注腳本之家其它相關文章!

相關文章

  • mysql如何匹配數組字段中的某一個具體值

    mysql如何匹配數組字段中的某一個具體值

    在數據庫操作中,有時需要查詢數組字段中包含特定值的數據,傳統like查詢可能會帶來錯誤結果,如查詢包含數字1的數組可能錯誤返回包含數字10的結果,為此,可以使用MySQL的FIND_IN_SET函數或REGEXP正則表達式進行精確匹配,FIND_IN_SET適用于匹配單個固定值
    2024-11-11
  • Mysql 行級鎖的使用及死鎖的預防方案

    Mysql 行級鎖的使用及死鎖的預防方案

    mysql的InnoDB,支持事務和行級鎖,可以使用行鎖來處理用戶提現等業(yè)務。使用mysql鎖的時候有時候會出現死鎖,要做好死鎖的預防。這篇文章通過實例應用給大家講解
    2016-12-12
  • MySQL的一些功能實用的Linux shell腳本分享

    MySQL的一些功能實用的Linux shell腳本分享

    這篇文章主要介紹了Linux系統下MySQL的一些實用功能的shell腳本分享,包括啟動Memcached、binlog自動清理和修復主從同步這樣三個簡單的實例,需要的朋友可以參考下
    2015-12-12
  • mysql 5.7如何安裝 mysql 5.7安裝配置教程

    mysql 5.7如何安裝 mysql 5.7安裝配置教程

    這篇文章主要為大家詳細介紹了MySQL 5.7安裝配置方法,安裝過程中出現問題的解決方案,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Mysql刪除幾億條數據表中的部分數據的方法實現

    Mysql刪除幾億條數據表中的部分數據的方法實現

    在MySQL中刪除一個大表中的數據時,需要特別注意操作的性能和對系統的影響,本文主要介紹了Mysql刪除幾億條數據表中的部分數據的方法實現,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • window環(huán)境下使用VScode連接虛擬機MySQL方法

    window環(huán)境下使用VScode連接虛擬機MySQL方法

    這篇文章主要介紹了window環(huán)境下使用VScode連接虛擬機MySQL方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • MySQL?Server?層四個日志詳解

    MySQL?Server?層四個日志詳解

    這篇文章主要介紹了MySQL?Server?層四個日志,包括錯誤日志,查詢日志,二進制日志及慢查詢日志,本文結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • 驗證Mysql中聯合索引的最左匹配原則詳情

    驗證Mysql中聯合索引的最左匹配原則詳情

    這篇文章主要介紹了驗證Mysql中聯合索引的最左匹配原則詳情,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 細說mysql replace into用法

    細說mysql replace into用法

    這篇文章主要介紹了細說mysql replace into,需要的朋友可以參考下
    2021-03-03
  • MySQL數據庫中的嵌套查詢實例詳解

    MySQL數據庫中的嵌套查詢實例詳解

    這篇文章主要給大家介紹了關于MySQL數據庫中嵌套查詢的相關資料,嵌套查詢是SQL中的一種技術,允許在一個查詢語句的某個部分嵌入另一個查詢,它主要用于處理復雜的邏輯,如多層條件過濾和數據對比,需要的朋友可以參考下
    2024-12-12

最新評論

宜昌市| 阿拉尔市| 卓资县| 潞城市| 阿巴嘎旗| 会昌县| 饶阳县| 海盐县| 洮南市| 虹口区| 灯塔市| 兴隆县| 兴海县| 望谟县| 剑阁县| 图木舒克市| 湖南省| 闽清县| 四会市| 凌源市| 东台市| 江北区| 黑山县| 宁德市| 临夏市| 永修县| 柘城县| 墨玉县| 伊川县| 元朗区| 外汇| 江西省| 南阳市| 桓仁| 喀喇| 英吉沙县| 江西省| 太湖县| 增城市| 丹寨县| 清丰县|