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

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

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

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

一、分解SQL

有時(shí)候?qū)τ谝粋€(gè)復(fù)雜SQL,我們首先想到的是是否需要將一個(gè)復(fù)雜SQL分解成多個(gè)簡單SQL,來完成相同業(yè)務(wù)處理結(jié)果。

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

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

不過,在應(yīng)用設(shè)計(jì)的時(shí)候,如果一個(gè)查詢能夠勝任并且不會(huì)產(chǎn)生性能問題,這時(shí)完全可以用一個(gè)稍微復(fù)雜的SQL來完成的,倘若再死板的強(qiáng)制拆分成多個(gè)小查詢是不明智的。

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

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

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

二、查詢切分

有時(shí)候?qū)τ谝粋€(gè)大查詢,即:結(jié)果集很大的查詢,我們需要采用“分而治之”的思想,將大查詢切分為小查詢,每個(gè)查詢功能完全一樣,只是完成一小部分,每次只返回一小部分查詢結(jié)果。通俗來講,就是對(duì)where條件的過濾范圍進(jìn)行切分,每次只查詢其中一部分?jǐn)?shù)據(jù),即:類似于分頁查詢。

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

三、執(zhí)行計(jì)劃

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

語法格式是:

EXPLAIN SELECT語句;

通過執(zhí)行計(jì)劃結(jié)果,將會(huì)指導(dǎo)我們進(jìn)一步來重構(gòu)SQL語句,如:增加索引、調(diào)整索引順序、避免使用某些函數(shù)等等。

關(guān)于執(zhí)行計(jì)劃,后續(xù)章節(jié)將會(huì)單獨(dú)詳細(xì)講解。

四、遵守原則

在平時(shí)寫SQL時(shí),養(yǎng)成好的習(xí)慣,多加留意,很大程度上就會(huì)避免一些SQL性能問題。匯總?cè)缦拢?/p>

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

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

五、使用查詢緩存

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

MySQL查詢緩存保存查詢返回的完整結(jié)果。當(dāng)查詢命中該緩存,MySQL會(huì)like返回結(jié)果,跳過了解析、優(yōu)化和執(zhí)行截?cái)唷?/p>

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

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

隨著現(xiàn)在的通用服務(wù)器越來越強(qiáng)大,查詢緩存被發(fā)現(xiàn)是一個(gè)影響服務(wù)器擴(kuò)展性的因素。它可能成為整個(gè)服務(wù)器的資源競爭單點(diǎn),在多核服務(wù)器上還可能導(dǎo)致服務(wù)器僵死。所以大部分時(shí)候應(yīng)該默認(rèn)關(guān)閉查詢緩存,如果查詢緩存作用很大的話,可以配置個(gè)幾十兆的小緩存空間。(在選擇時(shí),需要進(jìn)行權(quán)衡)

關(guān)于查詢緩存有如下參數(shù)可供配置:

  • query_cache_type

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

  • query_cache_size

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

  • query_cache_min_res_unit

在查詢緩存中分配內(nèi)存塊時(shí)的最小單位。

  • query_cache_limit

緩存的最大查詢結(jié)果。如果查詢結(jié)果大于這個(gè)值,則不會(huì)被緩存。因?yàn)椴樵兙彺嬖跀?shù)據(jù)生成的時(shí)候就開始嘗試緩存數(shù)據(jù),所以只有當(dāng)結(jié)果全部返回后,MySQL才知道查詢結(jié)果是否超出限制。

關(guān)于查詢緩存,后續(xù)章節(jié)將會(huì)單獨(dú)詳細(xì)講解。

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

相關(guān)文章

  • mysql如何匹配數(shù)組字段中的某一個(gè)具體值

    mysql如何匹配數(shù)組字段中的某一個(gè)具體值

    在數(shù)據(jù)庫操作中,有時(shí)需要查詢數(shù)組字段中包含特定值的數(shù)據(jù),傳統(tǒng)like查詢可能會(huì)帶來錯(cuò)誤結(jié)果,如查詢包含數(shù)字1的數(shù)組可能錯(cuò)誤返回包含數(shù)字10的結(jié)果,為此,可以使用MySQL的FIND_IN_SET函數(shù)或REGEXP正則表達(dá)式進(jìn)行精確匹配,FIND_IN_SET適用于匹配單個(gè)固定值
    2024-11-11
  • Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案

    Mysql 行級(jí)鎖的使用及死鎖的預(yù)防方案

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

    MySQL的一些功能實(shí)用的Linux shell腳本分享

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

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

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

    Mysql刪除幾億條數(shù)據(jù)表中的部分?jǐn)?shù)據(jù)的方法實(shí)現(xiàn)

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

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

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

    MySQL?Server?層四個(gè)日志詳解

    這篇文章主要介紹了MySQL?Server?層四個(gè)日志,包括錯(cuò)誤日志,查詢?nèi)罩?,二進(jìn)制日志及慢查詢?nèi)罩?,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 驗(yàn)證Mysql中聯(lián)合索引的最左匹配原則詳情

    驗(yàn)證Mysql中聯(lián)合索引的最左匹配原則詳情

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

    細(xì)說mysql replace into用法

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

    MySQL數(shù)據(jù)庫中的嵌套查詢實(shí)例詳解

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

最新評(píng)論

平江县| 斗六市| 清镇市| 西贡区| 肇州县| 镇江市| 体育| 墨玉县| 青河县| 崇文区| 平凉市| 青海省| 通城县| 青田县| 祁连县| 治县。| 黑山县| 称多县| 周宁县| 日喀则市| 南充市| 依兰县| 新宾| 鄱阳县| 红桥区| 信宜市| 天镇县| 琼结县| 横峰县| 元朗区| 瑞昌市| 蒲城县| 获嘉县| 叙永县| 司法| 东阿县| 新源县| 明水县| 谢通门县| 永和县| 肇源县|