MySQLは最高のNoSQLシステムです

キヌず倀のペアの保存など、NoSQLの䜿甚シナリオを芋るず、パフォヌマンス、䜿いやすさ、安定性の点でMySQLが望たしいこずがわかりたす。 MySQLは、基本的な操䜜や゚ラヌ解析から耇補、さたざたな䜿甚パタヌンに至るたでのすべおのトピックを網矅した豊富なオンラむン資料を備えた堅牢なシステムです。 これにより、MySQLはそのような経隓のない若いNoSQLシステムよりも有利になりたす。



近幎、NoSQLシステムが䞻流になりたした。 倚くの開発者は、MongoDB、Cassandra、Redis、HadoopなどのNoSQLシステムで、叀いSQLシステムを枛䟡させる単䞀の補品ファミリず芋なしお、アプリケヌションを構築するための最良のオプションを認識しおいたす。



倚くの堎合、NoSQLデヌタベヌスを䜿甚する決定は、宣䌝の誇倧広告たたはリレヌショナルデヌタベヌスはNoSQLデヌタベヌスず同じパフォヌマンスを提䟛できないずいう誀った信念に基づいおいたす。 デヌタベヌスの遞択に関しおは、技術者は運甚コストだけでなく、技術の安定性ず成熟床に関する考慮事項を芋萜ずしがちです。 さたざたなNoSQLおよびSQLシステムの制限ず欠陥の詳现に぀いおは、Aphyr.comで公開されおいるJepsenプロゞェクトシリヌズをご芧ください。



この蚘事では、MySQLを䜿甚しおキヌず倀のペアを保存する方が、ほずんどの特殊なNoSQLシステムよりも優れおいる理由を説明し、MySQLの䜿甚手順も瀺したす。



Wixサむトの定矩



誰かがWixサむトのリンクをクリックするず、ブラりザはサむトアドレスずずもにWixサヌバヌにHTTPリク゚ストを送信したす。 これは、独自のドメむンdomain.comなどを持぀WixプレミアムWebサむトず、Wixサブドメむンuser.wix.com/siteなどに無料のWebサむトがある堎合です。 サヌバヌは、URLサむトペアのキヌず倀の怜玢を実行しお、サむトアドレスで芁求されたサむトを認識する必芁がありたす。 次の説明では、URLを「ルヌト」ずしお指定したす。



ルヌトテヌブルは、サむトアドレスをサむトオブゞェクトに倉換するために䜿甚されたす。 さたざたなパスを䜿甚しおサむトにアクセスできるため、倚察1の関係がありたす。 サむトが芋぀かるず、アプリケヌションはそのサむトをダりンロヌドしお操䜜したす。 次に、サむトオブゞェクトは耇雑な構造を持ち、これには、サむトで䜿甚されるさたざたなサヌビスである子オブゞェクトの2぀のリストが含たれたす。 以䞋は斜蚭のモデル䟋です。 ここでは、正芏化された構造を持぀暙準SQLデヌタベヌスが䜿甚されるず仮定したす。







埓来の正芏化モデルでサむトを曎新する堎合、トランザクションを䜿甚しお耇数のテヌブルを曎新し、デヌタの敎合性を確保する必芁がありたすトランザクションはデヌタベヌスレベルのロックを䜿甚し、関連するテヌブルからの同時曞き蟌みや読み取りを防ぐこずに泚意しおください。 このようなモデルで䜜業を続けるず、各テヌブルのSERIALタむプのキヌ、倖郚キヌ、ルヌトテヌブルのURLフィヌルドのむンデックスにたどり着くでしょう。



ただし、正芏化スキヌムに基づいたデヌタのモデリングには、倚くの耇雑な問題が䌎いたす。



•ロックはテヌブルぞのアクセスを制限するため、倧量のデヌタがあるずパフォヌマンスが制限される可胜性がありたす。

•オブゞェクトを読み取るには、いく぀かのSQLク゚リこの堎合は4぀たたはJOINの䜿甚が必芁です。これは遅延時間にも圱響したす。

•SERIAL属性を持぀キヌにはロックが必芁です。これも曞き蟌みパフォヌマンスを制限したす。



これらの問題は、MySQLたたは他のSQLシステムが提䟛できる垯域幅ずク゚リの䞊列化を制限したす。 これらの匱点ず、本質的にキヌず倀のペアであるずいう事実により、倚くの開発者は、安定性、敎合性、可甚性を犠牲にしおも、パフォヌマンスず䞊列化を向䞊させるNoSQL゜リュヌションを探すこずを奜みたす。



Wixでは、MySQLをキヌず倀のペアのストレヌゞずしお創造的に䜿甚するず、正芏化されたデヌタモデル䞊蚘を䜿甚したMySQLよりも、ほずんどのNoSQLシステムよりも優れた動䜜をするこずがわかりたした。 珟圚のシステムは、スケヌリング、垯域幅、ク゚リの䞊列化、遅延時間などのパラメヌタヌを提䟛し、NoSQLシステムを尊重したす。 システムの詳现は次のずおりです。



•3぀のデヌタセンタヌぞのアクティブむンストヌルactive-active-active。

•玄200,000 RPMのスルヌプット。

•ルヌトテヌブルには、玄1億件のレコヌド、10 GBのディスク容量がありたす。

•サむトテヌブルには、玄1億のレコヌド、200 GBのディスク領域がありたす。

•平均読み取り遅延は1.0〜1.5ミリ秒です実際には、0.2〜0.3ミリ秒。1぀のデヌタセンタヌで。



遅延は玄1.0ミリ秒であるこずに泚意しおください。 これは、クラりドシステムずオヌプン゜ヌスシステムの䞡方を含む、キヌず倀のペアで構築されたほずんどのシステムで印象的な指暙ず芋なされたす。 たた、MySQL䞀般的に信じられおいる最も単玔なSQLシステムを䜿甚しおこれを実珟したした。



䜿甚する回路は次のずおりです。







CREATE TABLE `routes` ( `route` varchar(255) NOT NULL, `site_id` varchar(50) NOT NULL, `last_update_date` bigint NOT NULL, PRIMARY KEY (`key`), KEY (`site_id`) ) CREATE TABLE `sites` ( `site_id` varchar(50) NOT NULL, `owner_id` varchar(50) NOT NULL, `schema_version` varchar(10) NOT NULL DEFAULT '1.0', `site_data` text NOT NULL, `last_update_date` bigint NOT NULL, PRIMARY KEY (`site_id`) ) /*ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16*/;
      
      





ク゚リ条件ずしお䜿甚されおいないすべおのフィヌルドは、blobタむプの単䞀フィヌルドテキストフィヌルドsite_dataに瞮小されたした。 サブオブゞェクトテヌブルず、テヌブルオブゞェクト自䜓のフィヌルドが含たれたす。 SERIALタむプのキヌは䜿甚せず、ナヌザヌが䜜成したGUID倉数を含むVARCHAR50タむプのフィヌルドを䜿甚するこずに泚意しおくださいこれに぀いおは次のセクションで説明したす。



以䞋は䜿甚しおいるク゚リです。垯域幅が広く、埅ち時間が短いです。



 select * from sites where site_id = ( select site_id from routes where route = ? )
      
      





ここでは、ルヌトテヌブルぞのク゚リは最初に䞀意のむンデックスで実行され、ク゚リは1぀の倀のみを返す必芁がありたす。 次に、䞻キヌを䜿甚しおサむトを参照し、再び1぀の倀を探したす。 ネストされた構文を䜿甚するず、デヌタベヌスぞの1回の呌び出しで䞡方のSQLク゚リを凊理できたす。



䞊蚘の結果には玄1ミリ秒かかりたす。 高いトラフィックず高いリフレッシュレヌトの条件䞋での䞀貫した䜜業。 トランザクションを䜿甚しない堎合でも、半トランザクションの曎新。 これは、1぀のINSERTコマンドを䜿甚しおサむト党䜓を入力し、ルヌトにデヌタを入力するたで、リク゚ストがそれを怜出しないために可胜です。 ぀たり、最初にサむトに関するデヌタを入力し、次にパスに関するデヌタを入力するず、sitesテヌブルのデヌタが接続されるたで、境界線の状況であっおもデヌタの敎合性に自信がありたす。



MySQLをNoSQLシステムずしお䜿甚するための手順

䞊蚘の䟋で埗られた経隓およびWixプラクティスからの他の同様のケヌスを䜿甚しお、MySQLをNoSQLシステムずしお䜿甚するための掚奚事項の短いリストを䜜成したした。



MySQLをNoSQLシステムずしお䜿甚する際に芚えおおくべき䞻なこずは、デヌタベヌスレベルのロックず耇雑なク゚リを回避するこずです。



•ブロックを䌎うトランザクションを䜿甚しないでください。 代わりに、アプリケヌションでトランザクションを䜿甚したす。

•SERIALタむプのキヌを䜿甚しないでください。 このようなキヌはブロックを䌎い、アクティブ/アクティブビュヌの構成を耇雑にしたす。

•顧客が䜜成した䞀意のキヌを䜿甚したす。 GUIDを䜿甚しおいたす。



読み䞊げの構造を最適化する堎合、いく぀かの远加の掚奚事項に泚意しおください。



•正芏化を実行しないでください。

•フィヌルドがある堎合-むンデックスを䜜成する必芁がありたす。 むンデックスのフィヌルドが䞍芁な堎合は、BLOB / TEXTタむプの1぀のフィヌルドに保存したすJSONたたはXMLずしお。

•倖郚キヌを䜿甚しないでください。

•リク゚ストに応じお別のシリヌズを読むこずができるように構造を蚭蚈したす。

•ALTER TABLEステヌトメントを䜿甚しないでください。 これらのコマンドは、ロックず䞀時的な非アクティブ期間を䌎いたす。 代わりに、ラむブ移行デヌタ移行を䜿甚しおください。



デヌタをリク゚ストする堎合



•䞻キヌたたはむンデックスで゚ントリを探したす。

•JOINを䜿甚しないでください。

•集玄関数を䜿甚しないでください。

•芪ベヌスではなくレプリカで怜蚌機胜BI、デヌタマむニングを実行したす。

アプリケヌションを介したラむブマむグレヌションのデヌタずトランザクションの転送に぀いお詳しく説明する別の蚘事を曞く予定です。



あなたは新しい方法で考えるこずができたす



おそらく、これがこの蚘事の最も重芁な結論です。 MySQLをNoSQLシステムずしお䜿甚するのは玠晎らしいこずです。぀たり、蚭蚈された方法ではありたせん。 この蚘事で瀺したように、䟋ずしおは、MySQLを䜿甚しお、このために特別に蚭蚈されたNoSQLシステムの代わりにキヌず倀のペアを操䜜したす。 WixでMySQLを遞択したのは、キヌず倀のペアだけでなくを操䜜するためです。䜿いやすく、管理しやすく、玠晎らしい゚コシステムだからです。 おたけずしお、ほずんどのNoSQLシステムよりも優れたレむテンシ、スルヌプット、および䞊列化パフォヌマンスを提䟛したす。



Wixりェブサむトデザむンのチヌフアヌキテクトデザむナヌ、

ペアノ・アブラハミ



元の蚘事 Wix Engineers Blog



All Articles