Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

2013  年年  10⽉月  1⽇日

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

抜群の安定感

Slide 23

Slide 23 text

特定操作の最適化

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

そんなわけで

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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)

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Happy  Hacking!

Slide 35

Slide 35 text

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