11111111111
知識共享平臺
知識共享平臺

討教大學(xué)平臺

  • 首頁
  • 免費(fèi)課
  • 精品課
  • 討教題庫
  • 企業(yè)服務(wù)

    hot

  • 下載APP
  • 證書查詢
  • 關(guān)于我們
我問
討教號
搜索
消息
  • 我的文章

    我的關(guān)注

    我的問答

    我的秘密

    我的評論

    我的訂閱

    我的打賞

    我的錢包

    我的通知

    我的設(shè)置

    退出登錄

  • ×

    登錄

    討教 | 通行證

    登錄
    立即注冊
    忘記密碼?
    使用微信登錄

    提問 ×

    寫下你的問題,準(zhǔn)確的表述更容易得到答案

    類型話題

    選擇支付方式
    您的討教幣 111 付費(fèi)金額

        1. <abbr id="bypzi"><style id="bypzi"></style></abbr>
          <code id="bypzi"><pre id="bypzi"><cite id="bypzi"></cite></pre></code>

              <label id="bypzi"><pre id="bypzi"><cite id="bypzi"></cite></pre></label>

                你是一直認(rèn)為 count(1) 比 count(*) 效率高么?

                JAVA葵花寶典
                2019-06-20 17:04:25
                16篇 作品
                1937 總閱讀量

                MySQL count(1) 真的比 count(*) 快么? 反正同事們都是這么說的,我也姑且覺得對吧,那么沒有自己研究一下究竟?如果我告訴你他們一樣,你信么?

                有 Where 條件的 count,會根據(jù)掃碼結(jié)果count 一下所有的行數(shù),其性能更依賴于你的 Where 條件,所以文章我們僅針對沒有 Where 的情況進(jìn)行說明。

                MyISAM 引擎會把一個(gè)表的總行數(shù)記錄了下來,所以在執(zhí)行 count(*) 的時(shí)候會直接返回?cái)?shù)量,執(zhí)行效率很高。在 MySQL 5.5 以后默認(rèn)引擎切換為 InnoDB,InnoDB 因?yàn)樵黾恿税姹究刂?MVCC)的原因,同時(shí)有多個(gè)事務(wù)訪問數(shù)據(jù)并且有更新操作的時(shí)候,每個(gè)事務(wù)需要維護(hù)自己的可見性,那么每個(gè)事務(wù)查詢到的行數(shù)也是不同的,所以不能緩存具體的行數(shù),他每次都需要 count 一下所有的行數(shù)。那么 count(1) 和 count(*)有區(qū)別么?

                InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference. 這是官網(wǎng)的解釋,直接點(diǎn)擊閱讀原文查看官文,所以兩種實(shí)現(xiàn)其實(shí)一樣,那么具體為什么一樣呢?

                探究這個(gè)問題首先我們需要理解 count 的含義,如下是官網(wǎng)給出的定義

                Returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement. The result is a BIGINT value.

                大致的解釋是返回 SELECT 語句檢索的行中 expr 的非 NULL 值的計(jì)數(shù),到這里我們就明白了,首先它是一個(gè)聚合函數(shù),然后對 SELECT 的結(jié)果集進(jìn)行計(jì)數(shù),但是需要參數(shù)不為 NULL。那么我們繼續(xù)閱讀官網(wǎng)的內(nèi)容:

                COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.

                大致的內(nèi)容是說,count(*) 不同,他不關(guān)心這個(gè)返回值是否為空都會計(jì)算他的count,因?yàn)?count(1) 中的 1 是恒真表達(dá)式,那么 count(*) 還是 count(1) 都是對所有的結(jié)果集進(jìn)行 count,所以他們本質(zhì)上沒有什么區(qū)別。

                當(dāng)然這個(gè)地方 InnoDB 本身也做了一些優(yōu)化,它會使用最小的二級索引來進(jìn)行 count 的查詢優(yōu)化。如果沒有二級索引才會選擇聚簇索引,這樣的設(shè)計(jì)單從 IO 的角度就節(jié)省了很多開銷。

                到這里我們明白了 count(*) 和 count(1) 本質(zhì)上面其實(shí)是一樣的,那么 count(column) 又是怎么回事呢?

                count(column) 也是會遍歷整張表,但是不同的是它會拿到 column 的值以后判斷是否為空,然后再進(jìn)行累加,那么如果針對主鍵需要解析內(nèi)容,如果是二級所以需要再次根據(jù)主鍵獲取內(nèi)容,又是一次 IO 操作,所以 count(column) 的性能肯定不如前兩者嘍,如果按照效率比較的話:count(*)=count(1)>count(primary key)>count(column)

                既然 count(*) 在查詢上依賴于所有的數(shù)據(jù)集,是不是我們在設(shè)計(jì)上也需要盡量的規(guī)避全量 count 呢?通常情況我們針對可預(yù)見的 count 查詢會做適當(dāng)?shù)木彺妫梢允?Redis,也可以是獨(dú)立的 MySQL count 表,當(dāng)然無論是哪種方式我們都需要考慮一致性的問題。

                到這里文章就結(jié)束了,你對 count() 有了重新的認(rèn)識么?文中提到了一些關(guān)鍵字:聚簇索引、InnoDB、MyISAM、MVCC 不是本文的重點(diǎn),有興趣可以持續(xù)關(guān)注訂閱號或置頂,后面會針對這些關(guān)鍵字逐一展開說明。


                本網(wǎng)站內(nèi)容僅代表作者本人的觀點(diǎn),不代表本網(wǎng)站的觀點(diǎn)和看法,與本網(wǎng)站立場無關(guān),如有侵權(quán)請聯(lián)系討教。
                給作者打賞,鼓勵(lì)TA抓緊創(chuàng)作
                0人打賞金額
                JAVA葵花寶典
                16篇 作品
                1937 總閱讀量
                評論
                您可能感興趣的文章

                項(xiàng)目管理服務(wù)模式

                敏捷項(xiàng)目管理與傳統(tǒng)項(xiàng)目管理比較

                項(xiàng)目管理的特點(diǎn)

                PMO是什么?是管項(xiàng)目經(jīng)理的嘛?

                項(xiàng)目經(jīng)理必須關(guān)注的開會十大關(guān)鍵問題!

                項(xiàng)目的組成要素

                熱門話題 更多話題
                精益生產(chǎn) 質(zhì)量管理 智能制造
                職場效率 項(xiàng)目管理 討教
                AI 大數(shù)據(jù) 六西格瑪
                ×

                給作者打賞,鼓勵(lì)TA抓緊創(chuàng)作!

                選擇支付方式
                選擇打賞金額
                注:打賞的收益歸作者,非平臺

                微信掃描支付

                打賞金額: 1元

                ×

                給作者打賞,鼓勵(lì)TA抓緊創(chuàng)作!

                您的討教幣
                填寫您打賞討教幣數(shù)量
                輸入密碼

                111

                注:打賞的收益歸作者,非平臺

                微信掃描支付

                打賞金額: 1元

                感谢您访问我们的网站,您可能还对以下资源感兴趣:

                国产精品久久久久久久人人看
                主站蜘蛛池模板: 国产成人无码一区二区在线观看 | 亚洲一区二区三区四区在线观看 | 日韩人妻无码一区二区三区久久| 中文字幕日本精品一区二区三区| 国产成人精品无码一区二区三区| 国内精品一区二区三区在线观看| 日本精品一区二区三区在线视频| 国产欧美色一区二区三区| 亚拍精品一区二区三区| 日韩一区二区三区不卡视频| 亚洲国产AV无码一区二区三区| 国产一区精品视频| 国产精品免费视频一区| 国产一区二区在线观看app| 成人区人妻精品一区二区不卡视频 | 无码喷水一区二区浪潮AV| 亚洲日本va一区二区三区| 国产日韩一区二区三区| 日韩精品无码视频一区二区蜜桃| 无码人妻久久一区二区三区| 精品国产一区二区三区免费| 最新欧美精品一区二区三区| 国产精品第一区揄拍| 一区三区三区不卡| 看电影来5566一区.二区| 国产午夜毛片一区二区三区| 日韩一区二区在线视频| 无码人妻啪啪一区二区| 丰满少妇内射一区| 久久亚洲日韩精品一区二区三区| 天天躁日日躁狠狠躁一区| 国产一区二区三区四| 国产免费无码一区二区| 精产国品一区二区三产区| 日本人的色道www免费一区| 无码人妻精品一区二区三| 亚洲综合色一区二区三区| 福利一区二区在线| 国产在线视频一区二区三区98| 无码人妻精品一区二区三区不卡| 久久国产精品亚洲一区二区|
              1. <button id="fksdo"><ruby id="fksdo"></ruby></button>

                          1. <label id="fksdo"></label><blockquote id="fksdo"><ruby id="fksdo"></ruby></blockquote>