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進化
111000110101101...
座標を求めてみよう
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: timin...
●キャッシュ化
●スポット情報が頻繁に変わらない
●検索は6文字のgeohash 結果
関東と関西をキャッシュ
キー総数は65536
カバー率は38%
6文字のgeohashをキーにして
Memcachedに積んじゃえ!!
mysql
●6文字のgeohashによる前方一致で絞込み
●最小で1つ、最大で4つのキーで検索
●geohash周りの計算はGeo::Hash::XSで高速化
●検索半径250mでキーの平均値は2.66個
(250mの根拠は検証時のGPSのズレの最大値)...
浅草 雷門
位置情報を楽しもう!
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

YAPC::Asia

3,343 views
3,233 views

Published on

Published in: Sports, Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,343
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
11
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

YAPC::Asia

  1. 1. mixiチェックインの裏側 YAPC::Asia Tokyo 2010 株式会社ミクシィ 原田 星児
  2. 2. ●自己紹介 ●mixiチェックインについて ●スポットの絞込み方法 ●高速化 ●まとめ アジェンダ
  3. 3. ●原田 星児 ●株式会社ミクシィ サービス本部 コアサービス部 開発グループ コミュニケーション開発チーム 所属 ●最近のお仕事 フォトリニューアル(モバイル) フォトボイス連携(モバイル) mixiチェックイン(モバイル) 自己紹介 8年前 こんなのも作ってました
  4. 4. mixiチェックインについて 「mixiチェックイン」は、携帯電話のGPS機能を利用して、 今いる場所やお店(スポット)を簡単に友人・知人に共有できる 『mixi』の新しいコミュニケーション機能です。(弊社プレスリリースより)
  5. 5. geohashの前方一致 スポットの絞込み方法
  6. 6. 緯度経度の範囲を文字列で表す仕組み 例)緯度:+ 35.7298508752137 経度:+ 139.716479647905 → xn77726mmy ココ geohashとは
  7. 7. geohashから座標を求めよう
  8. 8. 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 座標を求めてみよう
  9. 9. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  10. 10. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  11. 11. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  12. 12. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  13. 13. 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y 座標を求めてみよう
  14. 14. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  15. 15. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  16. 16. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  17. 17. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  18. 18. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y
  19. 19. 座標を求めてみよう 11101|10100|00111|00111|00111|00010|00110|10011|10011|11110 x n 7 7 7 2 6 m m y 特定しました!
  20. 20. ● geohashが短いと範囲が広がる 青枠の中の座標は 全て XN7772 から始まる XN7772 の前方一致で 範囲内の検索ができる スポットの絞込み方法
  21. 21. 落とし穴がある
  22. 22. この辺りも含めたい!! GPSの計測結果 ●矩形の隅っこの場合 スポットの絞込み方法
  23. 23. 範囲を広げるには? geohashの文字数を削る なぜ? スポットの絞込み方法
  24. 24. xn7772 → xn777 落とし穴 含めたいのはココ
  25. 25. 含むまで削ると・・・ 広がりすぎ 落とし穴
  26. 26. どうすればいい?
  27. 27. とりあえず周囲のマス取ってみた 考えてみた
  28. 28. いい感じ
  29. 29. でも・・・ ・・・明らかに遠いので削る 考えてみた
  30. 30. とてもいい感じ
  31. 31. ●geohash ●mysql ●計算処理を早くできないか? ●無駄なクエリを減らす事はできないか? 高速化について
  32. 32. ●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/)
  33. 33. ●キャッシュ化 ●スポット情報が頻繁に変わらない ●検索は6文字のgeohash 結果 関東と関西をキャッシュ キー総数は65536 カバー率は38% 6文字のgeohashをキーにして Memcachedに積んじゃえ!! mysql
  34. 34. ●6文字のgeohashによる前方一致で絞込み ●最小で1つ、最大で4つのキーで検索 ●geohash周りの計算はGeo::Hash::XSで高速化 ●検索半径250mでキーの平均値は2.66個 (250mの根拠は検証時のGPSのズレの最大値) まとめ ●GPSの精度が上がれば7文字もアリ ●無駄なクエリを減らすためにキャッシュ化
  35. 35. 浅草 雷門 位置情報を楽しもう!
  36. 36. ご清聴ありがとうございました

×