SlideShare a Scribd company logo
1 of 52
Download to read offline
SlowQueryとの戦い 
(ほとんどORM) 
2014/10/11 PHP Conference 2014 
株式会社サイバード ゲーム事業本部 
後藤 健
後藤 健 
• 新卒2年目 25歳 
• ゲームインフラチーム 
• インフラ、ミドルウェアまわり 
• PHPer(たまにPython) 
• 趣味 車・ライブ・スノーボード etc.. 
• Twitter : @gotyoooo
SlowQueryとの戦い
さっそくですが。
O/Rマッパー 
使ってる人! 
挙手!!!
ありがとうございます!
O/Rマッパー 
なんて使わねー 
俺は生SQLだ!! 
挙手!!!
ありがとうございます!
世の中的なO/Rマッパー 
利用率が分かったところで
http://blog-imgs-54-origin.fc2.com/j/i/k/jikomanzoku009/saa.jpg
SQLにはご注意を 
http://www.weblio.jp/img/dict/hyazi/112.gif
特にO/Rマッパー 
をご利用の皆様 
http://www.weblio.jp/img/dict/hyazi/112.gif
http://cyline-jp.com/download/SQL.png 
http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
じゃないと 
http://cyline-jp.com/download/SQL.png 
http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
SlowQueryとの戦い
恐ろしいこと 
になりますよ
では実例
その1
意味のないソート
SELECT 
* 
FROM 
t1 
WHERE 
~省略~ 
ORDER BY 
t1.updated DESC, 
t1.updated ASC 
LIMIT 
1
SELECT 
* 
FROM 
t1 
WHERE 
~省略~ 
ORDER BY 
t1.updated DESC, 
t1.updated ASC 
LIMIT 
1
http://www.rosei.jp/jinjour/wp-content/uploads/2011/12/fotolia_36435421_Subscription_L.jpg
Model_Collection::find( 
'first', 
array( 
‘order_by' => array( 
‘updated' => ‘DESC' 
) 
) 
);
Model_Collection::find( 
'first', 
array( 
いらん 
‘order_by' => array( 
‘updated' => ‘DESC' 
) 
) 
);
Model_Collection::find( 
'all', 
array( 
'order_by'=>array('updated'=>'DESC') 
) 
); 
Model_Collection::find( 
'first', 
array( 
'order_by'=>array('updated'=>'DESC') 
) 
);
Model_Collection::find( 
'all', 
array( 
'order_by'=>array('updated'=>'DESC') 
) 
); 
Model_Collection::find( 
'first', 
array( 
コピペコードの弊害 
'order_by'=>array('updated'=>'DESC') 
) 
);
Model_Collection::find( 
'all', 
array( 
'order_by'=>array('updated'=>'DESC') 
) 
); 
返ってきたデータ 
Model_しCollection::か意識find( 
'first', 
してない 
array( 
'order_by'=>array('updated'=>'DESC') 
) 
);
Model_Collection::find( 
'all', 
array( 
'order_by'=>array('updated'=>'DESC') 
) 
); 
Model_Collection::find( 
'first', 
array( 
生SQLなら防げた? 
'order_by'=>array('updated'=>'DESC') 
) 
);
その2
悪名高きn+1問題
user_profile user_point_log 
id name sex … 
1 goto 1 … 
2 ken 2 … 
3 gotyoooo 1 … 
… … … … 
10 kenken 1 … 
… … … … 
id user_id point … 
1 1 10 … 
2 2 200 … 
3 1 100 … 
… … … 
10 3 30 … 
… … …
$user = User_Profile::find(‘all', array( 
‘where’ => array('sex' => 1) 
)); 
$user_point = array(); 
foreach ($user as $value) { 
$user_point[] = User_Point_Log::find(‘first’, 
array( 
‘where’ => array(‘user_id' => $value[‘id’]) 
) 
); 
}
$user = User_Profile::find(‘all', array( 
‘where’ => array('sex' => 1) 
)); 
$user_point = array(); 
foreach ($user as $value) { 
$user_point[] = User_Point::find(‘first’, 
array( 
余裕かましてると… 
‘where’ => array('id' => $value[‘id’]) 
) 
); 
}
$user = User_Profile::‘where’ => array('sex' (1) 
find(‘all', array( 
=> 1) 
)); 
$user_point = array(); 
foreach ($user as $value) { 
$user_point[] = User_Point::find(‘first’, 
array( 
(2) 
‘where’ => array('id' => $value[‘id’]) 
) 
); 
}
(1) × 1 
(2) × n 
SELECT * FROM user_profile 
WHERE sex = 1 
SELECT * FROM user_point_log 
WHERE user_id = #id
(1) × 1 
(2) × n 
SELECT * FROM user_profile 
WHERE sex = 1 
無駄なクエリ一杯 
SELECT * FROM user_point_log 
WHERE user_id = #id
(1) × 1 
(2) × n 
SELECT * FROM user_profile 
WHERE sex = 1 
データ数に応じてnも増加 
SELECT * FROM user_point_log 
WHERE user_id = #id
SELECT 
* 
FROM 
user_profile 
INNER JOIN 
user_point 
ON 
user_profile.id = user_point_log.id 
WHERE 
user_profile.sex = 1
SELECT 
* 
FROM 
user_profile 
INNER JOIN 
user_point 
ON 
user_profile.id = user_point_log.id 
WHERE 
user_profile.sex = 1 
JOINしましょう
例 終わり 
すごい基本な例でごめんなさいorz
何が言いたいか 
http://www.canstockphoto.com.br/foto-imagens/eureka.html#file_view.php?id=13126638
http://cyline-jp.com/download/SQL.png 
http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
投げるクエリを意識すべき 
http://cyline-jp.com/download/SQL.png 
http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
意識できる環境を作ろう 
http://cyline-jp.com/download/SQL.png 
http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
テスト環境にも 
ある程度のデータ量 
http://ja.gofreedownload.net/free-icon/icons/misc-database-109423/#.VDc0idSsWcY
投げられたSQLを 
出力できるような仕組み 
http://www.tech-faq.com/wp-content/uploads/images/SQL-Injection-Attack.jpg
チーム別スロークエリー 
出力ランキングとか素敵 
http://www.slot-pioneer.co.jp/product/kingbary/pop/kingbary_08.jpg
弊社もまだまだ 
出来てませんorz 
http://ja.gofreedownload.net/free-icon/icons/misc-database-109423/#.VDc0idSsWcY 
http://www.tech-faq.com/wp-content/uploads/images/SQL-Injection-Attack.jpg 
http://www.slot-pioneer.co.jp/product/kingbary/pop/kingbary_08.jpg
SlowQueryとの戦い
こんなグラフ出す前に
糞クエリ 
撲滅しましょう
ありがとうございました。 
ここでドラ娘(?)が鳴らす(予定)

More Related Content

What's hot

PHP基本的関数QUIZ
PHP基本的関数QUIZPHP基本的関数QUIZ
PHP基本的関数QUIZWataru Terada
 
Perl logging
Perl loggingPerl logging
Perl loggingkeroyonn
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDphpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDAkio Ishida
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクトYuki Okamoto
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室40分濃縮 PHP classの教室
40分濃縮 PHP classの教室Yusuke Ando
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
PSR-1 と PSR-2 を 5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解するPSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を 5分でざっくり理解するWataru Terada
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門keroyonn
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門Hiroaki Murayama
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門y-uti
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクトアシアル株式会社
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話infinite_loop
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014Rui Hirokawa
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swiftYuki Asai
 

What's hot (20)

PHP基本的関数QUIZ
PHP基本的関数QUIZPHP基本的関数QUIZ
PHP基本的関数QUIZ
 
Perl logging
Perl loggingPerl logging
Perl logging
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDphpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDD
 
HHVM Hack
HHVM HackHHVM Hack
HHVM Hack
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
PSR-1 と PSR-2 を 5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解するPSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を 5分でざっくり理解する
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
php.js
php.jsphp.js
php.js
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swift
 

Similar to SlowQueryとの戦い

GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)Arata Fujimura
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
意図を表現するプログラミング
意図を表現するプログラミング意図を表現するプログラミング
意図を表現するプログラミングAtsuhiro Kubo
 
The master plan of scaling a web application
The master plan ofscaling a web applicationThe master plan ofscaling a web application
The master plan of scaling a web applicationYusuke Wada
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013純生 野田
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るMasashi Shinbara
 
WordPress安全運用の基礎
WordPress安全運用の基礎WordPress安全運用の基礎
WordPress安全運用の基礎hiro345
 
IPメッセージングはこうやって実装するのだ!
IPメッセージングはこうやって実装するのだ!IPメッセージングはこうやって実装するのだ!
IPメッセージングはこうやって実装するのだ!Sakae Saito
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説賢次 海老原
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012Yusuke Ando
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)noldor
 
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1 pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1 Takuma Morikawa
 
SPAJAMでやったこと
SPAJAMでやったことSPAJAMでやったこと
SPAJAMでやったことHiroto Imoto
 
Aws×phpでの 高信頼かつハイパフォーマンスなシステム
Aws×phpでの 高信頼かつハイパフォーマンスなシステムAws×phpでの 高信頼かつハイパフォーマンスなシステム
Aws×phpでの 高信頼かつハイパフォーマンスなシステムKoteiIto
 

Similar to SlowQueryとの戦い (20)

GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
 
Silex入門
Silex入門Silex入門
Silex入門
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
意図を表現するプログラミング
意図を表現するプログラミング意図を表現するプログラミング
意図を表現するプログラミング
 
The master plan of scaling a web application
The master plan ofscaling a web applicationThe master plan ofscaling a web application
The master plan of scaling a web application
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
 
WordPress安全運用の基礎
WordPress安全運用の基礎WordPress安全運用の基礎
WordPress安全運用の基礎
 
IPメッセージングはこうやって実装するのだ!
IPメッセージングはこうやって実装するのだ!IPメッセージングはこうやって実装するのだ!
IPメッセージングはこうやって実装するのだ!
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
 
Using Dancer
Using DancerUsing Dancer
Using Dancer
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)
 
MT meets PHP
MT meets PHPMT meets PHP
MT meets PHP
 
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
 
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1 pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
 
SPAJAMでやったこと
SPAJAMでやったことSPAJAMでやったこと
SPAJAMでやったこと
 
Aws×phpでの 高信頼かつハイパフォーマンスなシステム
Aws×phpでの 高信頼かつハイパフォーマンスなシステムAws×phpでの 高信頼かつハイパフォーマンスなシステム
Aws×phpでの 高信頼かつハイパフォーマンスなシステム
 

SlowQueryとの戦い