<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    MYSQL與PG為啥非要爭個誰好誰壞呢?

    一顆小胡椒2022-07-19 15:26:49

    MYSQL和PG是影響力最大的兩個開源關系型數據庫,這些年來圍繞這二者誰更好的問題,一直是十分激烈的。目前的大多數創新的數據庫產品和國產數據庫產品都或多或少地與這兩個數據庫有些淵源。因此也具有把這兩個數據庫分出個高下來的動力。實際上不僅僅在國內,國外PG派和MYSQL派也經常吵得不可開交。根據database Journal的統計,PG數據庫全球市場占有率大約為15%+,Mysql的全球市場占有率大約為44%+,在全球占有率方面Mysql絕對領先。不過在美國的最新統計,PG的市場占有率高達33%,反超了MYSQL的31%。我不知道這個數據是不是靠譜,實際上數據庫市場占有率的國別差異也很大,在英國,MYSQL 以6.75%小幅度領先于PG的5.74%。和幾年前的數據對比,雖然全球范圍內MYSQL的市場占有率還遠高于PG,不過二者的差距在逐漸縮小。

    實際上數據庫好壞之爭已經幾十年了,爭來爭去企業選擇數據庫產品最終還是要看應用場景、商務條件與企業的喜好或者說相關決策者的喜好。前兩年在一家互聯網金融公司,他們的CIO問我MYSQL和PG數據庫,該如何選擇。他們以前用MYSQL數據庫,數據量大了以后,SQL編寫就要十分小心,否則容易出現性能問題。而出現過性能問題的SQL語句,他們測試了一下,在PG上跑出來的性能還可以。因此他們公司內部就有些想把數據庫換成PG的想法。

    我分析了一下他們的應用場景,確實隨著數據量的增加,一些多表關聯的復雜查詢會出現性能問題,就這一點來說,換PG數據庫也說的過去。不過根據他們應用的特點、客戶的運維能力以及他們售后服務的投入,再進行分析。我們最終得出了截然不同的答案,他們還是繼續使用MYSQL,只是應用開發上設定一些開發規范,避免比較復雜的多表查詢語句。因為他們銷售的是套裝軟件,總體的研發成本會被大量的用戶攤銷,因此提高軟件質量本身就是日常工作的重點。而他們的客戶在運維方面的能力較弱,每個項目的經費也有限,較難提供比較豐富的支撐服務。使用MYSQL可以大幅度降低運維的復雜性,只要教會客戶在系統有問題的時候殺死慢查詢的會話,或者直接殺掉數據庫進程,自動重啟應用就可以解決大部分問題了。如果換成PG數據庫,在運維方面將面臨更大的復雜度,其成本遠遠高于在應用上加以優化。

    實際上,PG數據庫和MYSQL數據庫從底層設計思想上是完全不同的,MYSQL數據庫自從誕生以來就是一個簡單易用的關系型數據庫,用于一些數據規模不是很大,業務復雜度不是很復雜的廠家。隨著這些年的發展,MYSQL已經發展出了10多種存儲引擎,通過不同的存儲引擎可以實現各種各樣的業務場景。MYSQL本身就是一個和應用與應用開發結合的很緊密的數據庫,受到開發人員的喜愛也并不意外。

    而PG數據庫是一個對象關系型數據庫,是一款真正的從核心就是對象數據庫的數據庫產品。是比Oracle這種號稱對象數據庫,實際上只是在關系型數據庫中加入了一些對象支持的數據庫產品還正宗的對象數據庫。正是因為如此,PG數據庫略微復雜一些,支持更多的業務種類與開發模式。因此在各種功能支持上,PG數據庫比MYSQL更為豐富一些,把Oracle上開發的應用系統遷移到PG上也更容易一些。不過因為PG數據庫的復雜性,也導致了PG數據庫的運維和調優也更為復雜一些。

    雖然說二者的出廠默認參數設置的都不太合理,不過如果二者都用默認參數運行,PG數據庫可能會跑的更流暢一些,因此有些人以此為依據進行測試對比,得到了PG數據庫性能碾壓MYSQL的結論,實際上這種比較是極不科學的。如果都是經過了充分調優,二者在相同的硬件配置下做TPMC壓測,性能也是比較接近的。

    回到選擇數據庫產品本身來說,我們可以根據自己的應用場景,研發團隊的特點,運維團隊的能力,企業以往的歷史積累來選擇項目所使用的數據庫。如果你的開發人員能夠寫出質量比較好的SQL,那么選擇MYSQL可能會對以后的長期運行有利。如果你的業務確實特別復雜,而開發團隊的SQL又寫得特別爛,那么就別硬撐著用MYSQL了,選PG可能以后會省心一些。

    2012年的時候,和騰訊的朋友交流,那時候騰訊在一般的交易類應用里用MYSQL數據庫,而在數據集市中使用PG。我那時候還主要在搞Oracle,對MYSQL/PG的特點不太了解。我就問他們,為什么這么選擇,他們也說不出特別的道理,只是說他們公司的系統傳統上都是用MYSQL,只是數據集市中經常有比較復雜的SQL語句,經過對比發現MYSQL性能不如PG,于是他們就在這個領域全部選擇了PG。

    mysqlsql優化
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    背景我負責的系統到2021年初完成了功能上的建設,開始進入到推廣階段。隨著推廣的逐步深入,收到了很多好評的同時也收到了很多對性能的吐槽。作為一個優秀的后端程序員,這個數據肯定是不能忍的,我們馬上就進入了漫長的接口優化之路。
    在開始介紹如何優化sql前,先附上mysql內部邏輯圖讓大家有所了解連接器:?優先在緩存中進行查詢,如果查到了則直接返回,如果緩存中查詢不到,在去數據庫中查詢。
    一、前言 在應用開發的早期,數據量少,開發人員開發功能時更重視功能上的實現,隨著生產數據的增長,很多SQL語句開始暴露出性能問題,對生產的影響也越來越大,有時可能這些有問題的SQL就是整個系統性能的瓶頸。 二、SQL優化一般步驟 1、通過慢查日志等定位那些執行效率較低的SQL語句 2、explain 分析SQL的執行計劃
    如果關閉了autocommit,所有的sql語句都在一個事務中,直到執行了commit或rollback,該事務結束,并且開啟了下一個事務。DML語句等都不會強制提交事務。因此與其說ACID是事務必須滿足的條件,不如說它們是衡量事務的四個維度。undo log屬于邏輯日志,它記錄的是sql執行相關的信息。當發生回滾時,InnoDB會根據undo log做相反的事情,對于每個insert,回滾做delete;對于每個delete,回滾做insert;對于update,回滾會執行一個相反的update,把數據改回去。
    在面對超級復雜SQL語句時,性能提升尤為明顯,推薦分解為小查詢來進行優化,不過在應用設計時,如果一個查詢能解決問題且不會產生性能問題,這是完全沒問題的。MySQL查詢緩存保存查詢返回的完整結果。當查詢命中該緩存,MySQL會like返回結果,跳過了解析、優化和執行截斷。這是提高查詢性能最有效的方法之一,而且這是被MySQL引擎處理的,通常MySQL默認是不開啟查詢緩存的,需要手動開啟。
    存算一體SHARDING模式的分布式數據庫最為典型的是Oceanbase。因為大型分布式計算環境下實施緩沖區融合成本極高,因此每個TIDB節點只能有本地緩沖,不能有全局緩沖。每個SET是一組高可用組,由一主多備組成。數據按照SET進行SHARDING分區。最初此類架構的主從切換類似于MYSQL的主從切換,對前端應用的影響很大,如果業務高峰時出現主DN故障,那就是災難性的。
    并且在 MySQL 執行完畢之后,還能拿到執行結果,如果執行出錯,也要能拿到 MySQL 拋出的錯誤。而負責上述邏輯的,我們稱之為驅動,Python 里面的 MySQL 驅動最常用的就是 pymysql,這是一個同步驅動,異步驅動的話則是 asyncmy。
    MYSQL和PG是影響力最大的兩個開源關系型數據庫,這些年來圍繞這二者誰更好的問題,一直是十分激烈的。不過在美國的最新統計,PG的市場占有率高達33%,反超了MYSQL的31%。
    MySQL + JSON = 王炸!!
    2022-08-13 17:12:02
    關系型的結構化存儲存在一定的弊端,因為它需要預先定義好所有的列以及列對應的類型。當然,很多同學在用 JSON 數據類型時會遇到各種各樣的問題,其中最容易犯的誤區就是將類型 JSON 簡單理解成字符串類型。
    LIMIT 語句分頁查詢是最常用的場景之一,但也通常也是最容易出問題的地方。比如對于下面簡單的語句,一般 DBA 想到的辦法是在 type, name, create_time 字段上加組合索引。這樣條件排序都能有效的利用到索引,性能迅速提升。好吧,可能90%以上的 DBA 解決該問題就到此為止。出現這種性能問題,多數情形下是程序員偷懶了。在新設計下查詢時間基本固定,不會隨著數據量的增長而發生變化。
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类