こうなるはずだったんですがlightningのVGA変換アダプタとmini display portの変換アダプタを間違えて持って行ってしまいましたorz
次回から忘れないように全部まとめてキーホルダーに付けようと思います(´・ω...:.;::..
ストレージエンジンで遊んでみたMySQL Casual Talks vol.5chobi_̲e
View Slide
⾃自⼰己紹介chobi_̲e(ちょびえ)PHP / PECL Maintainer仕事ではスマホ系アプリの⾯面倒⾒見見たりしています。どちらかというとアプリ側なので浅いですが
2013 年年 10⽉月 1⽇日
世の中が⼤大変な時こそエンジニアは⾯面⽩白い物を作るべきだ
MySQLを使ったリアルタイムランキング
既存のソリューション• GREE Engineer’s Blog リアルタイム・ランキングを考える • h1p://labs.gree.jp/blog/2010/07/456/ • ピグにおけるリアルタイムランキングの導入 • h1p://www.cyberagent.co.jp/technology/pdf/2011_10.pdf
やれば運⽤用出来る特定のシーンにおいてMySQLのリアルタイム・ランキングは
もっと楽できないか?でも、
ストレージエンジンを作れば確かに楽ができる!!
MySQL初⼼心者がストレージエンジンを書くにはどうすればいいか?
http://dev.mysql.com/doc/internals/en/custom-‐‑‒engine.html
Chapter 10: Building Your Own Storage Engine 写経で半日もあればMySQL Rawフォーマットベース &単一Indexのストレージエンジンが書ける (一箇所先にIndex Includeしてるtypoあるけど)
Chapter 10. TOCAB Storage Engine -‐ Implemen?ng Indexes Tokyo Cabinetベースのストレージエンジンが書ける (但し全部ソース載ってないから写経には向かない 全般的なPlugin開発のネタがあり、いい感じ)
MySQLの実装箇所はわかった。取り敢えずRedisのSortedSetの実装持ってこよう※RedisはMIT LicenseでExample Storage Engineの派生で使う場合 GPLと互換があるのでトータルで問題なさそうに見受けられる
RedisSortedSetのおさらい※ZipListの話は置いといて
なぜRedisのrankingが速いか双⽅方向SkipListで隔たりの数を保持している為特定キーを探索索すればその過程で順位が分かる(実際のLevelは⼀一定の確率率率で選ばれるからこういう図じゃないけど)
抜群の安定感
特定操作の最適化
光と闇が両⽅方そなわり最強に⾒見見えるCopyright (C) 2002-‐2008 SQUARE ENIX CO., LTD. All Rights Reserved. 光と闇が両⽅方そなわり最強に⾒見見える
そんなわけで
h1ps://github.com/chobie/ChobieDB 名前はまだ仮
CREATE TABLE t1( user_̲id int unsigned, score int unsigned, rank int unsigned, PRIMARY KEY(user_̲id), KEY(score, rank)) Engine = ChobieDB;
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に返す
IndexはIn Memory B+Tree4 2 6 1 3 5 7 1 2 3 4 5 6 7書いたことが無かったから書いてみたかっただけ(今のところDelete部分の実装中[未push])
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: 0mysql> select * from ranking;+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+| id | score | rank |+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+| 2 | 30 | 1 || 3 | 45 | 2 |~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼~∼+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒-‐‑‒+6 rows in set (0.00 sec)
このストレージエンジンの特徴• 挿⼊入がO(log(N))で⾏行行える• 操作(ランキングの取得)も基本的にO(log(n))+O(M)で⾏行行える• partitionを気にせずに済むのでアプリの実装コストが低い• In Memoryなので当然落落ちたら終わる• 構造変えてファイルベースにしてもいいと思うけど• 別エンジンのStandbyを検討等運⽤用時に⾊色々ありそう• だけれど、実⽤用化レベルまで⾏行行ったら、、、メリット/デメリットは置いておいてなんか⾯面⽩白そうなにおい
書くことで得られた物• MySQL Casualにうっかり⾜足を運び⼊入れてしまった勇気• SQL問い合わせからのストレージへのアプローチ⽅方法• インデックスの種類、実装、Optimizerから利利⽤用され具合• MySQLのアーキテクチャを知る近道かもしれない• 取り敢えずSpartan Engine書かせれば誰でも分かる\ さいごのガラスをぶち破れ~ / * \ 見慣れた景色をけりだして~ /* * ( \/ /_∧ <./| /| + /\___ + ..ヽ/ /Д`/⌒ヽ / .| / / / // 。 / /\/ ,ヘ i  ̄ > \_/ * /____// し' \_/ i />  ̄ ̄ ̄ ̄ + i⌒ヽ ./  ̄>__ + 。 ..|| |:: /⌒ヽ i i \( .|/ / /\ + .|| |:: * ..i | /ヽ ヽ *∠__/  ̄ + *..|| |:: ヽ ヽ| |、 \_ノ > 。 \| )  ̄ ./V * 。 .|| |:: ____ .ノ ./⌒)∧ / ..+_________||___ 。 / し'.ヽ ( .∨ /\________|__| // し' / /\ + ̄:::::::::::::::::::::::::::::::::::::::::::::::::
まとめ• Storage Engine書くのはカジュアルなので是⾮非どうぞ!• やっぱエンジニアなので⼤大変な時こそ⾯面⽩白いの作りたい• ha_̲exampleぐらいゆるいライセンスになればいいのにmysql-‐ranking-‐engine超期待
Happy Hacking!
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