Save 37% off PRO during our Black Friday Sale! »

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

3169fb51728b8dc9d56675d3fb1a6de6?s=47 chobie
October 25, 2013
18k

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

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

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

3169fb51728b8dc9d56675d3fb1a6de6?s=128

chobie

October 25, 2013
Tweet

Transcript

  1. ストレージエンジンで遊んでみた MySQL Casual Talks vol.5 chobi_̲e

  2. ⾃自⼰己紹介 chobi_̲e(ちょびえ) PHP  /  PECL  Maintainer 仕事ではスマホ系アプリの⾯面倒⾒見見たりしています。 どちらかというとアプリ側なので浅いですが

  3. 2013  年年  10⽉月  1⽇日

  4. None
  5. 世の中が⼤大変な時こそ エンジニアは ⾯面⽩白い物を作るべきだ

  6. None
  7. MySQLを使った リアルタイムランキング

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

      •  ピグにおけるリアルタイムランキングの導入   •  h1p://www.cyberagent.co.jp/technology/pdf/2011_10.pdf  
  9. やれば運⽤用出来る 特定のシーンにおいてMySQLのリアルタイム・ランキングは

  10. もっと楽できないか? でも、

  11. None
  12. None
  13. None
  14. ストレージエンジンを作れば 確かに楽ができる!!

  15. MySQL初⼼心者が ストレージエンジンを 書くにはどうすればいいか?

  16. http://dev.mysql.com/doc/internals/en/custom-‐‑‒engine.html

  17. Chapter  10:  Building  Your  Own  Storage  Engine     写経で半日もあればMySQL

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

      Tokyo  Cabinetベースのストレージエンジンが書ける   (但し全部ソース載ってないから写経には向かない    全般的なPlugin開発のネタがあり、いい感じ)    
  19. MySQLの実装箇所はわかった。 取り敢えずRedisの SortedSetの実装持ってこよう ※RedisはMIT  LicenseでExample  Storage  Engineの派生で使う場合      GPLと互換があるのでトータルで問題なさそうに見受けられる

  20. Redis SortedSetのおさらい ※ZipListの話は置いといて

  21. なぜRedisのrankingが速いか 双⽅方向SkipListで隔たりの数を保持している為 特定キーを探索索すればその過程で順位が分かる (実際のLevelは⼀一定の確率率率で選ばれるからこういう図じゃないけど)

  22. 抜群の安定感

  23. 特定操作の最適化

  24. 光と闇が両⽅方そなわり 最強に⾒見見える Copyright  (C)  2002-­‐2008  SQUARE  ENIX  CO.,  LTD.  All

     Rights  Reserved. 光と闇が両⽅方そなわり 最強に⾒見見える
  25. そんなわけで

  26. h1ps://github.com/chobie/ChobieDB 名前はまだ仮

  27. CREATE  TABLE  t1(        user_̲id  int  unsigned,  

         score  int  unsigned,        rank    int  unsigned,        PRIMARY  KEY(user_̲id),        KEY(score,  rank) )  Engine  =  ChobieDB;
  28. 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に返す
  29. IndexはIn  Memory  B+Tree 4 2 6 1 3 5 7

    1 2 3 4 5 6 7 書いたことが無かったから書いてみたかっただけ (今のところDelete部分の実装中[未push])
  30. 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)
  31. このストレージエンジンの特徴 •  挿⼊入がO(log(N))で⾏行行える •  操作(ランキングの取得)も基本的にO(log(n))+O(M)で⾏行行える •  partitionを気にせずに済むのでアプリの実装コストが低い •  In  Memoryなので当然落落ちたら終わる

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

    •  取り敢えずSpartan  Engine書かせれば誰でも分かる \  さいごのガラスをぶち破れ~    /  *      \ 見慣れた景色をけりだして~ /*   *  ( \/  /_∧   <./|   /| +     /\___      + ..ヽ/  /Д`/⌒ヽ  /  .| / /     /    //   。     /  /\/ ,ヘ  i   ̄ >  \_/ * /____//         し'  \_/    i  />      ̄ ̄ ̄ ̄    +     i⌒ヽ  ./   ̄>__  + 。    ..||  |::        /⌒ヽ i  i  \(    .|/  / /\  + .||  |::    *  ..i    | /ヽ   ヽ  *∠__/   ̄ +  *..||  |::        ヽ ヽ| |、 \_ノ  >   <>  *    ||  |::     。    \|  )  ̄  ./V   *     。   .||  |::   ____  .ノ ./⌒)∧ /  ..+_________||___     。  / し'.ヽ ( .∨    /\________|__|       //    し'  / /\ + ̄:::::::::::::::::::::::::::::::::::::::::::::::::
  33. まとめ •  Storage  Engine書くのはカジュアルなので是⾮非どうぞ! •  やっぱエンジニアなので⼤大変な時こそ⾯面⽩白いの作りたい •  ha_̲exampleぐらいゆるいライセンスになればいいのに mysql-­‐ranking-­‐engine超期待

  34. Happy  Hacking!

  35. 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