99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代mysql explain中rows是怎么計算的?
mysql explain中rows是怎么計算的?
2023-04-25
收藏

MySQL Explain是一種用于查詢性能優(yōu)化的工具,它可以幫助開發(fā)人員了解查詢執(zhí)行計劃并識別潛在的性能瓶頸。其中,最重要的指標(biāo)之一就是“rows”,它表示MySQL估算的查詢結(jié)果集行數(shù)。在本文中,我們將深入探討MySQL Explain中的rows指標(biāo)是如何計算的。

首先,需要明確的是,MySQL在執(zhí)行查詢時,并不會直接讀取和處理所有的數(shù)據(jù)。相反,它使用一種稱為“查詢優(yōu)化器”的組件來評估多種可能的查詢執(zhí)行計劃,并選擇其中最優(yōu)的一種來執(zhí)行查詢。這個過程涉及到很多復(fù)雜的算法和規(guī)則,但其核心思想都是盡可能利用索引、避免全表掃描、減少臨時表等操作來提高查詢效率。

在優(yōu)化器選擇最優(yōu)查詢執(zhí)行計劃的過程中,一個關(guān)鍵的因素就是估計結(jié)果集大小。特別地,MySQL通過估算總行數(shù)和掃描行數(shù)兩個值來決定使用哪種查詢執(zhí)行計劃。其中,總行數(shù)表示整個查詢結(jié)果集的行數(shù),而掃描行數(shù)則表示執(zhí)行查詢所需掃描的行數(shù)。

總行數(shù)的估算通常比較簡單,它只需要考慮查詢涉及的表中總共有多少行即可。這個值可以通過讀取表的元數(shù)據(jù)來計算,或者在查詢執(zhí)行過程中動態(tài)統(tǒng)計實際掃描到的行數(shù)來進(jìn)行校準(zhǔn)。例如,如果查詢要求對一張包含100萬條記錄的表進(jìn)行全表掃描,并且沒有任何限制條件,則總行數(shù)就是100萬。

而掃描行數(shù)的估算則更加復(fù)雜,它涉及到很多因素,例如索引是否命中、使用哪種訪問方法、是否需要排序、是否使用了聚合函數(shù)等等。不同的情況下,MySQL使用的掃描行數(shù)估算方法也會有所不同。下面我們將分別介紹一些常見的情況和估算方法。

  1. 索引命中的情況

當(dāng)查詢語句中包含WHERE條件時,MySQL會嘗試使用索引來快速定位符合條件的記錄。如果索引能夠完全覆蓋WHERE條件,則稱之為“索引覆蓋”,此時掃描行數(shù)就等于總行數(shù)。例如,如果查詢要求從一個包含100萬條記錄的用戶表中查詢出所有年齡大于18歲的用戶信息,而該表上有一個基于age字段的B+Tree索引,則MySQL會使用該索引來查找滿足條件的記錄。由于索引已經(jīng)覆蓋了WHERE條件,掃描行數(shù)即為總行數(shù),即100萬。

如果索引不能完全覆蓋WHERE條件,MySQL則需要根據(jù)選擇性估算來計算掃描行數(shù)。選擇性指的是索引中不同值的數(shù)量與總行數(shù)之間的比率。具體地說,如果一張表上有一個基于gender字段索引,其中男性和女性各占一半,則選擇性為0.5。如果查詢要求從該表中查詢所有性別為“男”的記錄,則選擇性為0.5,掃描行數(shù)即為總行數(shù)的一半。

  1. 排序和分組的情況

當(dāng)查詢語句包含ORDER BY或GROUP BY子句時,MySQL需要為結(jié)果集進(jìn)行排序或分組操作。如果已經(jīng)存在適當(dāng)?shù)?a href='/map/suoyin/' style='color:#000;font-size:inherit;'>索引,則可以使用索引進(jìn)行排序或分組操作。此時,掃描行數(shù)取決于讀取到的索引條目數(shù)量。例如,如果查詢要求對一個包

含100萬條記錄的用戶表按照年齡字段進(jìn)行排序,則MySQL會使用基于age字段索引來快速排序。如果該索引中有50萬個不同的值,則掃描行數(shù)即為50萬,等于索引中不同值數(shù)量。

如果不存在適當(dāng)?shù)?a href='/map/suoyin/' style='color:#000;font-size:inherit;'>索引,則MySQL需要對表中所有記錄進(jìn)行全表掃描,并使用臨時表進(jìn)行排序或分組操作。此時,掃描行數(shù)就等于總行數(shù)。例如,如果查詢要求對一個包含100萬條記錄的用戶表按照性別進(jìn)行分組,則MySQL需要從整張表中讀取所有記錄,并將它們寫入臨時表進(jìn)行分組操作。由于沒有任何限制條件和索引可用,掃描行數(shù)和總行數(shù)都是100萬。

  1. 子查詢和聯(lián)合查詢的情況

當(dāng)查詢語句包含子查詢或聯(lián)合查詢時,MySQL需要執(zhí)行多個查詢,并將它們的結(jié)果集合并成最終結(jié)果集。在這種情況下,MySQL會根據(jù)每個子查詢或子句的掃描行數(shù)估算出總體的掃描行數(shù)。具體地說,MySQL會先估算每個子查詢或子句的掃描行數(shù),然后將它們相加得到總體的掃描行數(shù)。例如,如果查詢要求從兩張表中查詢滿足某些條件的記錄,并對它們進(jìn)行UNION操作,則MySQL會分別計算這兩個查詢的掃描行數(shù),然后將它們相加得到最終結(jié)果的掃描行數(shù)。

總結(jié)一下,MySQL Explain中的rows指標(biāo)是通過優(yōu)化器估算出來的,它表示了查詢結(jié)果集的行數(shù)或執(zhí)行查詢所需掃描的行數(shù)。具體的估算方法取決于查詢語句中的條件、索引和操作類型等因素。在進(jìn)行性能優(yōu)化時,開發(fā)人員應(yīng)該關(guān)注rows指標(biāo),并嘗試通過合理的索引設(shè)計、WHERE條件優(yōu)化、查詢重寫等手段來降低掃描行數(shù),提高查詢效率。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }