Submit Search
Upload
SlowQueryとの戦い
•
5 likes
•
3,494 views
Ken Gotoh
Follow
2014/10/11 PHPカンファレンス2014 LT無差別級での発表資料 遭遇した衝撃的なSQLを紹介し、ORMと開発者に一言申します。
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 52
Download Now
Download to read offline
Recommended
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
Moriyoshi Koizumi
PHP7を魔改造した話
PHP7を魔改造した話
Moriyoshi Koizumi
Symfony2 How to create your Bundle
Symfony2 How to create your Bundle
chobi e
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
sters
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Ruby 同好会宣言
Ruby 同好会宣言
Yuya Takeyama
Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト
Akio Ishida
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
keroyonn
More Related Content
What's hot
PHP基本的関数QUIZ
PHP基本的関数QUIZ
Wataru Terada
Perl logging
Perl logging
keroyonn
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
leverages_event
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDD
Akio Ishida
HHVM Hack
HHVM Hack
Masaaki Yonebayashi
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
Yuki Okamoto
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
Yusuke Ando
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
Hiroaki KOBAYASHI
PSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解する
Wataru Terada
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
kwatch
php.js
php.js
Kenta USAMI
実用裏方 Perl 入門
実用裏方 Perl 入門
keroyonn
PHP の GC の話
PHP の GC の話
y-uti
WebAPIではじめるphp入門
WebAPIではじめるphp入門
Hiroaki Murayama
Hack/HHVM 入門
Hack/HHVM 入門
y-uti
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
アシアル株式会社
traitを使って楽したい話
traitを使って楽したい話
infinite_loop
PHPの今とこれから2014
PHPの今とこれから2014
Rui Hirokawa
Deep dive into oss written in swift
Deep dive into oss written in swift
Yuki Asai
What's hot
(20)
PHP基本的関数QUIZ
PHP基本的関数QUIZ
Perl logging
Perl logging
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDD
HHVM Hack
HHVM Hack
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
PSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解する
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
php.js
php.js
実用裏方 Perl 入門
実用裏方 Perl 入門
PHP の GC の話
PHP の GC の話
WebAPIではじめるphp入門
WebAPIではじめるphp入門
Hack/HHVM 入門
Hack/HHVM 入門
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
traitを使って楽したい話
traitを使って楽したい話
PHPの今とこれから2014
PHPの今とこれから2014
Deep 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編)
Arata Fujimura
Silex入門
Silex入門
Takuya Sato
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
意図を表現するプログラミング
意図を表現するプログラミング
Atsuhiro Kubo
The master plan ofscaling a web application
The master plan ofscaling a web application
Yusuke Wada
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
純生 野田
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
Masashi Shinbara
WordPress安全運用の基礎
WordPress安全運用の基礎
hiro345
IPメッセージングはこうやって実装するのだ!
IPメッセージングはこうやって実装するのだ!
Sakae Saito
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
賢次 海老原
Using Dancer
Using Dancer
Yoshihiro Sasaki
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Yusuke Ando
Perl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
swooleを試してみた
swooleを試してみた
Yukihiro Katsumi
アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)
noldor
MT meets PHP
MT meets PHP
純生 野田
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!デベロッパーネットワーク
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
Takuma Morikawa
SPAJAMでやったこと
SPAJAMでやったこと
Hiroto Imoto
Aws×phpでの 高信頼かつハイパフォーマンスなシステム
Aws×phpでの 高信頼かつハイパフォーマンスなシステム
KoteiIto
Similar to SlowQueryとの戦い
(20)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Silex入門
Silex入門
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
意図を表現するプログラミング
意図を表現するプログラミング
The master plan ofscaling a web application
The master plan ofscaling a web application
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
WordPress安全運用の基礎
WordPress安全運用の基礎
IPメッセージングはこうやって実装するのだ!
IPメッセージングはこうやって実装するのだ!
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
Using Dancer
Using Dancer
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Perl 非同期プログラミング
Perl 非同期プログラミング
swooleを試してみた
swooleを試してみた
アルゴリズム+データ構造勉強会(8)
アルゴリズム+データ構造勉強会(8)
MT meets PHP
MT meets PHP
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
SPAJAMでやったこと
SPAJAMでやったこと
Aws×phpでの 高信頼かつハイパフォーマンスなシステム
Aws×phpでの 高信頼かつハイパフォーマンスなシステム
SlowQueryとの戦い
1.
SlowQueryとの戦い (ほとんどORM) 2014/10/11
PHP Conference 2014 株式会社サイバード ゲーム事業本部 後藤 健
2.
後藤 健 •
新卒2年目 25歳 • ゲームインフラチーム • インフラ、ミドルウェアまわり • PHPer(たまにPython) • 趣味 車・ライブ・スノーボード etc.. • Twitter : @gotyoooo
4.
さっそくですが。
5.
O/Rマッパー 使ってる人! 挙手!!!
6.
ありがとうございます!
7.
O/Rマッパー なんて使わねー 俺は生SQLだ!!
挙手!!!
8.
ありがとうございます!
9.
世の中的なO/Rマッパー 利用率が分かったところで
10.
http://blog-imgs-54-origin.fc2.com/j/i/k/jikomanzoku009/saa.jpg
11.
SQLにはご注意を http://www.weblio.jp/img/dict/hyazi/112.gif
12.
特にO/Rマッパー をご利用の皆様 http://www.weblio.jp/img/dict/hyazi/112.gif
13.
http://cyline-jp.com/download/SQL.png http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
14.
じゃないと http://cyline-jp.com/download/SQL.png http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
16.
恐ろしいこと になりますよ
17.
では実例
18.
その1
19.
意味のないソート
20.
SELECT * FROM
t1 WHERE ~省略~ ORDER BY t1.updated DESC, t1.updated ASC LIMIT 1
21.
SELECT * FROM
t1 WHERE ~省略~ ORDER BY t1.updated DESC, t1.updated ASC LIMIT 1
22.
http://www.rosei.jp/jinjour/wp-content/uploads/2011/12/fotolia_36435421_Subscription_L.jpg
23.
Model_Collection::find( 'first', array(
‘order_by' => array( ‘updated' => ‘DESC' ) ) );
24.
Model_Collection::find( 'first', array(
いらん ‘order_by' => array( ‘updated' => ‘DESC' ) ) );
25.
Model_Collection::find( 'all', array(
'order_by'=>array('updated'=>'DESC') ) ); Model_Collection::find( 'first', array( 'order_by'=>array('updated'=>'DESC') ) );
26.
Model_Collection::find( 'all', array(
'order_by'=>array('updated'=>'DESC') ) ); Model_Collection::find( 'first', array( コピペコードの弊害 'order_by'=>array('updated'=>'DESC') ) );
27.
Model_Collection::find( 'all', array(
'order_by'=>array('updated'=>'DESC') ) ); 返ってきたデータ Model_しCollection::か意識find( 'first', してない array( 'order_by'=>array('updated'=>'DESC') ) );
28.
Model_Collection::find( 'all', array(
'order_by'=>array('updated'=>'DESC') ) ); Model_Collection::find( 'first', array( 生SQLなら防げた? 'order_by'=>array('updated'=>'DESC') ) );
29.
その2
30.
悪名高きn+1問題
31.
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 … … … …
32.
$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’]) ) ); }
33.
$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’]) ) ); }
34.
$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’]) ) ); }
35.
(1) × 1
(2) × n SELECT * FROM user_profile WHERE sex = 1 SELECT * FROM user_point_log WHERE user_id = #id
36.
(1) × 1
(2) × n SELECT * FROM user_profile WHERE sex = 1 無駄なクエリ一杯 SELECT * FROM user_point_log WHERE user_id = #id
37.
(1) × 1
(2) × n SELECT * FROM user_profile WHERE sex = 1 データ数に応じてnも増加 SELECT * FROM user_point_log WHERE user_id = #id
38.
SELECT * FROM
user_profile INNER JOIN user_point ON user_profile.id = user_point_log.id WHERE user_profile.sex = 1
39.
SELECT * FROM
user_profile INNER JOIN user_point ON user_profile.id = user_point_log.id WHERE user_profile.sex = 1 JOINしましょう
40.
例 終わり すごい基本な例でごめんなさいorz
41.
何が言いたいか http://www.canstockphoto.com.br/foto-imagens/eureka.html#file_view.php?id=13126638
42.
http://cyline-jp.com/download/SQL.png http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
43.
投げるクエリを意識すべき http://cyline-jp.com/download/SQL.png http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
44.
意識できる環境を作ろう http://cyline-jp.com/download/SQL.png http://f.st-hatena.com/images/fotolife/G/GET/20080131/20080131075901.jpg
45.
テスト環境にも ある程度のデータ量 http://ja.gofreedownload.net/free-icon/icons/misc-database-109423/#.VDc0idSsWcY
46.
投げられたSQLを 出力できるような仕組み http://www.tech-faq.com/wp-content/uploads/images/SQL-Injection-Attack.jpg
47.
チーム別スロークエリー 出力ランキングとか素敵 http://www.slot-pioneer.co.jp/product/kingbary/pop/kingbary_08.jpg
48.
弊社もまだまだ 出来てません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
50.
こんなグラフ出す前に
51.
糞クエリ 撲滅しましょう
52.
ありがとうございました。 ここでドラ娘(?)が鳴らす(予定)
Download Now