【React】実務におけるuseMemo/useCallback/React.memoの適用方針
useMemo・useCallback・React.memoによるメモ化を活用することでReactアプリケーションのパフォーマンスの向上が期待できます。 しかしメモ化の効果や挙動について理解しても、実際の開発ではどのよう…
useMemo・useCallback・React.memoによるメモ化を活用することでReactアプリケーションのパフォーマンスの向上が期待できます。 しかしメモ化の効果や挙動について理解しても、実際の開発ではどのよう…
redis-objectsについて redis-objectsとはRedisのデータ型をRubyのオブジェクトにマッピングすることでRedisにRuby的なインタフェースを提供するgemです。 Redis::Object…
前回、Rails.cacheの使い方、低レベルキャッシュの利用方法でRails.cacheの紹介をしました。 Rails.cacheは低レベルキャッシュを実現するためのメソッドです。Rails.cacheのデータの保存先…
特定の値やクエリ結果をキャッシュすることを低レベルキャッシュと呼びます。 今回は低レベルキャッシュを実装する際に利用されるRails.cacheについて紹介します。1 Rails.cacheについて RailsではAct…
N+1カウントクエリとは、取得したN件のデータそれぞれに対してcountクエリが発行される現象のことを指します。 以下はN+1カウントクエリの例です。取得したN件のauthorに対してcountクエリが実行されていること…
N+1カウントクエリとは、取得したN件のデータそれぞれに対してcountクエリが発行される現象のことを指します。 以下はN+1カウントクエリの例です。取得したN件のauthorに対してcountクエリが実行されていること…
前回、counter_cacheでN+1カウントクエリを解消する手順でRailsの標準機能であるcounter_cacheを利用してN+1カウントクエリを解消する方法について紹介しました。 今回はcounter_cach…
N+1カウントクエリが発生している状態とは N+1カウントクエリとは、取得したN件のデータそれぞれに対してcountクエリが発行される現象のことを指します。 以下はN+1カウントクエリの例です。取得したN件のauthor…
CSVを分割して読み込むことでメモリの消費を抑える 【Rails】in_batches、find_in_batches、find_eachの違いと使いどころで紹介したように、eachはデータをすべてメモリにのせてからルー…
eachはデータをすべてメモリにのせてからループ処理を実行するため、可能性があります。 たとえば以下の例では、booksテーブルの全レコードがActive Recordオブジェクトに変換され、全オブジェクトをまとめた配列…
サーバが重いときのボトルネックの見つけ方と対応方法について紹介します。 ボトルネックの種類 ボトルネックには以下の種類があります。 外的要因とは重くなっているサーバ自身ではなくリモートホストやDNSなどに問題があるケース…
行ロックを利用してレコードを参照する方法をロッキングリードと呼びます。ロッキングリードを利用することで参照レコードの情報を保護できます。 ロッキングリードには共有ロックを利用するSELECT … LOCK IN SH…
MySQLのデータベースエンジンにはMyISAMとInnoDBがあります。 InnoDBにはレコード単位のロック『行ロック』が実装されています。 行ロックが実行されているテーブルにアクセスする場合、行ロック中のレコード以…
InnoDBはMySQLのデータベースエンジンの1つです。InnoDBの行ロックには共有ロック(Sロック)と排他ロック(占有ロック、Xロック)の2種類があります。1 今回は共有ロックと排他ロックの概要と、ロック時の挙動に…
pluckやmapを利用することで、Active Recordモデルから特定の要素を取り出せます。 今回はpluckとmapの使い分けについて紹介します。 pluckについて pluckはRailsのメソッドです。引数で…
Rubyの実装で利用されるメモリを計測する方法には主に以下の2つがあります。 今回は上記2つの具体的な利用方法について紹介します。 なおObjectSpaceモジュールには『任意のオブジェクトのメモリを使用量を計測するm…
検索条件によってはSQLでインデックスが利用されないケースがあります。 達人に学ぶDB設計 徹底指南書などでインデックスが利用されないと一般的に言われているケースは以下の通りです。 しかし手元で検証してみたところ上記のう…
新規テーブルの作成やクエリチューニング時にインデックスを作成する機会があります。 インデックスを作成することでSQLの実行時間を短くできます。 そこで今回はインデックスを作成する際のチェックポイントについて紹介します。 …
SQLのJOINで利用される代表的な結合方法にはNested loop join(NLJ、ネステッドループ結合)、Merge join(マージ結合、ソートマージ)、Hash join(ハッシュ結合、ハッシュ値マッチング)…
複合インデックス(結合インデックス)とは複数のカラムを組み合わせたインデックスのことをいいます。 検索やソート条件で一緒に利用されるカラムに対して複合インデックスを作成することでクエリの高速化が期待できます。 複合インデ…
前回、MySQLのEXPLAINの読み方とチューニング時のチェックポイントでEXPLAINの読み方について紹介しました。 スロークエリを引き起こす最も多い原因のひとつが『正しくインデックスが作成・利用されていない』です。…
EXPLAINを実行することでSQLの実行計画が取得できます。クエリのチューニングにおいてEXPLAINの理解は必須です。 今回はEXPLAINの読み方とクエリをチューニングする際のチェックポイントについて紹介します。 …
画像をはじめとした静的コンテンツをキャッシュし、Webサーバから配信することでアプリケーションのパフォーマンス向上が期待できます。 今回はnginxで静的コンテンツをキャッシュ配信する方法について紹介します。 nginx…
前回、Ruby標準のBenchmarkモジュールを利用したベンチマークの実行・確認方法でRuby標準のBenchmarkモジュールを利用したベンチマークテストの実行方法について紹介しました。 今回は、Benchmarkモ…
Rubyの標準で用意されているBenchmarkモジュールを利用するとベンチマークテストが実行できます。 今回はBenchmarkモジュールを利用したベンチマークテストの実行および結果の確認方法について紹介します。 Be…
Stackprofは『どのメソッドにどれくらいの時間がかかっているか』を解析できるgemです。 今回はStackprofの利用方法について紹介します。 なお、Stackprofはflamegraphと組み合わせることで解…
Railsアプリの計測用gemで有名なrack-mini-profilerのインストール方法および利用方法について紹介します。 rack-mini-profilerで計測できること rack-mini-profilerは…
rblineprofは計測対象のファイルに計測用のコードを埋め込むことで行単位のプロファイリングが行えるgemです。 rblineprofの利用方法については【Ruby】rblineprofで行単位の計測を行う方法で紹介…
前回、【Ruby】rblineprofで行単位の計測を行う方法でrblineprofを利用したRubyのプロファイリング方法について紹介しました。 rblineprofを利用すると、計測対象のファイルに計測用のコードを埋…
rblineprofは行単位のプロファイリングを行うgemです。 rblineprofを利用することで『どの行でどれだけの時間がかかっているか』などが計測できます。 rblineprofの利用手順は以下の通りです。 今回…
N+1問題とは、取得したN件のデータそれぞれに対してSQLが発行される現象のことをいいます。 N+1問題によるデータベースへの大量アクセスは、アプリケーションのパフォーマンスを低下させる原因の1つです。 今回はN+1問題…
こんにちは。@nishina555です。 Webのパフォーマンスをチューニングするにあたり、サーバーのパフォーマンスを監視することは非常に重要です。 今回はというモニタリングツールの導入手順について紹介をしたいと思います…
こんにちは。@nishina555です。 前回、遅いクエリを突き止める!MySQLクエリ解析にスロークエリログを導入する手順でSQLのクエリ解析の手段としてスロークエリログをMySQLに導入する手順について説明をしました…
こんにちは。@nishina555です。 Webのパフォーマンス改善において、は非常に重要です。 特に、実行時間の長いものや試行回数の多いクエリを抽出することはチューニングの方向性を決める上で大事です。 MySQLではの…
こんにちは。@nishina555です。 前回こちらの記事でISUCON環境をConoHaに構築しました。 ISUCONではパフォーマンスチューニングのスコアで勝敗を決めるわけですが、チューニングをする前にまずはどこを改…