Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ストレージエンジンであそんでみた

chobie
October 25, 2013
18k

 ストレージエンジンであそんでみた

こうなるはずだったんですがlightningのVGA変換アダプタとmini display portの変換アダプタを間違えて持って行ってしまいましたorz

次回から忘れないように全部まとめてキーホルダーに付けようと思います(´・ω...:.;::..

chobie

October 25, 2013
Tweet

Transcript

  1. 既存のソリューション •  GREE  Engineer’s  Blog  リアルタイム・ランキングを考える   •  h1p://labs.gree.jp/blog/2010/07/456/  

      •  ピグにおけるリアルタイムランキングの導入   •  h1p://www.cyberagent.co.jp/technology/pdf/2011_10.pdf  
  2. Chapter  10:  Building  Your  Own  Storage  Engine     写経で半日もあればMySQL

     Rawフォーマットベース   &単一Indexのストレージエンジンが書ける   (一箇所先にIndex  Includeしてるtypoあるけど)  
  3. Chapter  10.  TOCAB  Storage  Engine  -­‐  Implemen?ng   Indexes  

      Tokyo  Cabinetベースのストレージエンジンが書ける   (但し全部ソース載ってないから写経には向かない    全般的なPlugin開発のネタがあり、いい感じ)    
  4. CREATE  TABLE  t1(        user_̲id  int  unsigned,  

         score  int  unsigned,        rank    int  unsigned,        PRIMARY  KEY(user_̲id),        KEY(score,  rank) )  Engine  =  ChobieDB;
  5. CREATE  TABLE  t1(        user_̲id  int  unsigned,  

         score  int  unsigned,        rank    int  unsigned,        PRIMARY  KEY(user_̲id),        KEY(score,  rank) )  Engine  =  ChobieDB; Storage  Engine側でrankの値の更新を制限し、   SELECT時に動的にscoreからrankの値を   算出してMySQLに返す
  6. IndexはIn  Memory  B+Tree 4 2 6 1 3 5 7

    1 2 3 4 5 6 7 書いたことが無かったから書いてみたかっただけ (今のところDelete部分の実装中[未push])
  7. mysql>  install  plugin  chobiedb  SONAME  'ha_̲chobie.so'; Query  OK,  0  rows

     affected  (0.07  sec) mysql>  CREATE  TABLE  ranking(    id  int  unsigned,    score  int  unsigned,    rank  int  unsigned )  Engine  =  ChobieDB; Query  OK,  0  rows  affected  (0.09  sec) mysql>  insert  into  ranking(id,  score)  values(1,  100),  (2,  30),  (3,  45),  (4,   50),  (5,  80),  (6,  90); Query  OK,  6  rows  affected  (0.00  sec) Records:  6    Duplicates:  0    Warnings:  0 mysql>  select  *  from  ranking; +-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+ |  id      |  score  |  rank  | +-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+ |        2  |        30  |        1  | |        3  |        45  |        2  | ~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼ +-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+ 6  rows  in  set  (0.00  sec)
  8. このストレージエンジンの特徴 •  挿⼊入がO(log(N))で⾏行行える •  操作(ランキングの取得)も基本的にO(log(n))+O(M)で⾏行行える •  partitionを気にせずに済むのでアプリの実装コストが低い •  In  Memoryなので当然落落ちたら終わる

    •  構造変えてファイルベースにしてもいいと思うけど •  別エンジンのStandbyを検討等運⽤用時に⾊色々ありそう •  だけれど、実⽤用化レベルまで⾏行行ったら、、、 メリット/デメリットは置いておいて なんか⾯面⽩白そうなにおい
  9. 書くことで得られた物 •  MySQL  Casualにうっかり⾜足を運び⼊入れてしまった勇気 •  SQL問い合わせからのストレージへのアプローチ⽅方法 •  インデックスの種類、実装、Optimizerから利利⽤用され具合 •  MySQLのアーキテクチャを知る近道かもしれない

    •  取り敢えずSpartan  Engine書かせれば誰でも分かる \  さいごのガラスをぶち破れ~    /  *      \ 見慣れた景色をけりだして~ /*   *  ( \/  /_∧   <./|   /| +     /\___      + ..ヽ/  /Д`/⌒ヽ  /  .| / /     /    //   。     /  /\/ ,ヘ  i   ̄ >  \_/ * /____//         し'  \_/    i  />      ̄ ̄ ̄ ̄    +     i⌒ヽ  ./   ̄>__  + 。    ..||  |::        /⌒ヽ i  i  \(    .|/  / /\  + .||  |::    *  ..i    | /ヽ   ヽ  *∠__/   ̄ +  *..||  |::        ヽ ヽ| |、 \_ノ  >   <>  *    ||  |::     。    \|  )  ̄  ./V   *     。   .||  |::   ____  .ノ ./⌒)∧ /  ..+_________||___     。  / し'.ヽ ( .∨    /\________|__|       //    し'  / /\ + ̄:::::::::::::::::::::::::::::::::::::::::::::::::
  10. References アルゴリズムイントロダクション第3版 第二巻   高度な設計と解析手法・高度なデータ構造・グラフアルゴリズム     Expert  MySQL  2nd  Ediion

        MySQL  5.1  Plugin  Development     MySQL  Internals  ManuaL  -­‐  Chapter  23.  Wriing  a  Custom  Storage  Engine  -­‐   h1p://dev.mysql.com/doc/internals/en/custom-­‐engine.html     Delphi  アルゴリズムトレーニング  -­‐第6回 B木から要素を削除する方法を学ぼう  -­‐   h1p://www.atmarkit.co.jp/fcoding/aricles/delphi/06/delphi06a.html