count(*)是如何實(shí)現(xiàn)的?
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計(jì)和自適應(yīng)建站服務(wù)。團(tuán)隊(duì)由有經(jīng)驗(yàn)的網(wǎng)頁設(shè)計(jì)師、程序員和市場(chǎng)專家組成,能夠提供從H5網(wǎng)站設(shè)計(jì),網(wǎng)站制作,一元廣告,模板建站到小程序開發(fā)等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。
上述的count(*)指的是在查詢的時(shí)候不加where條件,不加where條件的count(*)在不同的數(shù)據(jù)庫引擎下有不同的實(shí)現(xiàn):
InnoDB為什么不把總行數(shù)存起來?
由于InnoDB的事務(wù)支持,同一時(shí)刻的多個(gè)事務(wù)的查詢,由于多版本并發(fā)控制的(MVCC)的原因,InnoDB表返回的行數(shù)是不確定。
InnoDB對(duì)COUNT(*)做的優(yōu)化?
InnoDB是索引組織表,所有的數(shù)據(jù)都是通過B+數(shù)的方式組織起來的,主鍵索引的葉子節(jié)點(diǎn)是整行數(shù)據(jù),普通索引的葉子節(jié)點(diǎn)是主鍵值,因此 普通索引樹的大小要比主鍵索引樹小的多 。對(duì)于count(*),MySQL優(yōu)化器會(huì)找到最小的那棵索引樹然后進(jìn)行遍歷。
如果某張大表需要經(jīng)常性的進(jìn)行count(*)操作,可以考慮單獨(dú)建立一張表進(jìn)行保存大表的記錄行數(shù)。
COUNT的具體含義?
COUNT()是一個(gè)聚合函數(shù),對(duì)于返回的結(jié)果集需要一行一行的進(jìn)行判斷,如果COUNT函數(shù)中的參數(shù)不為NULL,累計(jì)值就加,否則不加。
COUNT的幾種用法?
COUNT(*)除了在選擇索引樹遍歷上有優(yōu)化,而且在執(zhí)行的過程中不會(huì)取值,Server層按照行累加。
COUNT(主鍵ID),InnoDB會(huì)遍歷整張表,把每一行的ID值都取出來,返回給Server層。Server層拿到ID以后,判斷不可能為空,按行累加。
COUNT(1),InnoDB引擎遍歷整張表,但不取值。Server層對(duì)于返回的每一行放一個(gè)數(shù)字"1"進(jìn)去,判斷不可能為空,按行累加。
COUNT(字段),如果字段定義為NOT NULL的話,Server層從記錄中取到字段以后判斷不可能為NULL,按行累加;但是如果字段允許為NULL,Server層就有可能取到為NULL的記錄,此時(shí)需要把記錄中的值進(jìn)行判斷一下,不是NULL才可以累加。
COUNT效率
COUNT(字段) COUNT(主鍵ID) COUNT(1) COUNT(*)
?Show
status
?一些值得監(jiān)控的變量值:
?Bytes_received和Bytes_sent
?和服務(wù)器之間來往的流量。
?Com_*服務(wù)器正在執(zhí)行的命令。
?Created_*在查詢執(zhí)行期限間創(chuàng)建的臨時(shí)表和文件。
?Handler_*存儲(chǔ)引擎操作。
?Select_*不同類型的聯(lián)接執(zhí)行計(jì)劃。
?Sort_*幾種排序信息。
?Show
session status like ‘Select’;
?Show profiles
?SET profiling=1;
?Show
profiles\G
?Show profile;
Show Profile 是mysql提供可以用來分析 當(dāng)前會(huì)話 中語句執(zhí)行的資源消耗情況,可以用于Sql調(diào)優(yōu)的測(cè)量。
請(qǐng)讀者繼續(xù)看前面的圖 SQL執(zhí)行具體細(xì)節(jié) ,左邊 Status 列展示了一條SQL執(zhí)行的從開始到清理的整個(gè)生命周期中執(zhí)行的操作。如果在其生命周期階段出現(xiàn)如下的情況的就要重視了:
開啟 Profiling 后,mysql會(huì)留下15條最近執(zhí)行的sql的 現(xiàn)場(chǎng) , 便于我們發(fā)現(xiàn)問題。
Show profiles 用來查最近的15條。
Show profile 用來展示每一個(gè)SQL執(zhí)行階段的耗時(shí)清單,便于我們發(fā)現(xiàn)耗時(shí)最多的地方,然后以此為依據(jù)查找問題所在,最后優(yōu)化SQL或者優(yōu)化mysql參數(shù)。比如耗時(shí)清單創(chuàng)建了臨時(shí)表,就要考慮表是否創(chuàng)建索引,如果創(chuàng)建了那么是否沒有用到或者失效了。
總的來說 Profiling 是一個(gè)很不錯(cuò)的mysql性能分析工具。
第一優(yōu)化你的sql和索引;
第二加緩存,memcached,redis;
第三以上都做了后,還是慢,就做主從復(fù)制或主主復(fù)制,讀寫分離,可以在應(yīng)用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要么效率不高,要么沒人維護(hù);
第四如果以上都做了還是慢,不要想著去做切分,mysql自帶分區(qū)表,先試試這個(gè),對(duì)你的應(yīng)用是透明的,無需更改代碼,但是sql語句是需要針對(duì)分區(qū)表做優(yōu)化的,sql條件中要帶上分區(qū)條件的列,從而使查詢定位到少量的分區(qū)上,否則就會(huì)掃描全部分區(qū),另外分區(qū)表還有一些坑,在這里就不多說了;
第五如果以上都做了,那就先做垂直拆分,其實(shí)就是根據(jù)你模塊的耦合度,將一個(gè)大的系統(tǒng)分為多個(gè)小的系統(tǒng),也就是分布式系統(tǒng);
第六才是水平切分,針對(duì)數(shù)據(jù)量大的表,這一步最麻煩,最能考驗(yàn)技術(shù)水平,要選擇一個(gè)合理的sharding key,為了有好的查詢效率,表結(jié)構(gòu)也要改動(dòng),做一定的冗余,應(yīng)用也要改,sql中盡量帶sharding key,將數(shù)據(jù)定位到限定的表上去查,而不是掃描全部的表;
mysql數(shù)據(jù)庫一般都是按照這個(gè)步驟去演化的,成本也是由低到高;
當(dāng)前名稱:怎么分析MySQL性能 mysql查看性能命令
網(wǎng)站URL:http://www.rwnh.cn/article24/ddihpce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、動(dòng)態(tài)網(wǎng)站、App開發(fā)、ChatGPT、網(wǎng)站維護(hù)、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)