Google Summer of CodeのMariaDBGSoC16のたずめ

MariaDB、最新のGSoCでのプロゞェクト、孊生、 王、キャベツに぀いおのやや遅れたレポヌト。



最埌-2015th-GSoCは非垞に倱敗したこずが刀明したした。 合蚈で8人の孊生がいたしたが、倚くは倏の途䞭で䞭間評䟡で倱敗し、3人はカメルヌンの同じ倧孊のそしお明らかに同じコヌスの優秀なアプリケヌションでしたが、「完党に」ずいう蚀葉からは䜕もしたせんでした、たあ、1か月半でコメントの1行が修正されたかもしれたせん。 そしお、䞭期的に倱敗した埌、圌らは私たちの決定をGoogleに䞊蚎しようずし、霧のような脅嚁を含むメヌルを送っおくれたした。 たずえば、倚くの孊生が倱敗しお自分のむメヌゞを損なうのは良くありたせん。来幎、Googleは堎所を䞎えたせん。



しかし、Googleは埓わず、圌らに䞎えたした。 そしお今幎は、おそらく察照的に、非垞に成功したこずが刀明したした。



今幎、54人の孊生が䞻匵する10スロットが割り圓おられたした。 過去1幎間の悲しい経隓を考慮しお、受け入れられたすべおの孊生が異なる倧孊の出身であるこずを確認したした。ハッキングする堎合は、互いに独立しおいたす。 それはい぀ものこずでした-䜕人かの孊生が事前に私たちのメヌリングリストに曞き蟌み、IRCに登堎し、プロゞェクトに぀いお議論したした。 2人の孊生が実際のプロトタむプを䜜成したした。 もちろん、そのようなアクティブなものはすべお受け入れられたした。 残りは船倖に残され、競争は倧きかった。 受け入れられた10人の孊生から、次のこずが刀明したした。





ダニ゚ル・メドベヌゞェフPAD照合なし



ドキュメンテヌションに蚘茉されおいるように実際には簡朔に、行間で、異なる長さの文字列を比范する堎合、MariaDBサヌバヌおよびPerconaサヌバヌずMySQLは、長さが等しくなるたで぀たり、実際には補完されない、短い文字列をスペヌスで補完したす、ただし、結果は補足のようになりたす。 次のようになりたす。



MariaDB [test]> select "abcd" > "abc"; +----------------+ | "abcd" > "abc" | +----------------+ | 1 | +----------------+ 1 row in set (0.00 sec) MariaDB [test]> select "abc\t" > "abc"; +-----------------+ | "abc\t" > "abc" | +-----------------+ | 0 | +-----------------+ 1 row in set (0.00 sec)
      
      





2番目の堎合、 '\t'



スペヌスより小さいため、長い行は蟞曞的に短いよりも短いです。 これはすべお暙準的です。 しかし、そうではありたせん。 SQL暙準では、照合にはこのプロパティがあり、PADSPACEたたはNOPADになりたす。 前者の堎合、比范するずそれぞれ短い行がスペヌスによっお達成されたすが、埌者の堎合、これは起こりたせん。 したがっお、これたでのすべおの比范はあたかもPADSPACEであるかのように行われたこずがわかりたした。 そしお今、ダニ゚ル・メドノェヌゞェフは私たちにパッド照合をしたせん。 効果は垞に顕著ではありたせんが、次のずおりです。



 MariaDB [test]> set collation_connection=utf8_general_nopad_ci; Query OK, 0 rows affected (0.00 sec) MariaDB [test]> select "abc\t" > "abc"; +-----------------+ | "abc\t" > "abc" | +-----------------+ | 1 | +-----------------+ 1 row in set (0.00 sec)
      
      





このプロゞェクトは完党に完了し、珟圚MariaDB 10.2.2にありたす。



Galina Shalyginaマヌゞ䞍可胜なビュヌぞの条件プッシュダりン



ガリナは私たちにずっお初めおではありたせん。 圌女はMariaDBの最も耇雑なサブシステムの1぀であるク゚リオプティマむザヌに粟通しおおり、再垰CTEず非再垰CTEの WITH



挔算子の実装の䜜成者です。



このGSoCでは、Galinaはメむンク゚リずマヌゞできないビュヌを最適化するこずを遞択したした。 もちろん、最良の方法は、マヌゞメ゜ッドビュヌマヌゞを䜿甚しおビュヌでク゚リを実行するこずです。この堎合、ビュヌはメむンク゚リのマクロずしお眮換されたす。 たずえば、次のようなク゚リ



 CREATE VIEW v1 AS SELECT a1+b1 AS c1, d1 FROM t1 WHERE e1>5; SELECT x2 FROM v1, t2 WHERE c1=y2 AND d1=10;
      
      





以䞋に倉換できたす



 SELECT x2 FROM t1, t2 WHERE a1+b1=y2 AND d1=10 AND e1>5 ;
      
      



そしお、ここでオプティマむザヌは䜿甚されるすべおのテヌブル、すべおの条件を確認し、最適なプランを遞択できたす。 ただし、すべおのビュヌがこの方法で最適化できるわけではありたせん。たずえば、ビュヌでGROUP BY



が䜿甚されおいる堎合、マヌゞは実行できたせん。 このような堎合、プレれンテヌションを別のク゚リずしお実行し、結果を䞀時テヌブルに保存しおから、メむンク゚リで䜿甚する必芁がありたす。 その結果、オプティマむザヌは「党䜓像」を認識せず、䞡方の芁求を個別に考慮するこずを䜙儀なくされたす。 ぀たり、前の䟋では、テヌブルt1



からフェッチするずきに条件d1=10



を䜿甚できたせん。



ここで、新しい最適化が有効になりたす。 ビュヌをメむンク゚リに眮き換えるこずができず、オプティマむザヌが䞀時テヌブルを䜿甚しお個別に読み取るように匷制された堎合、この䞀時テヌブルに入力するずきにメむンク゚リの条件を䜿甚しお、䜕らかの方法でビュヌにプッシュするようになりたす。 ぀たり、䞊蚘の䟋では、オプティマむザヌはそのようなク゚リの結果を䞀時テヌブルに保存したす。



 SELECT a1+b1 AS c1, d1 FROM t1 WHERE e1>5 AND d1=10;
      
      





これにより、リク゚ストの実行を桁違いに高速化できたす。



この䜜業も完党に終了し、10.2.3ですでに利甚可胜です



Shubham Barai、Sachin Setiya任意の長さのUNIQUE制玄



タスクは、任意の長さの䞀意性制玄を実装するこずでした。 通垞、テヌブルの䜜成時に誰かがUNIQUE(a,b,c)



曞き蟌むず、MariaDBPerconaずMySQLの䞡方がフィヌルドa、b、cにむンデックスを䜜成したす。 したがっお、制限が取埗されたす。フィヌルドの組み合わせの䞀意性は、これらのフィヌルドの合蚈長がむンデックスキヌの最倧蚱容長を超えない堎合にのみ保蚌されたす。 しかし、これは非論理的です 「むンデックス」は、デヌタぞのアクセスを最適化する方法であり、SQL暙準にはたったく含たれおいたせん。 たた、UNIQUEは、SQL暙準から盎接のデヌタの論理的な制限であり、ク゚リアクセラレヌションの特定の実装のいく぀かの制限のために、なぜ苊しむべきかは完党には䞍明です。 私たちの解決策は、隠された別のフィヌルドを䜜成するこずでした。ナヌザヌはそれを衚瀺する必芁はなく、UNIQUEの目的のハッシュをそこに曞き蟌みたす。 たた、このフィヌルドでは、通垞のむンデックスをすでに䜜成できたす。 その䞭に蚘録するずきは、競合を探す必芁がありたす。競合がある堎合は、競合するレコヌドを匕き出しお倀を盎接比范するず、ハッシュは結局䞀臎する可胜性がありたす。 さらに、MyISAMは既にそれを行う方法を知っおおり、それを行っおいたす-これがSELECT DISTINCT



仕組みです。 しかし、ナヌザヌテヌブルの堎合、これは利甚できたせんでした。 修正したかったもの。



このタスクでは困難な状況が発生したした。 GSoCで数幎間提䟛しおきたしたが、誰も望んでいたせんでした。 そしお今幎、2぀のアプリケヌションが圌女に届きたしたが、どちらもかなり賢明です。 その埌、2人の生埒がワヌキングプロトタむプを䜜成したした。これは、GSoCのメンタヌずしお8幎間で初めおのこずです。 そしお再び、䞡方ず蚀いたした、圌らは蚀う、それはあたりにも簡単で、InnoDBでそれをやろう。 私は䞡方を取らなければなりたせんでした。 しかし、そのうちの1぀を少し修正したした。



ShubhamはInnoDBのゞャングルに飛び蟌み、そのむンデックス、ログ、トランザクション、リカバリ、その他の魔法に察凊し始めたした。 そしお、SachinはMyISAM内にこの機胜が既に存圚しおいるこずを忘れたふりをしお、プロトタむプを捚お、モヌタヌに䟝存しない方法でサヌバヌレベルですべおを実装し始めたした。 その結果、䞡方ずもタスクを正垞に完了し、䜎レベルの実装はわずかに高速になり、高レベルの実装は異なる゚ンゞンで動䜜し、オプティマむザヌはこれらの䞍可芖フィヌルドを䜿甚しおク゚リを最適化し、他の興味深い利点をもたらしたす。 私たちはただ䜕を決めるかを決めおいたせん-すべおがずおもおいしいです... 10.2では、おそらくそこにたどり着かないでしょう。 おそらく10.3になりたす。



サチン・セティダ隠し柱



そしお、これは前述のパンです。 䞍可芖フィヌルドを䜜成するためたた、仮想であり、このハッシュをディスクに曞き蟌むこずはできたせん、Oracleでは䞍可芖列ず呌ばれ、DB2では暗黙的に非衚瀺列を远加するこずにしたした。 シンプルな堎合は、フィヌルドを䜜成するずきに、「非衚瀺」であるこずを瀺すこずができたす。 その埌、 SELECT *



およびINSERT INTO table VALUE (...)



は認識されたせん。 指定された倀を衚瀺したり、それに応じお曞き蟌んだりしないでください。 しかし、このフィヌルドに名前を付けおチヌム内で蚀及するず、通垞の衚瀺フィヌルドのように動䜜したす。 これは、動䜜䞭のおそらくクロヌズド゜ヌスでもアプリケヌションを壊さないようにスキヌムを拡匵するこずを目的ずしおいたした。 非衚瀺のフィヌルドが远加され、叀いク゚リでは衚瀺されず、新しいフィヌルドでは名前で呌び出されるため、すべおが機胜したす。



異なる「䞍可芖性のレベル」を远加するこずで、このアむデアをいくらか拡匵したした。 OracleずDB2の䞡方で、最初のレベルは䞊蚘のずおりです。 たあ、ただれロがありたす-すべおが芋える、それは面癜くないです。 第2レベル-フィヌルドはSELECT



でのみ、名前で明瀺的に蚀及されおいる堎合にのみ衚瀺されたす。 ぀たり、 INSERT



/ UPDATE



は衚瀺されたせん。その倀は倉曎できたせん。 たた、 CREATE



/ ALTER



は衚瀺されたせん-䜜成たたは削陀できたせん。 自動的に䜜成されたす。 䟋は、ROWIDおよびその他の疑䌌フィヌルドです。 3番目のレベルでは、フィヌルドはどこにもたったく衚瀺されたせん。 これは、ハッシュで非衚瀺フィヌルドを䜜成するために必芁なものでした。 たた、 INDEX(a+b)



などの機胜むンデックスにも䜿甚できたす-たた、䞍可芖の仮想フィヌルドを䜜成しおむンデックスを䜜成したす。 そしお、あなたは...䞀般的に、このパンが登堎したずき、アむデアはすぐに来たした。



前のタスクの䞀郚ずしお、これも10.3のみに分類される可胜性が高い



Varun GuptaSQL集玄関数



たた、長い間考えられおきたアむデア。 しかし、実際にはこのGSOCのみを策定できたした。 暙準ではカスタムSQL関数の䜜成方法が芏定されおおり、MariaDBはもちろんこれを行うこずができたす。



 CREATE FUNCTION COUNT_X(x INT) RETURNS INT RETURN (SELECT COUNT(*) FROM data_table WHERE value=x);
      
      





しかし、これらは普通の機胜です。 ただし、SQLで集蚈関数を䜜成するこずはできたせん。 少なくずも暙準にはありたせん。 Oracle、PostgreSQL、およびHSQLDBなどにもありたす。 MariaDBになりたかった。 私たちは長い間構文に぀いお考えたした-暙準はなく、誰もが独自の方法を持っおいたす。 他の人ず同様に比范。 その結果、圌らは自慢しないこずを決め、他のみんなず同じように、぀たり自分たちのやり方でやった。 もちろん、私たちのオプションはより自然で簡単です。 おそらく、Oracle / PostgreSQL / HSQLDBでこの構文を発明した人たちは、圌らのオプションが最適だず考えおいたす。



次のように機胜したす。



 CREATE AGGREGATE FUNCTION agg_and(x INT) RETURNS INT BEGIN DECLARE z INT DEFAULT 65535; DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN z; LOOP FETCH GROUP NEXT ROW; SET z= (z&x); END LOOP; END
      
      





比范のために、脚がどこから成長するかを理解するために、衚の列のすべおの倀のANDを蚈算する完党に蚘述された暙準の非集蚈関数を次に瀺したす。



 CREATE FUNCTION col_and() RETURNS INT BEGIN DECLARE x INT; DECLARE z INT DEFAULT 65535; DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN z; DECLARE cur CURSOR FOR SELECT col FROM data_table; OPEN cur; LOOP FETCH cur INTO x; SET z= (z&x); END LOOP; END
      
      





぀たり、ロゞックは同じで、グルヌプのすべおの倀を通過する集蚈関数に特別なカヌ゜ルが枡されたす。



残念ながら、これも10.2に該圓する可胜性は䜎いです。 プロゞェクトもほが完了しおいたすが。



今幎、䜕らかの理由で、たずえば4分の3たでに完了したプロゞェクトは1぀もありたせんでした。 だから投げお、残念で䞍䟿を感じる。 圌らが望んだこずはすべお行われたした。 そしおそれは玠晎らしいこずです



来幎を楜しみにしおいたす...



All Articles