SlideShare a Scribd company logo
mixiチェックインの裏側
YAPC::Asia Tokyo 2010
株式会社ミクシィ
原田 星児
●自己紹介
●mixiチェックインについて
●スポットの絞込み方法
●高速化
●まとめ
アジェンダ
●原田 星児
●株式会社ミクシィ
サービス本部 コアサービス部 開発グループ
コミュニケーション開発チーム 所属
●最近のお仕事
フォトリニューアル(モバイル)
フォトボイス連携(モバイル)
mixiチェックイン(モバイル)
自己紹介
8年前
こんなのも作ってました
mixiチェックインについて
「mixiチェックイン」は、携帯電話のGPS機能を利用して、
今いる場所やお店(スポット)を簡単に友人・知人に共有できる
『mixi』の新しいコミュニケーション機能です。(弊社プレスリリースより)
geohashの前方一致
スポットの絞込み方法
緯度経度の範囲を文字列で表す仕組み
例)緯度:+ 35.7298508752137
経度:+ 139.716479647905
→ xn77726mmy
ココ
geohashとは
geohashから座標を求めよう
xn77726mmy
29|20|7|7|7|2|6|19|19|30
BASE32
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
2進化
1110001101011010100110111 → 経度
1011001011010000110101110 → 緯度
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
座標を求めてみよう
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
座標を求めてみよう
11101|10100|00111|00111|00111|00010|00110|10011|10011|11110
x n 7 7 7 2 6 m m y
特定しました!
● geohashが短いと範囲が広がる
青枠の中の座標は
全て XN7772 から始まる
XN7772 の前方一致で
範囲内の検索ができる
スポットの絞込み方法
落とし穴がある
この辺りも含めたい!!
GPSの計測結果
●矩形の隅っこの場合
スポットの絞込み方法
範囲を広げるには?
geohashの文字数を削る
なぜ?
スポットの絞込み方法
xn7772 → xn777
落とし穴
含めたいのはココ
含むまで削ると・・・
広がりすぎ
落とし穴
どうすればいい?
とりあえず周囲のマス取ってみた
考えてみた
いい感じ
でも・・・
・・・明らかに遠いので削る
考えてみた
とてもいい感じ
●geohash
●mysql
●計算処理を早くできないか?
●無駄なクエリを減らす事はできないか?
高速化について
●Geo::Hash (http://search.cpan.org/dist/Geo-Hash/)
●ベンチマーク
●隣接するgeohashを求めるadjacentメソッドがある
geohash
Encode
Benchmark: timing 500000 iterations of Geo::Hash encode, Geo::Hash::XS encode...
Geo::Hash encode: 137 wallclock secs (136.95 usr + 0.00 sys = 136.95 CPU) @ 3650.97/s (n=500000)
Geo::Hash::XS encode: -1 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 757575.76/s (n=500000)
Rate Geo::Hash encode Geo::Hash::XS encode
Geo::Hash encode 3651/s -- -100%
Geo::Hash::XS encode 757576/s 20650% --
Decode
Benchmark: timing 1000000 iterations of Geo::Hash decode, Geo::Hash::XS decode...
Geo::Hash decode: 112 wallclock secs (111.68 usr + 0.03 sys = 111.71 CPU) @ 8951.75/s (n=1000000)
Geo::Hash::XS decode: 2 wallclock secs ( 0.79 usr + 0.00 sys = 0.79 CPU) @ 1265822.78/s (n=1000000)
Rate Geo::Hash decode Geo::Hash::XS decode
Geo::Hash decode 8952/s -- -99%
Geo::Hash::XS decode 1265823/s 14041% --
●Geo::Hash::XS (http://search.cpan.org/dist/Geo-Hash-XS/)
●キャッシュ化
●スポット情報が頻繁に変わらない
●検索は6文字のgeohash 結果
関東と関西をキャッシュ
キー総数は65536
カバー率は38%
6文字のgeohashをキーにして
Memcachedに積んじゃえ!!
mysql
●6文字のgeohashによる前方一致で絞込み
●最小で1つ、最大で4つのキーで検索
●geohash周りの計算はGeo::Hash::XSで高速化
●検索半径250mでキーの平均値は2.66個
(250mの根拠は検証時のGPSのズレの最大値)
まとめ
●GPSの精度が上がれば7文字もアリ
●無駄なクエリを減らすためにキャッシュ化
浅草 雷門
位置情報を楽しもう!
ご清聴ありがとうございました

More Related Content

YAPC::Asia