5. 4/27(土)"
UT Startup Gym !
リリース会
2013/02/23 5 UT Startup Gym
6. 今回使うデータ
• データベース: MySQL
– RDBMS: Relational Database Management System
• SQL という言語でデータの出し入れをするシステム
– 世界で最も普及しているオープンソースデータベース
• データの中身: 架空の SNS
– ユーザー 約 50 万件
– 会社情報 約 15 万件
– 友人情報 約 1,000 万件
MySQL – Wikipedia http://ja.wikipedia.org/wiki/MySQL
2013/02/23 6 UT Startup Gym
7. テーブル設計
user friend
id VARCHAR(128) user_id VARCHAR(128)
name VARCHAR(256) friend_id VARCHAR(128)
gender_id INT UNSIGNED" nakayoshi INT
lang VARCHAR(10)" PRIMARY KEY (user_id, friend_id)"
created_at DATETIME" UNIQUE KEY (friend_id, user_id)"
..."
PRIMARY KEY (id)"
company
id BIGINT(20) UNSIGNED
name VARCHAR(256)
PRIMARY KEY (id)"
2013/02/23 7 UT Startup Gym
8. データベースを叩いてみよう
• 普通の SELECT 文"
– SELECT * FROM user LIMIT 10;"
– SELECT * FROM user;"
• 条件指定"
– SELECT * FROM user WHERE id = '109092915251428393573';"
– SELECT * FROM user WHERE name = ‘飯塚修平';"
– SELECT id, name FROM user WHERE created_at >
DATE_SUB(NOW(), INTERVAL 10 MINUTE);"
• 同姓同名ランキング"
– SELECT user.name, COUNT(id) FROM user GROUP BY user.name
ORDER BY COUNT(id) DESC LIMIT 10;"
2013/02/23 8 UT Startup Gym
9. データベースを叩いてみよう
• 従業員数ランキング"
– SELECT company.id, company.name, COUNT(user_employment.id) FROM
user_employment LEFT JOIN company ON user_employment.company_id =
company.id GROUP BY company.id ORDER BY COUNT(user_employment.id)
DESC LIMIT 10;"
• Google の従業員一覧"
– SELECT user.id, user.name FROM user LEFT JOIN user_employment ON
user.id = user_employment.user_id LEFT JOIN company ON
user_employment.company_id = company.id WHERE company.name =
'Google';"
• 共通の友達"
– SELECT * FROM friend AS f1 LEFT JOIN friend AS f2 ON f1.friend_id =
f2.user_id WHERE f1.user_id = '109092915251428393573' AND f2.friend_id =
'113100517422007103669’"
2013/02/23 9 UT Startup Gym
10. SQL ムズい・・・
そもそもなんでデータベースを
使うの?
2013/02/23 10 UT Startup Gym
13. インデックス
普通に探索すると
SELECT name FROM user WHERE id = 1468;
id = 1468"
のやつが見つ id name
かるまで探す 1 Shuhei
Iitsuka
ぜ!
2 Kazuya
Kawakami
... ...
1468 Taro
Tanaka
... ... 探索時間"
O(n)."
おそいね
2013/02/23 13 UT Startup Gym
14. インデックス
バイナリツリーのインデックスが張られていると
SELECT name FROM user WHERE id = 1468;
2分木探索で" 1000
探すぜ!
500 1500
250 750 1250 1750
... 探索時間
O(log(n))."
はやいね
2013/02/23 14 UT Startup Gym
15. データベースつかうといいこと
は分かったけど、
うちのサービスではどうすれ
ばいいの?
2013/02/23 15 UT Startup Gym
23. 実際に使うときは
• LEFT JOIN でくっつけていく"
• もっとも使われている技名ランキング"
– SELECT ba.attack_id, SUM(ba.num) FROM battle_attack ba
GROUP BY ba.attack_id;"
– やっぱり技名も欲しい・・・→ LEFT JOIN attack"
– SELECT a.attack_name, SUM(ba.num) FROM battle_attack ba
LEFT JOIN attack a ON ba.attack_id = a.attack_id GROUP BY
ba.attack_id;"
2013/02/23 23 UT Startup Gym
24. さきほどの例なら
• Google の従業員一覧"
• まず Google が ID = なんちゃらだとして"
– SELECT user_id
FROM user_employment
WHERE company_id = なんちゃら;"
• 社名で指定したいので LEFT JOIN company"
– SELECT user_id
FROM user_employment ue
LEFT JOIN company c ON ue.company_id = c.id
WHERE c.name = 'Google';"
• さらに従業員の名前を出したいので LEFT JOIN user"
– SELECT u.id, u.name
FROM user_employment ue
LEFT JOIN company c ON ue.company_id = c.id
LEFT JOIN user u ON ue.user_id = u.id
WHERE c.name = 'Google';"
2013/02/23 24 UT Startup Gym