首頁 資料庫 mysql教程 Mysq的一些常見誤解

Mysq的一些常見誤解

Jun 20, 2017 pm 03:37 PM
基礎

常見誤解

    1. count(1)和count(primary_key) 優於count(*)

    很多人為了統計記錄條數,就使用count(1) 和count(primary_key) 而不是count(*) ,他們認為這樣效能更好,其實這是一個誤解。對於有些場景,這樣做可能效能會更差,並且應為資料庫對 count(*) 計數操作做了一些特別的最佳化。
      1. count(column) 和count(*) 是一樣的

      這個迷思甚至在很多的資深工程師或者是DBA 中都普遍存在,很多人都會認為這是理所當然的。實際上,count(column) 和 count(*) 是一個完全不一樣的操作,所代表的意義也完全不一樣。
      count(column) 是表示結果集中有多少個column欄位不為空的記錄
      count(*) 是表示整個結果集有多少筆記錄
        1. select a,b from … 比select a,b,c from … 可以讓資料庫存取更少的資料量

        這個誤解主要存在於大量的開發人員中,主要原因是對資料庫的儲存原理不是太了解。
        實際上,大多數關係型資料庫都是按照行(row)的方式存儲,而資料存取操作都是以一個固定大小的IO單元(被稱為block 或page)為單位,一般為4KB,8KB… 大多數時候,每個IO單元中儲存了多行,每行都是儲存了該行的所有欄位(lob等特殊類型欄位除外)。
        所以,我們是取一個字段還是多個字段,實際上資料庫在表中需要存取的資料量其實是一樣的。
        當然,也有例外情況,那就是我們的這個查詢在索引中就可以完成,也就是說當只取a,b兩個欄位的時候,不需要回表,而c這個欄位不在使用的索引中,需要回表取得其資料。在這樣的情況下,二者的IO量會有較大差異。
          1. order by 一定需要排序操作

          我們知道索引資料其實是有順序的,如果我們的所需的資料和某個索引的順序一致,而且我們的查詢又透過這個索引來執行,那麼資料庫一般會省略排序操作,而直接將資料傳回,因為資料庫知道資料已經滿足我們的排序需求了。
          實際上,利用索引來最佳化排序需求的SQL,是一個非常重要的最佳化手段
          延伸閱讀:MySQL ORDER BY 的實作分析 ,MySQL 中GROUP BY 基本實作原理 以及MySQL DISTINCT 的基本實作原理 這3篇文章中有更深入的分析,尤其是第一篇
            1. 執行計畫中有filesort 就會進行磁碟檔案排序

            有這個誤解其實不能怪我們,而是因為MySQL 開發者在用詞上的問題。 filesort 是我們在使用 explain 指令查看一條 SQL 的執行計劃的時候可能會看到在 “Extra” 一列顯示的資訊。
            實際上,只要一條 SQL 語句需要進行排序操作,都會顯示“Using filesort”,這並不表示就會有檔案排序操作。
            延伸閱讀:理解 MySQL Explain 指令輸出中的filesort,我在這裡有更詳細的介紹
            • 基本原則

              1. 盡量少join

              MySQL 的優點在於簡單,但這在某些方面其實也是其劣勢。 MySQL 優化器效率高,但由於其統計資訊的量有限,優化器工作過程出現偏差的可能性也更多。對於複雜的多表 Join,一方面由於其優化器受限,再者在 Join 這方面所下的功夫還不夠,所以性能表現離 Oracle 等關係型資料庫前輩還是有一定距離。但如果是簡單的單表查詢,這一差距就會極小甚至在有些場景下要優於這些資料庫前輩。
                1. 盡量少排序

                #排序作業會消耗較多的CPU 資源,所以減少排序可以在快取命中率高等IO 能力足夠的場景下會較大影響SQL 的反應時間。
                對於MySQL來說,減少排序有多種辦法,例如:
                • 上面誤區中提到的透過利用索引來排序的方式進行最佳化

                • #減少參與排序的記錄條數

                • #非必要不對資料排序

                • 避免使用耗費資源的操作,具有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎執行,耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序

                 
                #

                以上是Mysq的一些常見誤解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

                本網站聲明
                本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

                熱AI工具

                Undresser.AI Undress

                Undresser.AI Undress

                人工智慧驅動的應用程序,用於創建逼真的裸體照片

                AI Clothes Remover

                AI Clothes Remover

                用於從照片中去除衣服的線上人工智慧工具。

                Undress AI Tool

                Undress AI Tool

                免費脫衣圖片

                Clothoff.io

                Clothoff.io

                AI脫衣器

                AI Hentai Generator

                AI Hentai Generator

                免費產生 AI 無盡。

                熱門文章

                R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
                3 週前 By 尊渡假赌尊渡假赌尊渡假赌
                R.E.P.O.最佳圖形設置
                3 週前 By 尊渡假赌尊渡假赌尊渡假赌
                R.E.P.O.如果您聽不到任何人,如何修復音頻
                4 週前 By 尊渡假赌尊渡假赌尊渡假赌
                WWE 2K25:如何解鎖Myrise中的所有內容
                1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

                熱工具

                記事本++7.3.1

                記事本++7.3.1

                好用且免費的程式碼編輯器

                SublimeText3漢化版

                SublimeText3漢化版

                中文版,非常好用

                禪工作室 13.0.1

                禪工作室 13.0.1

                強大的PHP整合開發環境

                Dreamweaver CS6

                Dreamweaver CS6

                視覺化網頁開發工具

                SublimeText3 Mac版

                SublimeText3 Mac版

                神級程式碼編輯軟體(SublimeText3)

                PHP基礎教學:從入門到精通 PHP基礎教學:從入門到精通 Jun 18, 2023 am 09:43 AM

                PHP是一種廣泛使用的開源伺服器端腳本語言,它可以處理Web開發中所有的任務。 PHP在網頁開發的應用廣泛,尤其是在動態資料處理上表現優異,因此被許多開發者喜愛和使用。在本篇文章中,我們將一步步講解PHP基礎知識,幫助初學者從入門到精通。一、基本語法PHP是一種解釋性語言,其程式碼類似HTML、CSS和JavaScript。每個PHP語句都以分號;結束,註

                學習Go語言變數的基礎知識 學習Go語言變數的基礎知識 Mar 22, 2024 pm 09:39 PM

                Go語言是一種由Google開發的靜態類型、編譯型語言,其簡潔、高效的特性受到了廣泛的開發者關注和喜愛。在學習Go語言的過程中,熟練變數的基礎知識是至關重要的一步。本文將透過具體的程式碼範例來講解Go語言中變數的定義、賦值、類型推論等基礎知識,幫助讀者更能理解和掌握這些知識點。在Go語言中,定義一個變數可以使用關鍵字var,即var變數名變數類型的格

                Linux可以零基礎學習嗎?需要學什麼? Linux可以零基礎學習嗎?需要學什麼? Feb 19, 2024 pm 12:57 PM

                  想要從事IT行業,但是有不想要學習程式設計該選擇哪門技術合適呢?當然是Linux運維了。 Linux是市場上非常受歡迎的技術,應用範圍廣泛,就業前景好,受到了很多人的喜歡。那麼問題來了,Linux運維零基礎可以學習嗎?  在伺服器市場上,Linux系統因為穩定安全、免費開源和高效便捷等優點在市場佔有率高達80%,由此可以看得出來Linux應用是非常廣泛的。無論是現在還是未來,學習Linux都是非常好的選擇。至於零基礎可以學嗎?我的答案是當然可以了。老男孩教育Linux面授班專門針對零基礎人員設

                PHP基礎入門:如何使用echo函數輸出文字內容 PHP基礎入門:如何使用echo函數輸出文字內容 Jul 30, 2023 pm 05:38 PM

                PHP基礎入門:如何使用echo函數輸出文字內容在PHP程式設計中,常常需要在網頁上輸出一些文字內容,這時就可以使用echo函數。本文將介紹如何使用echo函數輸出文字內容,並提供一些範例程式碼。在開始之前,首先要確保你已經安裝了PHP,並且配置了運行環境。如果還沒有安裝PHP,你可以在PHP官方網站(https://www.php.net)上下載最新的穩定版本。

                C語言函數詳解:基礎到進階,全面解析函數的使用 C語言函數詳解:基礎到進階,全面解析函數的使用 Feb 18, 2024 pm 02:25 PM

                C語言函數大全:從基礎到進階,詳解函數的使用方法,需要具體程式碼範例簡介:C語言是一種廣泛使用的程式語言,其強大的功能和靈活性使它成為許多開發人員的首選。在C語言中,函數是一個重要的概念,它能夠將一段程式碼組合成一個獨立的模組,提高了程式碼的重用性和可維護性。本文將從基礎開始介紹C語言函數的使用方法,並逐步進階,幫助讀者掌握函數編寫的技巧。一、函數的定義與呼叫在C

                PHP學習筆記:物件導向程式設計基礎 PHP學習筆記:物件導向程式設計基礎 Oct 09, 2023 pm 12:46 PM

                PHP學習筆記:物件導向程式設計基礎,需要具體程式碼範例導言:物件導向程式設計(Object-OrientedProgramming,簡稱OOP)是一種程式設計的思考方式,透過將問題分解為多個物件並定義物件之間的交互,來解決複雜的程式設計問題。 PHP作為一門功能強大的程式語言,也支援物件導向程式設計。本文將介紹PHP中物件導向程式設計的基礎概念和常用語法,同時提供具體的程式碼範例。類別

                PHP函數用法:從基礎到進階 PHP函數用法:從基礎到進階 Jun 15, 2023 pm 11:11 PM

                PHP是一種廣泛使用的伺服器端腳本語言,用於開發動態網站、Web應用程式和其他網路服務。在開發PHP應用程式過程中,使用函數可以幫助簡化程式碼、提高程式碼重用性和降低開發成本等。本文將介紹PHP函數的基礎用法與進階用法。一、PHP函數的基礎用法1.定義函數在PHP中,使用function關鍵字定義函數,例如:functiongreet($name){

                相對於絕對定位的參考方法 相對於絕對定位的參考方法 Jan 23, 2024 am 09:18 AM

                絕對定位是CSS中常用的定位方法之一,透過指定元素相對於其最近的"已定位"祖先元素的偏移位置,來控制元素在頁面上的位置。本文將介紹絕對定位的基本概念並提供具體的程式碼範例,幫助讀者更好地理解和應用此參照方法。絕對定位指的是透過將元素的position屬性設定為absolute來實現的。當一個元素被設定為絕對定位後,可以透過設定top、bottom、left、r

                See all articles