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. ストレージエンジンで遊んでみた
    MySQL Casual Talks vol.5
    chobi_̲e

    View Slide

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

    View Slide

  3. 2013  年年  10⽉月  1⽇日

    View Slide

  4. View Slide

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

    View Slide

  6. View Slide

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

    View Slide

  8. 既存のソリューション
    •  GREE  Engineer’s  Blog  リアルタイム・ランキングを考える  
    •  h1p://labs.gree.jp/blog/2010/07/456/  
     
    •  ピグにおけるリアルタイムランキングの導入  
    •  h1p://www.cyberagent.co.jp/technology/pdf/2011_10.pdf  

    View Slide

  9. やれば運⽤用出来る
    特定のシーンにおいてMySQLのリアルタイム・ランキングは

    View Slide

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

    View Slide

  11. View Slide

  12. View Slide

  13. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. Chapter  10:  Building  Your  Own  Storage  Engine  
     
    写経で半日もあればMySQL  Rawフォーマットベース  
    &単一Indexのストレージエンジンが書ける  
    (一箇所先にIndex  Includeしてるtypoあるけど)  

    View Slide

  18. Chapter  10.  TOCAB  Storage  Engine  -­‐  Implemen?ng  
    Indexes  
     
    Tokyo  Cabinetベースのストレージエンジンが書ける  
    (但し全部ソース載ってないから写経には向かない  
     全般的なPlugin開発のネタがあり、いい感じ)  
     

    View Slide

  19. MySQLの実装箇所はわかった。
    取り敢えずRedisの
    SortedSetの実装持ってこよう
    ※RedisはMIT  LicenseでExample  Storage  Engineの派生で使う場合  
       GPLと互換があるのでトータルで問題なさそうに見受けられる

    View Slide

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

    View Slide

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

    View Slide

  22. 抜群の安定感

    View Slide

  23. 特定操作の最適化

    View Slide

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

    View Slide

  25. そんなわけで

    View Slide

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

    View Slide

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

    View Slide

  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に返す

    View Slide

  29. IndexはIn  Memory  B+Tree
    4
    2 6
    1 3 5 7
    1 2 3 4 5 6 7
    書いたことが無かったから書いてみたかっただけ
    (今のところDelete部分の実装中[未push])

    View Slide

  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)

    View Slide

  31. このストレージエンジンの特徴
    •  挿⼊入がO(log(N))で⾏行行える
    •  操作(ランキングの取得)も基本的にO(log(n))+O(M)で⾏行行える
    •  partitionを気にせずに済むのでアプリの実装コストが低い
    •  In  Memoryなので当然落落ちたら終わる
    •  構造変えてファイルベースにしてもいいと思うけど
    •  別エンジンのStandbyを検討等運⽤用時に⾊色々ありそう
    •  だけれど、実⽤用化レベルまで⾏行行ったら、、、
    メリット/デメリットは置いておいて
    なんか⾯面⽩白そうなにおい

    View Slide

  32. 書くことで得られた物
    •  MySQL  Casualにうっかり⾜足を運び⼊入れてしまった勇気
    •  SQL問い合わせからのストレージへのアプローチ⽅方法
    •  インデックスの種類、実装、Optimizerから利利⽤用され具合
    •  MySQLのアーキテクチャを知る近道かもしれない
    •  取り敢えずSpartan  Engine書かせれば誰でも分かる
    \  さいごのガラスをぶち破れ~    /
     *      \ 見慣れた景色をけりだして~ /*
      *  ( \/  /_∧   <./|   /| +     /\___  
       + ..ヽ/  /Д`/⌒ヽ  /  .| / /     /    //  
    。     /  /\/ ,ヘ  i   ̄ >  \_/ * /____//  
          し'  \_/    i  />      ̄ ̄ ̄ ̄
       +     i⌒ヽ  ./   ̄>__  + 。    ..||  |::  
         /⌒ヽ i  i  \(    .|/  / /\  + .||  |::  
     *  ..i    | /ヽ   ヽ  *∠__/   ̄ +  *..||  |::  
         ヽ ヽ| |、 \_ノ  >     。    \|  )  ̄  ./V   *     。   .||  |::  
    ____  .ノ ./⌒)∧ /  ..+_________||___  
      。  / し'.ヽ ( .∨    /\________|__|  
        //    し'  / /\ + ̄:::::::::::::::::::::::::::::::::::::::::::::::::

    View Slide

  33. まとめ
    •  Storage  Engine書くのはカジュアルなので是⾮非どうぞ!
    •  やっぱエンジニアなので⼤大変な時こそ⾯面⽩白いの作りたい
    •  ha_̲exampleぐらいゆるいライセンスになればいいのに
    mysql-­‐ranking-­‐engine超期待

    View Slide

  34. Happy  Hacking!

    View Slide

  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  

    View Slide