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

MySQL慢查詢以及重構(gòu)查詢的方式記錄

 更新時(shí)間:2021年06月16日 11:55:29   作者:臨時(shí)營(yíng)地  
MySQL的慢查詢,全名是慢查詢?nèi)罩?是MySQL提供的一種日志記錄,用來記錄在MySQL中響應(yīng)時(shí)間超過閥值的語(yǔ)句,這篇文章主要給大家介紹了關(guān)于MySQL慢查詢以及重構(gòu)查詢的相關(guān)資料,需要的朋友可以參考下

前言

什么是慢查詢,如何優(yōu)化慢查詢,下面介紹這兩個(gè)知識(shí)點(diǎn)的相關(guān)知識(shí)。

慢查詢基礎(chǔ):優(yōu)化數(shù)據(jù)訪問

是否向數(shù)據(jù)庫(kù)請(qǐng)求了不需要的數(shù)據(jù)

查詢不需要的記錄:解決方案:查詢后面加上Limit

多表關(guān)聯(lián)時(shí)返回全部列:解決方案:只取需要的列

總是取出全部列:select * 解決方案:最好還是獲取部分列,除非應(yīng)用程序處緩存列的數(shù)據(jù)了

重復(fù)查詢相同的數(shù)據(jù):解決方案:需要時(shí)從緩存中取出

MySQL是否在掃描額外的記錄

可以從響應(yīng)時(shí)間,掃描的行數(shù),返回的行數(shù)來進(jìn)行查詢開銷的衡量。

要想減少掃描行數(shù)可以使用索引對(duì)需要的記錄進(jìn)行覆蓋,但是增加索引不意味著就能讓掃描的行數(shù)等于返回的行數(shù),比如sum,count之類的聚合函數(shù)

重構(gòu)查詢的方法

一個(gè)復(fù)雜查詢還是多個(gè)簡(jiǎn)單查詢

在過去,總是強(qiáng)調(diào)需要數(shù)據(jù)庫(kù)層完成盡可能多的工作,因?yàn)檫^去網(wǎng)絡(luò)通信查詢解析和優(yōu)化是一件代價(jià)很高的事情。

但是這樣的想法對(duì)于MySQL并不適用,MySQL從設(shè)計(jì)上讓連接和斷開連接都很輕量級(jí),在返回一個(gè)小的查詢結(jié)果方面很高效?,F(xiàn)代的網(wǎng)絡(luò)速度比以前要快很多,無論是帶寬還是延遲。在某些版本的MySQL上,即使在一個(gè)通用服務(wù)器上,也能夠運(yùn)行每秒超過10萬的查詢,即使是一個(gè)千兆網(wǎng)卡也能輕松滿足每秒超過2000次的查詢。所以運(yùn)行多個(gè)小查詢現(xiàn)在已經(jīng)不是大問題了。

當(dāng)然,相比較于內(nèi)部掃描,響應(yīng)數(shù)據(jù)給客戶端更加耗時(shí),所以在同條件下,使用盡可能少的查詢更好。

切分查詢

當(dāng)使用sql進(jìn)行查詢時(shí),需要注意將大查詢切分成小查詢,可以減少對(duì)數(shù)據(jù)庫(kù)的影響,因?yàn)橐粋€(gè)大語(yǔ)句一次性完成的話,則可能一次鎖住很多數(shù)據(jù),占滿整個(gè)事務(wù)日志,耗盡系統(tǒng)資源,阻塞其他查詢。

比如我們做數(shù)據(jù)統(tǒng)計(jì)時(shí)要對(duì)大量訂單號(hào)的信息進(jìn)行查詢,那么是一次性用in查詢,還是切割參數(shù)list多次查詢呢,答案是切割參數(shù)list多次查詢,因?yàn)楫?dāng)in里面的參數(shù)過多時(shí),MySQL就會(huì)認(rèn)為再走索引已經(jīng)不行了,可能就會(huì)進(jìn)行全表查詢,如果這個(gè)時(shí)候數(shù)據(jù)表數(shù)據(jù)量過大,那可能就會(huì)造成查詢超時(shí)。

// chops a list into non-view sublists of length L
static <T> List<List<T>> chopped(List<T> list, final int L) {
    List<List<T>> parts = new ArrayList<List<T>>();
    final int N = list.size();
    for (int i = 0; i < N; i += L) {
        parts.add(new ArrayList<T>(
            list.subList(i, Math.min(N, i + L)))
        );
    }
    return parts;
}
List<Integer> numbers = Collections.unmodifiableList(
    Arrays.asList(5,3,1,2,9,5,0,7)
);
List<List<Integer>> parts = chopped(numbers, 3);
System.out.println(parts); // prints "[[5, 3, 1], [2, 9, 5], [0, 7]]"
parts.get(0).add(-1);
System.out.println(parts); // prints "[[5, 3, 1, -1], [2, 9, 5], [0, 7]]"
System.out.println(numbers); // prints "[5, 3, 1, 2, 9, 5, 0, 7]" (unmodified!)

在程序中將list截?cái)啵瑥亩共樵兡苁褂盟饕皇沁M(jìn)行全表掃描。

阿里開發(fā)手冊(cè)中就推薦仔細(xì)評(píng)估in后面的集合元素?cái)?shù)量,控制在1000個(gè)之內(nèi)。

分解關(guān)聯(lián)查詢

將多表inner join 進(jìn)行分解,分解成小查詢,超過三個(gè)表的join,就需要禁止了。

優(yōu)點(diǎn)有:

  1. 緩存的效率會(huì)更高,
  2. 分解后的查詢可以減少鎖的競(jìng)爭(zhēng)
  3. 應(yīng)用層可以緩存查詢數(shù)據(jù),減小數(shù)據(jù)庫(kù)的壓力。
  4. 可以提升查詢效率,因?yàn)橛弥麈I之類進(jìn)行in查詢,比按照條件范圍查詢可能會(huì)更高效,尤其是大表的時(shí)候。
  5. 可以減少冗余記錄的查詢
  6. 更進(jìn)一步,這樣做相當(dāng)于在應(yīng)用中實(shí)現(xiàn)了哈希關(guān)聯(lián),而不是使用MySQL的嵌套循環(huán)關(guān)聯(lián)。某些場(chǎng)景哈希關(guān)聯(lián)的效率要高很多。

總結(jié)

到此這篇關(guān)于MySQL慢查詢以及重構(gòu)查詢的文章就介紹到這了,更多相關(guān)MySQL慢查詢重構(gòu)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL查詢條件常見用法詳解

    MySQL查詢條件常見用法詳解

    這篇文章主要介紹了MySQL查詢條件常見用法,結(jié)合實(shí)例形式總結(jié)分析了MySQL常見的各類查詢條件與簡(jiǎn)單使用方法,需要的朋友可以參考下
    2019-11-11
  • Mysql忘記root密碼怎么辦

    Mysql忘記root密碼怎么辦

    MySQL有時(shí)候忘記了root密碼是一件傷感的事,下面通過本文給大家介紹Mysql忘記root密碼怎么辦的相關(guān)知識(shí),需要的朋友參考下
    2016-01-01
  • 你的like語(yǔ)句為什么沒索引詳解

    你的like語(yǔ)句為什么沒索引詳解

    這篇文章主要給大家介紹了關(guān)于你的like語(yǔ)句為什么沒索引的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • MySQL 獲得當(dāng)前日期時(shí)間 函數(shù)

    MySQL 獲得當(dāng)前日期時(shí)間 函數(shù)

    這篇文章主要介紹了MySQL 獲得當(dāng)前日期時(shí)間 函數(shù) 非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-07-07
  • mysql多次調(diào)用存儲(chǔ)過程的問題

    mysql多次調(diào)用存儲(chǔ)過程的問題

    這個(gè)問題也困擾了我很長(zhǎng)時(shí)間,準(zhǔn)確的說正是因?yàn)樗拇鎯?chǔ)過程無法在同一連接中2次或者多次執(zhí)行,我大幅修該了程序架構(gòu),全部題換成了sql,但是畢竟sql無法執(zhí)行有相當(dāng)邏輯的代碼,最總讓我從新測(cè)試以求尋找解決之道。
    2011-05-05
  • 使用Linux的Shell腳本定時(shí)處理MySQL超時(shí)

    使用Linux的Shell腳本定時(shí)處理MySQL超時(shí)

    本文提供使用Linux的Shell腳本定時(shí)處理MySQL超時(shí)Locked進(jìn)程腳本
    2013-11-11
  • 為什么MySQL選擇Repeatable Read作為默認(rèn)隔離級(jí)別

    為什么MySQL選擇Repeatable Read作為默認(rèn)隔離級(jí)別

    關(guān)于MySQL的事務(wù)隔離級(jí)別,相信很多讀者都不陌生,那么,你知道為什么Oracle選擇RC作為默認(rèn)級(jí)別,而MySQL要選擇RR作為默認(rèn)的隔離級(jí)別嗎
    2021-07-07
  • MySQL系統(tǒng)庫(kù)之information_schema的實(shí)現(xiàn)

    MySQL系統(tǒng)庫(kù)之information_schema的實(shí)現(xiàn)

    information_schema用于存儲(chǔ)數(shù)據(jù)庫(kù)元數(shù)據(jù),本文主要介紹了MySQL系統(tǒng)庫(kù)之information_schema的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • MySQL如何實(shí)現(xiàn)負(fù)載均衡功能

    MySQL如何實(shí)現(xiàn)負(fù)載均衡功能

    這篇文章主要介紹了MySQL如何實(shí)現(xiàn)負(fù)載均衡功能,學(xué)習(xí)過數(shù)據(jù)庫(kù)的朋友們都會(huì)知道MySQL,那么如何在MySQL下實(shí)現(xiàn)負(fù)載均衡功能呢?本文就將為大家細(xì)致地介紹一下
    2019-06-06
  • Mysql的max_allowed_packet設(shè)定

    Mysql的max_allowed_packet設(shè)定

    今天小編就為大家分享一篇關(guān)于Mysql的max_allowed_packet設(shè)定,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評(píng)論

青海省| 长汀县| 萨嘎县| 汶上县| 平邑县| 本溪| 嘉善县| 公安县| 鹰潭市| 涞源县| 化德县| 临洮县| 临汾市| 葵青区| 基隆市| 镇巴县| 崇左市| 麻江县| 布尔津县| 肃北| 偏关县| 泗水县| 疏勒县| 肥东县| 龙口市| 镇雄县| 彭阳县| 九江市| 晋州市| 象山县| 临海市| 静安区| 项城市| 瑞丽市| 苍山县| 拜泉县| 闸北区| 长海县| 大埔区| 宁远县| 昌乐县|