laravel sql 高速化 5

でも、開発中のものを誰の目にも触れるサーバーにアップするわけにはいきません。 laravelでtelescopeの導入手順 この記事は Laravelリファレンス発売記念!販売促進!! Advent Calendar 2015 - Adventar 12/5 分の記事です。 Laravel について「遅い」とか言われるたびに、「ちゃんと最適化してる?」って思ってたので良い機会なのでここらへんちゃんと書いておこうと思います。 1対1 2. 一部がクラウド、一部がオンプレミスという構成にしていることの問題としては、ネットワークの状況によってサーバー間の通信ができなくなり、サイトが表示されなくなることが挙げられます。 laravelのように、フレームワークを使っていると、データベースアクセスもORMを通して行えてかなり便利ですよね。, でも、普通にphpを書いている気分でSQLを発行出来るため、SQLの発行回数が多くなり、サイトの速度がかなり遅くなってしまう恐れもあります。, この記事では、リレーションを持ったテーブルをまとめて読み出すときに気をつけるべきSQLのクエリの回数と、laravelのORMツールであるEloquent で、withメソッド を使ってSQLの回数を減らして高速化を行なう方法を紹介します。, まず、実際に複数のテーブルからなるデータを読み出してみて、どの様にSQLが発行されているかを、telescopeというlaravelのデバッグツールを使って見てみましょう。, それぞれのプロジェクトがもつタスクをチェックボックス付きで表示しています。例えば、プロジェクト「プロジェクトA」は、3つのタスクを持っています。, データベースの構成としては、プロジェクトテーブルと、タスクテーブルがあり、タスクテーブルのカラムproject_id でタスクが所属するプロジェクトを識別しています。, 上記のようなデータベース構成のとき、下図のようにプロジェクトモデルで、hasManyメソッドを作っておくと、Projectクラスのインスタンスから tasks を呼び出すことで、タスクのデータにアクセスすることが出来ます。, たとえば、下図のように、$project->tasks とすると、$projectが指すプロジェクトが持っているタスクのコレクションにアクセスできます。先程のプロジェクト一覧のページを表示させるために、下図の赤枠のように、$project->tasks と指定すれば、そのプロジェクトが持つタスクのコレクションにアクセスすることが出来ます。下図のリストは、ちょうど、プロジェクト一覧ページで、プロジェクトとプロジェクトが持つタスクの一覧を表示しているところです。, 特に何も考えずにプログラミングして、先程のプロジェクト一覧にアクセスすると、SQLアクセスを6回していました。, そのうち、taskテーブルへのアクセスがプロジェクトの個数と同じ4回となってます。, SQLアクセスはオーバヘッドがでかいし、データを扱うのに特化しているデータベース内部の処理のほうが、PHPの様に実行時に機械語に変換されるスクリプトの処理よりも高速のため、こうやって何度もSQLのクエリを発行すると、時間がかかる処理になってしまいます。, これを解決するためには、project一覧をデータベースから読み出すときにwithメソッドを使って予めタスクデータも読み出してしまいます。これをEagerロードといいます。積極的な読み出しという意味です。, ログインユーザのid が所有者となっているプロジェクトをwhereメソッドで取得している単純な方法ですね。, ここに、withを使ってhasManyで指定したtasksを強制的に読み出す指示をしてみます。, whereメソッドとgetメソッドの間に with(‘tasks’)を入れた形になってます。, 簡単ですよね。この指示により、このプロジェクト一覧ページを読み出すときのクエリは以下のようになります。一つだけのクエリですべてのプロジェクトに属するタスクを読み出していますよね。, SQLの結合を使って複数のテーブルのデータをとってきて方法とは違いますが、withメソッドを使えば、projectがいくつ増えようと、1つのクエリで属するtaskをすべてとってくることが出来きます。, ORMを使うとわすれがちなクエリの最適化ですが、withメソッドを使ってEagerロードすることによって、簡単に行うことが出来ます。, ただ、不要なものまでEagerローディングしてしまうと、逆に処理時間が長くなったり、メモリを消費してしまいます。withによるEagerロードは、あくまでも、後で読み込むデータを先にまとめて読み込むのに使うようにしてください。, withを使ったEagerローディングに関しては、laravelのマニュアルページに詳しく載っているので、withメソッドに関してもっと色々知りたくなったら参照してみてください。, 僕も最近納品が終わったウェブサイトではlaravelを使っていたのですが、EagerローディングにはwithPivotを使ったり、withに第2引数で先読みするアイテムに制約条件を付けたリもしました。, そんな応用的な内容も別途記事にしていきたいと思います。メルマガでも、本記事のようにプログラミングの仕事をしていて使えそうな考え方やテクニックなどを紹介したり、記事更新をお知らせしたりしています。, 次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。, プログラマに必要なスキルが身につく情報をメルマガで配信しています。登録してみてください。, PHPを実践レベルで使いこなし、バックエンドの仕事まで受注できるようになる講座、開催中。, 「あなた専用カリキュラムと3ヶ月のサポート」で、もっと稼げるプログラマになれる講座、開催中。, 「プログラマとして独立したい」、「転職してプログラマとしてもっと給料をアップさせたい」と考えているのであれば、以下より詳細を御覧ください。, 小学3年のときにMSXでプログラミングを始めて、いつの間にか数十年たちました。 大学ではc++を使いスパコンの研究、就職してからはcで自動車のエンジンやモータなどのパワープラント制御をやってました。, 使用してきた言語は、c, c++, java, perl, javascript, php, ruby, scala など・・・, 表計算・文章作成・プログラミングの解説やデスクワークから身体を守るグッズなどを紹介してます. レンタルサーバーでphpをいじっていたんですが、同じコードでも、ブラウザから呼び出す場合と、コマンドラインで実行する場合で、タイムゾーンが違ってるらしく、ブ... xserver X10プランにlaravelのプロジェクトをデプロイする手順 ~Laravel入門~, リソースコントローラで削除:destroyアクション を実装する~Laravel7入門~. controllerに負荷があるのか、model側に負荷があるのかが確認できます。, 今回もmodel側に問題がありそうだったので、実践1と同様に該当するクエリにexplainをかけ、indexが追加出来る場所に追加して対応しました。, ご覧の通り、MySQLのドカドカしている負荷がかなりなだらかになっていることが分かります。 Laravel 5.6; MySQL 5.7; 目次 . 旧サーバー構成ではwebサーバー(クラウド)からKVSサーバー(オンプレミス)へのアクセス時に通信コストが発生していました。 また、PHPのフレームワークにLaravelを使用しております。, このグラフはNew Relic(後に説明します)によって出力したもので、フロント側のキャッシュを介さずにサーバーへ直接のアクセスがあった際の負荷を表しております。 laravelとは、PHP言語で動作するWebアプリケーション作成用のフレームワークです。 まず、作成予定のWebアプリケーションの概要と作業手順の概略を説明します。それぞれの細かい手順については、別の記事で補足していきます。 左側の「Transactions」を選択するとこの画面に遷移します。, 今回の場合、緑色と黄色の項目が時間によって急に負荷が上がっていることが確認できます。, 更に、左のcontrollerの項目を選択すると、method毎の負荷の内訳が確認できるため なんとなく、キャッシュしてくれるならどちらもやっておいた方が良いだろうと考えがちですが、検証の結果では(1)のconfig:cacheのみが一番効果がありました。, この時点で210ms台に突入し、最初が4.5sだったと考えれば十分に上出来だと思ってしまいがちですが、目標は100ms台です。 slow queryとは、処理に時間がかかっているクエリをログとして残してくれる機能で、MySQLを使用している場合に設定が可能です。, indexが上手く動いているか否かはexplainで確認できます。 最終的に一番右側の構成となっております。, メディアローンチ時、AAJを構成する全サーバーはオンプレミスでした。 「ひょっとしたらKVSキャッシュが利いていないのでは?」 一方で、クライアントサイドの速度の計測といえば、GTmetrixが代表的です。https://gtmetrix.com/, New Relicの基本画面といえばお馴染みのこちら「OverView」というものがあります。 Laravel 5.7 (クリーンインストール) 使用データベース. (サーバー構成は後に記述します) ブログを報告する, バージョン Laravel 5.7 概要 Laravelのログ機能を拡張して、UT…, [PHP][Laravel][SQL] LaravelのEloquentで WHERE A OR B を実施(条件によりorWhere条件を追加), [PHP][Laravel] APIのResponseデータをカスタムしてシステム内でレスポンス形…, [PHP][Laravel] Laravelでログをカスタムしてタイムゾーン日時、ユーザーID、ク…, [PHP][Laravel][SQL] LaravelのEloquentでFROM句の副問い合わせ, [PHP][Laravel] Laravelの条件付きvalidation(入力値を判定してバリデーションを追加するか判断する). この後、中国からの閲覧に対応するためWebサーバーとキャッシュサーバーのみクラウドへ移行しました。 ここで1000ms → 600msまで落ち着きました。, SQLのアプローチによる速度改善のネタが出尽くしつつあるところ、サーバー構成そのものの見直しに踏み込んでみました。, AAJはサーバー構成に変遷がありました。 また、公開用サーバーとして使えるサーバーは高負荷にも... PHPで時刻を取得、文字列を生成する方法です。 laravelは、現在(2... こんにちは。ウェブプログラミング入門です。 フレームワークを使うことで、Webアプリケーションを作るとき、自分で作らなければいけないコー... Ruby on Rails で作業中、DBの内容を確認するために使用した sqlite コマンドのメモです。centos6上で動いているアプリで、DB確認のために GUIのブラウザを導入するのも大変そうなので、コマンドラインで簡単に確認しま... こんにちは。 ← Laravel SQL高速化 2TB以上のHDDをマウントしたい → コメントを残す コメントをキャンセル メールアドレスが公開されることはありません。 元々aajのphpのバージョンは5.5.xでした。※ オールアバウトの標準環境自体はphp 5.5.xです。 php 7が他のphpのバージョンより高速であることや、使用しているフレームワークのlaravelがphp 7に対応していることから、php 7へのバージョンアップを試みました。 結果 https://laravel.com/docs/5.0/controllers#route-caching, 今回、どれが効果的であったかを明確にするため、(1)config:cacheのみ、(2)route:cacheのみ、(3)config:cache,route:cache両方という組み合わせで検証を行いました。 バージョン Laravel 5.8 概要 レスポンスマクロを用いて、APIの… 2019-07-30 [PHP][Laravel] Laravelでログをカスタムしてタイムゾーン日時、ユーザーID、ク… バージョン Laravel 5.7 概要 Laravelのログ機能を拡張して、UT… コメントを書く. 外国人向けサイトで、英語、中国語(繁体字)、中国語(簡体字)、タイ語、韓国語の5か国語に対応しております。 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. 2019年10月に個人で開発していたサービスをリリースしました! 楽器店のレビューサイトを公開しました! ・これから楽器を始める人 ・楽器を愛するプレイヤー が最高の楽器店に出会えることを目指していますἻ... まだポートフォリオで消耗してるの? 実務未経験からwebエンジニアとして転職しようとする際にこのような話を聞くことが多いと思います。 Web エンジニア 実務未経験からwebエンジニアとして転... 【無料あり】30代未経験が通うべきプログラミングスクールを現役エンジニアがガチ解説. これを全てのサーバーをクラウド上に置くことで通信時間が短縮し、速度改善に繋がったと考えられます。, 前途の通り、AAJにはフレームワークとしてLaravelを使用しておりますので、Laravelでできる速度改善を調べたところ、 https://laravel.com/docs/5.0/configuration#configuration-caching, laravelのapp/routes.phpに記述する、routingに関する設定をキャッシュしてくれるものです。 するとこのように結果が出力されます。, select_typeに"DEPENDENT SUBQUERY"と書かれていることが多いのはLaravelのアクティブレコード(Eloquent)を使用しているためです。 New Relicにはalert機能があって、例えば先ほどのApdex scoreが一定の値を下回った時にalertをSlackやメールで通知する設定があります。, AAJを動かしているサーバーを全てクラウド環境にまとめることで各サーバー間の通信コストを抑える, varnishのキャッシュ時間が60分に対してKVSキャッシュの時間を80分に修正, このようにして、All About Japanは一番重たかった頃の4.5秒から120ミリ秒まで速さが改善しました。数字だけで見ると1/37まで改善したということになります。, All About Japanはサイトローンチして間もなく、データが少ない頃からは想定していなかった負荷が発生したことがきっかけで高速化のあれこれを試みました。 | データベーステーブルは大抵の場合他のものと関連しています。たとえばブログ投稿(ポスト)は多くのコメントを持つか、それを投稿したユーザーと関連しています。Eloquentはそうしたリレーションを簡単に管理し操作できるようにするとともに、様々なタイプのリレーションをサポートしています。 1. データベースクエリビルダはスラスラと書ける(fluent)便利なインターフェイスで、クエリを作成し実行するために使用します。アプリケーションで行われるほとんどのデーターベース操作が可能で、サポートしている全データベースシステムに対し使用できます。 LaravelクエリビルダはアプリケーションをSQLインジェクション攻撃から守るために、PDOパラメーターによるバインディングを使用します。バインドする文字列をクリーンにしてから渡す必要はありません。 SQLの見直しも概ねでき、Laravelのキャッシュも入れたことだし、サーバー構成も見直したとなると、そろそろネタが尽きるところですが、ここでPHPのバージョンアップを検討しました。 「Anime」「Izakaya」「Ninja」といったような特集や、実際に観光する人向けのモデルルート記事が特色です。, ■ 特集 1対多 3. 注意: この記事は更新停止します。 laravelの公式パッケージとなってて、composerで導入することが出来ます。 という指摘があり、改めてKVSキャッシュ時間を調べてみました。, つまり、ブラウザキャッシュが無かったらvarnishキャッシュ、varnishキャッシュが無かったらwebサーバーにアクセス、webサーバーからKVSキャッシュを参照して、無かったらDBサーバーにアクセスをするようになっております。, varnishのキャッシュ時間は60分に設定していますが、60分でキャッシュが切れる前にアクセスがあると、そこから60分のキャッシュが有効になります。, 一方、KVSのキャッシュ時間は10分に設定されておりました。 本日はSQLの高速化について。 高速化といってもさまざまなテクがあると思うのですが、代表的な考え方に関して。 Contents. サブクエリはなるべく避けた方が速度改善に繋がりますが、今回の場合、Eloquentで記述した方がプログラムの見た目は非常に簡潔であるため、 今回はオールアバウトのnnmrが弊社サイトAll About Japanの速度を高速化した経緯についてまとめます。, そもそもAll About Japan(以下AAJ)とは何かといいますと、弊社が提供している訪日外国人向けの日本紹介サイトです。 Has Many Through 5. こちらもconfig:cacheと同様、サーバー上の該当アプリ以下でコマンドを打つか、composer.jsonに記述してcomposer updateを行うことで適用できます。, 詳細はこちら : この記事では、フレームワークとは何かと、フレームワークを使うメリット、フレームワークにはどんなものがあるかを紹介します。 プログラミング未経験の方で... laravelとは PHPで動くフレームワーク php.ini を編集して apache を再起動すれば最長ファイルサイズを引き... laravelにはEloquentという強力なORMがあります。データベースのテーブルをモデルと対応させ、モデルのインスタンスでレコードを表現するものです。 プログラミングにおけるフレームワークを使うメリットは 1 データ取得の基本. 公開用サーバーとローカル環境 まずタイムゾーンの設定について config:cacheとroute:cacheというものがありました。, laravelのconfig/app.phpにある内容をキャッシュしてくれるものです。 laravelとは PHPで動くフレームワーク 当ブログに掲載されているコンテンツ(文書やプログラム等)を利用したことにより発生したいかなる損失・損害につきまして当ブログは一切の責任と義務を負いません。, WaterFallsさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog Eloquentの実装を残しつつ、そこで発生したサブクエリはindexで対応するという方針で進めました。, 実践1と同じく、SQLを見直しましたが、実践1と比較して異なることといえば、New Relicを活用したことが挙げられます。 ブログを報告する, この記事はAll About Group Advent Calendar 2017 8日目の記事…, http://allabout-japan.com/en/article/222/, https://laravel.com/docs/5.0/configuration#configuration-caching, https://laravel.com/docs/5.0/controllers#route-caching, 【新卒週間2019】アクセス集計を自社集計からGoogle Analyticsにするために調査して困…, golangでCloud Monitoringのデータを元に稼働率を取得するようにした話, Google Cloud Functionsを使ってバックアップデータからログの再収集を行う方法の紹介, type → ALLもしくはindexと表記されている場合、レコード数が膨大である場合は見なおした方が良いです。, possible_keys → indexで使えるキーが無いとNULLになります。, key,key_len,ref → いずれもindexで使えるキーが無いとNULLになります。, Extra → Using Temporary, Using Filesortと出ている場合はindex追加で見なおした方が良いです。, slow queryの結果からexplainを使ってindexを追加できる箇所を検討してみよう。. Windows10に Mysql付きのちょっと古めのXAMPPをインストールしたのですが、Fake Sendmailなる項目があったため、インストールしてみました。 laravelとは、PHP言語で動作するWebアプリケーション作成用のフレームワークです。 users: ユーザーの情報。 posts: 投稿の情報。 手順. もし、「最近、サイトが重たいな…」と思うことがあって、これが参考になれば幸いです。, 株式会社オールアバウトのエンジニアが執筆しているTech Blogです。 What is going on with this article? フレームワー... laravelで開発するなら、telescopeというデバッガが便利です。 PHP 7が他のPHPのバージョンより高速であることや、使用しているフレームワークのLaravelがPHP 7に対応していることから、PHP 7へのバージョンアップを試みました。, 開発環境での検証と同様、50msの速度改善を図ることができ、 explainを出す方法は割と簡単で、調べたいクエリの頭に"explain"を加えて実行するだけです。 Why not register and get more from Qiita? 今、思えば日頃から速度をチェックしているという習慣があったら良かったというように思います。, 実践7は具体的に何かの施策をしている訳ではありませんが、New Relicをチェックする習慣についてまとめました。, Apdexとは、Application Performance Indexの略で、ページ速度に対するユーザーの満足度を数値化したものです。 つまり、キャッシュが切れたタイミングでだいたい4.5sかかっているということです。, もちろん、この数値が低いに越したことはありません。 個別の記事で説明します。 準備. 「PHP」「MySQL」「Redis」という項目からどの負荷の比率が高いかを確認することができます。, 負荷の比率をphpのclass、method毎に確認したい場合、「Transactions」が活躍します。 | Help us understand the problem. 1.1 get()で全てのデータを取得する; 1.2 first()でひとつだけデータ取得する; 1.3 find()でidを指定して取得; 1.4 chunk()である件数ごとにデータ取得; 2 カラム(フィールド)を指定する. (url : http://allabout-japan.com/en/tag/sushi/ ), ■ モデルルート記事 想定していた160ms台に突入しました。, この、速度改善をあれこれ試みている過程で (url : http://allabout-japan.com/en/article/222/ ), LAMP環境です。 今後、Laravelの更新に合わせて修正することはありません。 ちなみに、社内の他webサービスがやれ200ms台で「ちょっと遅いかも」なんて言われているくらいでしたので、4.5sというのはあまりにおぞましい数字です。, 5か国語対応ということで薄々お気づきかもしれませんが、翻訳が必要な分だけ1つの記事を表示させるためのクエリが以下のように複雑になりがちです。, 実際にslow queryで確認したところ、10秒以上かかっているクエリを発見しました。 この記事では、モデルのfindメソッドによるデータベースのデータレコード取得... クエリ回数を減らす:withメソッドを使ってEagerロード(=積極的な読み出し), xserver X10プランにlaravelのプロジェクトをデプロイする手順 ~Laravel入門~, リソースコントローラで削除:destroyアクション を実装する~Laravel7入門~. Laravelをインストールする サーバー上の該当アプリ以下でコマンドを打つか、composer.jsonに記述してcomposer updateを行うことで適用できます。, 詳細はこちら : フレームワークを使うことで、Webアプリケーションを作るとき、自分で作らなければいけないコー... Webサーバーの仕組み このようなリスクを考慮し、オンプレミスならオンプレミスに、クラウドならクラウドに寄せたほうが良いということになり、全てのサーバーをクラウドに設置しました。, 上記のNew Relicの結果から、一番速度が改善されているのがRedis(KVS)であることが分かるかと思います。 ポリモーフィックリレーション 6. 今回はこれからLaravelを使用する人に向けて、DB(データベース)の接続方法を一から解説していきます。, 今回はmacOS用パッケージマネージャーであるHomebrewを使用してインストールします。, ※ --skip-grant-tables をつけることでパスワードなしでログインが可能になります。, ローカル環境に存在するDBの一覧が表示されました(ここで表示されるDBは個人の環境で異なります)。, show databases; でDB一覧に先ほど作成したDB名があればOKです。, MySQL8.0以降デフォルトの認証プラグインは mysql_native_password から caching_sha2_password に変更されました。, しかしPHPの方ではまだサポートされていないため、認証プラグインを以前の mysql_native_password に戻します。, MySQLに接続できたら、以下のコマンドで既存ユーザーの認証プラグインを確認してみます。, 現在の認証プラグインが caching_sha2_password になっていることがわかります。, .envファイルの中にDBの設定を記載することで、正常に接続することが可能になります。, DB_DATABASEの値を先ほど作成したDB名に、DB_PASSWORDを先ほど設定した「secret」に変更します。, 基本的には手順通り進めていけば、エラーなくLaravelとDBの接続は完了すると思いますが、DBの設定中につまづきがちなエラーとその解消方をご紹介します。, ・.envファイルのDB_DATABASE、DB_USERNAME、DB_PASSWORDにMySQLのDBと同じものが設定されているか。, MySQLの認証プラグインを変更する の手順にしたがって、MySQLの認証プラグインを「caching_sha2_password」から「mysql_native_password」に変更してください。, 今回の記事で分かりにくいところや、他にも解説して欲しい内容があれば、是非ともコメント欄やお問い合わせからメッセージをください!, これから「Laravelを勉強したい!」と考えている人は一冊書籍を持っておくと体系的に勉強できます。, 業務未経験からポートフォリオなしでWebエンジニアに転職した際の経験談を語りました。, 30代未経験からエンジニアに転職する際のプログラミングスクールについて書きました。, 新卒入社した企業を一年で退職し、楽器メーカーへ転職して海外に駐在。 その後未経験からWebエンジニアに転職しました。, 最近は業務では主にPHP、個人開発ではFlutterを使用してアプリを作っています。, 20代中盤ですが2回転職し、その経験を活かして当ブログで転職情報(IT&楽器業界)を発信。 また音楽好きでもあり、趣味全開の音楽情報も発信中。, ド素人がWebサービスを個人開発してリリースするまでに学んだこと【Laravel + Vue.js + Python】.

Mac Python Idle 起動しない, Vba If 空白なら, 新大阪 新幹線 在来線 乗り換え 号車, 公用文における 漢字 使用等についての具体的な取扱い方針について, Ie11 ポップアップブロック 解除, 見てくれてありがとう 英語 Youtube, ペイペイ セブンイレブン 還元されない, 日本国内 時差 最大, エクセル 数字 桁 抽出, Powershell 起動時 実行, 自転車 サスペンション サビ, 陸上 怪我 短距離, あなたへ 伴奏 難しい, 彼女 は 毎週 日曜日 に 買い物 に 行き ます 英語, 焼き鳥 テイクアウト 近く, 外国人留学生 大学 ランキング, 能年玲奈 現在 コマーシャル, ろうきん 引き落とし 日, 英語 起源 ラテン語, デニーズ フレンチトースト 昔, エクセル 罫線 自動 解除, イラレ ブレンドツール 円, とらドラ オレンジ 歌詞 意味, Preserved Roses 主題歌, リカちゃん 帽子 ペットボトルキャップ, 総武線 各駅 停車 始発, Lanケーブル コネクタ 外し方,

Leave a Reply