MySQLにはないPostgreSQL機胜、およびその逆





倚くの人は、それが䞎えるものを挠然ずしか理解しおいないずいう事実のため、「筋肉」から「迷走」に切り替えるこずを恐れおいたす。 䞀郚の人々は、Postgresはおそらくあたりにも耇雑で、トレヌニングが必芁であるずいう考えにずらわれおいたす。 たた、移行に䌎い䜕かが倱われる可胜性がありたす。 状況を少し明確にしようず思いたす。



䞀般的に蚀えば、誰かが耇雑さを恐れおいる堎合、初心者は通垞のようにできたす。新機胜を䜿甚せずに、MySQLからPostgreSQLに「ダム」スむッチしたす。 SQL-アフリカSQLにもありたす。ロケット科孊ではありたせん。 この移行では、いわゆるプログラミングでは耇雑なこずは䜕もありたせん。 さお、匕甚笊は異なりたすが、構文は少し厳密です。 ぀たり pgをmysqlずしお䜿甚し、他の匕甚笊を付けお開始し、プレむの進行ずずもに孊習したす。



さお、䞀方にはあるが、他方にはない、たたはその逆に぀いお。 パンの皮類を理解する。 もちろん、これは完党なリストではなく、重芁床で䞊べ替えられおいるわけではありたせんが、それでもなお䞊べられおいたす。



おそらく筋肉にはない眪の欠点から始めたしょう。



  1. 進行䞭の実皌働環境で䜜業するには、専門的にセットアップする必芁がありたす。 shared_buffers、自動バキュヌム蚭定などを正しく蚭定しないず、深刻な負荷の䞋ですべおがゆっくりず動䜜したす。 特に厄介なのは、高負荷プロゞェクトの堎合、ほずんど垞にpgbouncerこれはサヌドパヌティの開発が必芁なこずです。これにより、キュヌに接続が蓄積され、進行状況自䜓ぞの接続数が制限されたす。 これがpostgres自䜓に組み蟌たれおいないのは奇劙です
  2. 自動バキュヌム。 簡単に蚀えば、曞き蟌み/削陀の高速化を実珟するために、プログレッションはガベヌゞの山を残し、その埌、特別に蚓緎されたデヌモンによっおクリヌンアップされたす。 特に非垞に忙しいベヌスで自動バキュヌムを蚭定したり、愚か者をオフにしたりするのが間違っおいる堎合、テヌブルが占める堎所が膚らみ、遅かれ早かれ、詰たる、たたは膚らむこずなく、詰たる可胜性のあるものすべおが詰たり、ベヌスが単に立ち䞊がるこずができたすトランザクションIDが終了したした。 各䌚議では、誰かがどのように自動バキュヌムで英雄的に戊っお勝ったかに぀いおの3-4のレポヌトがありたす。
  3. 最近たで、INSERT IGNOREおよびINSERT ON DUPLICATE KEY UPDATEはありたせんでした。 9.5から、アナログが登堎したした。 誰もが必芁ずするような機胜の実装に長い間匕きずられおいたこずは非垞に奇劙です。
  4. Mysqlでは、ク゚リ内の倉数を盎接操䜜できたす。

    	 SELECT @x= 0;
             SELECT @x= @ x + 1 FROMテヌブル;
    


    進行䞭のそのようなこずはありたせん、少なくずも私はそれを芋぀けたせんでしたあなたが間違えた堎合に曞いおください。 ぀たり、もちろん、䜕でもできるストレヌゞを䜜成するこずはできたすが、リク゚ストに応じお適切に䜜成するこずはできたせん。
  5. 通垞のphpmyadminに察応するものはありたせん。 実際、私が知っおいるクヌルな同僚のほずんどは、最初は慣れるのが難しいコマンドラむンでSQLを䜿甚しおいたす。 いいえ、あらゆる皮類のpgMyAdminなどがありたすが、それぞれに䜕らかの欠陥がありたす。 たぶん良い有料のものがあるので、私はチェックしたせんでした。
  6. Mysqlは誰もが知っおいる、postgresqlは誰も知らない。 したがっお、倚くの堎合、新しいプロゞェクトはpostgresqlで開始するこずを恐れおいたす。 「デヌタベヌス」ずいう蚀葉ずmysqlずいう蚀葉がたったく同じ同矩語である、PHPプログラマヌのクラスがありたす。 ぀たり 圌らが貝殻か䜕かから抜け出すこずはどういうわけか困難です。
  7. 圌らは、安䟡なホスティングは管理がより難しいので、postgresqlを本圓に奜きではないず蚀いたす。 たずえば、postgresにログむンできるナヌザヌを䜜成するには、sqlク゚リを実行しおpg_hba.confに曞き蟌むずいう2぀の堎所でこれを行う必芁がありたす。


珟時点でmysqlず比范した堎合の欠点のうち。 他に䜕か特別なこずを知っおいる堎合、mysqlにあるものずpostgresqlにないものをコメントで曞きたす。 これで、postgresqlの利点



  1. CTE共通テヌブル匏



    簡単な方法で説明するず、サブク゚リを個別に蚘述しお、名前を付け、デヌタベヌスぞの単䞀ク゚リのフレヌムワヌク内でこれらすべおを蚘述するこずができたす。 䟋えば

     WITH subquery1 AS
          遞択...  
           JOIN ...
           JOIN ...
          GROUP BY ....
    
     、
     subquery2 AS
          遞択...
           WHERE ....
     
    
    遞択* 
     FROM subquery1
         JOINサブク゚リ2
               オン...
    
    


    名前付きサブク゚リがなくおも、結合およびサブク゚リブラケットを䜿甚しお頭脳党䜓を壊すこずができる、非垞に耇雑なク゚リには非垞に䟿利です。 もちろん、パフォヌマンスには倚くの埮劙な違いがありたすが、それでも非垞に䟿利です。 これはMySQLにはありたせん。 ずころで、CTEのサブク゚リは再垰的に䜿甚できたす。たずえば、「id、parent_id」ずいう圢匏のテヌブルのサブツリヌ党䜓を取埗できたす。
  2. IPアドレスを操䜜したす。 たずえば、ip-addressで郜垂/囜をすばやく特定する必芁がありたす。



    ここでは、進行䞭にカスタムデヌタ型があり、これらの型で動䜜する挔算子さえあるこずを蚀わなければなりたせん。 䞀郚は自分で行うこずができ、䞀郚は回線に拡匵機胜を远加するこずで取埗できたす。 たずえば、次のようなこずができるip4r拡匵がありたす。



     -IP範囲を持぀テヌブルを䜜成する
    テヌブルip_ranges
         ip_range ip4r
     ;
     ip_rangesに挿入したす
    倀 
      '2.2.3.4-2.2.3.10'、
      '1.2.0.0/16';
    
    


    これで、&&挔算子を䜿甚しお、指定されたipず​​亀差する範囲のリストを取埗できたす。



     test => select * from ip_ranges where ip_range && '1.2.1.1';
       ip_range  
     ------------
      1.2.0.0/16
     1行
    


    ヒヌプたでは他の挔算子がありたす互いの範囲など。怜玢を非垞に高速にするために、特別なGISTむンデックスを䜜成できたす。

     CREATE INDEX ip_ranges_idx ON ip_ranges USING GISTip_range;
    


    そしお、倧量のデヌタでもすべおが「飛ぶ」だけです。 mysqlでこれを行う方法は想像できたせんが、おそらくいく぀かの方法がありたすか
  3. さたざたな制玄、぀たり 敎合性のためのデヌタベヌスの制玄。 MySQLにはUNIQUE、NOT NULL、FOREIGN KEYなどもありたす。 しかし、これはどうですか



    前の䟋のテヌブルを倉曎したす。



     ALTER TABLE ip_ranges
       制玄の远加ip_ranges_exclude
        GISTを䜿甚しお陀倖ip_range WITH &&;
    


    この゚ントリにより、テヌブル内のIP範囲のみが互いに亀差しないこずが保蚌されたす。 IPの䞀郚がすでにテヌブルに含たれおいる範囲を挿入しようずするず、䞍正䜿甚が発生したす。



    テスト=> ip_ranges倀に挿入 '1.2.3.4/32';
    ゚ラヌキヌ倀の競合が陀倖制玄「ip_ranges_exclude」に違反しおいたす
    詳现キヌip_range=1.2.3.4は既存のキヌip_range=1.2.0.0/16ず競合したす。
    


    同様に、たずえばcircleデヌタ型を䜿甚しお、互いに玠な円がテヌブルに保存されおいるこずを確認できたす。 ちなみに、いく぀かの幟䜕孊タむプずそれらを䜿甚した操䜜は、暙準配信に盎接組み蟌たれおいたす円、ボックス、倚角圢など。



    別の䟿利な制玄



    テヌブル商品の䜜成
         id bigint、
       䟡栌の小数11,2、
          ...
        
        チェックprice> = 0.01
     
    
    


    たた、誀っおれロ䟡栌の補品をそこに挿入するこずはありたせん。 もちろん、チェック内の条件はどれでもかたいたせん。
  4. 最新バヌゞョンのsgresのキラヌ機胜はjsonbタむプで、これによりゞェむ゜ンで非垞に迅速に怜玢できたす。 このこずに぀いおの2番目の蚘事では、すべおの耳がガラガラしおいるので、詳しくは説明したせん。
  5. いわゆる「りィンドり関数」。 たずえば、サブク゚リずグルヌプ化を䜿甚せずに、埓業員ごずに圌の絊䞎ず同じ行の郚門の平均絊䞎を配る必芁がありたす。



    遞択 
     depname、 
     empno、 
    絊料 
    平均絊䞎オヌバヌdepnameによるパヌティション 
     FROM empsalary;
    
       depname |  empno | 絊䞎| 平均          
     ----------- + ------- + -------- + --------------------- -
     開発する|  11 |  5200 |  5020.0000000000000000
     開発する|  7 |  4200 |  5020.0000000000000000
     開発する|  9 |  4500 |  5020.0000000000000000
     開発する|  8 |  6000 |  5020.0000000000000000
     開発する|  10 |  5200 |  5020.0000000000000000
     人事|  5 |  3500 |  3700.0000000000000000
     人事|  2 |  3900 |  3700.0000000000000000
     販売|  3 |  4800 |  4866.666666666666666667
     販売|  1 |  5000 |  4866.666666666666666667
     販売|  4 |  4800 |  4866.666666666666666667
     10行
    
    


    りィンドり関数を䜿甚するず、タスクのクラス党䜓を簡玠化できたす。たずえば、分析や請求に非垞に圹立ちたす。
  6. ストアドプロシヌゞャは、さたざたな蚀語で䜜成できたす。puresql、pl / pgsqlSQLベヌスでの䜜業に䟿利ですが、遅い、javascriptpl / v8、真珠で、神は他のこずを知っおいたす。 siを知っおいお、かなり熱心な堎合は、奜きな蚀語を皮牡銬に添付するこずもできたす。 これはpgdayで詳现に議論されたした。 私の意芋では、postgresqlでは、保存されたファむルの蚀語ではすべおがそれほどスムヌズではありたせんが、mysqlよりも100倍優れおいたす。
  7. フィヌルドだけでなく、フィヌルドの関数によっおもむンデックスを䜜成できたす。
  8. レプリケヌションホットスタンバむは賢明に行われたす。 迅速か぀䞀貫しお機胜したす。
  9. スピヌド。 私の䞻芳的な感芚によるず、私は䞡方のデヌタベヌスで長幎働いおいたため、Postgresql党䜓はMySQLよりもはるかに高速です。 時々。 挿入ず読み取りの䞡方。 もちろん、正しく構成されおいれば。

    これは、mysqlが単に凊理できない耇雑なク゚リを実行し、䞀時テヌブルをフェンスする必芁がある堎合に特に圓おはたりたす。
  10. すべおの厳しさ。 mysqlでは、厳密なデフォルトモヌドのみが5.7で䜜成されたようですチェックしたせんでした、本圓にそうですか。 これに先立ち、10進数5,2型のフィヌルドに䜍眮より倧きい数倀を挿入するこずが可胜でした。その結果、静かに999.99を取埗したした。 線などのサむレントトリミング そのような冗談は闇がありたす。 これがデフォルトの動䜜です。 Postgresqlは骚ず呪いをかけたすが、あいたいな芁求を静かに実行したせん。
  11. トランザクション。 CREATE TABLE、ALTER TABLEなどは、単玔なク゚リず同様に、単䞀のトランザクションで実行したり、䜕か問題がある堎合は途䞭でトランザクションをロヌルバックしたりできたす。 時間が経おば、それなしでmysqlを䜿甚する方法を理解できなくなりたす。
  12. すぐに䜿甚できる党文怜玢。 そこで、私の意芋では、構文は普通の人には少し珍しいですが、すべおが機胜し、スフィンクスのようなサヌドパヌティのガゞェットを接続する必芁はありたせん。
  13. シヌケンス mysqlでは、テヌブルフィヌルドごずにAUTO_INCREMENTのみがあり、䞀床に1぀ず぀チェックされたす。 postgresqlでは、このメカニズムはテヌブルずは独立しお存圚し、さたざたなニヌズに䜿甚できたす。さらに、ルヌプで䜜成するこずもできたす。
  14. DBAはpostgresqlをメむンのトランザクションマシンず芋なしおいるようです。 そこにあるトランザクションは深く、うたく組み蟌たれおいるため、挿入ず読み取りの䞡方で、すべおが迅速か぀確実に機胜したす。 mysqlでは、システムが異なり、ベヌスがあり、個別の゚ンゞンinnodb、myisamなどがあり、゚ンゞンはすべおトランザクションではありたせん。 このトランザクションの分離にはいく぀かの問題がありたす。 たずえば、myisamはトランザクションではなく、innodbはトランザクションであり、同じク゚リで䞡方のテヌブルを䜿甚できたす。 基地が同時にどのように機胜するか、予枬するこずは想定しおいたせん。おそらく困難で束葉杖です。
  15. 䞻芳的に、postgresqlのバグは少ないです。 圌らがどのようにこれを達成しおいるかはわかりたせんが、私にずっおこれは事実です-非垞に安定した信頌性の高いシステムであり、重い負荷ずデヌタ量の䞋でも。


これはHabrサンドボックスに関する私の最初の投皿なので、匷く、建蚭的に批刀しおください。



これらのベヌスの特定の利点ず欠点は䜕ですか コメントを曞いおください。



All Articles