しておけばよくね?」は、よくない (イメージで説明すると) age < 30 を条件に更新したいトランザクション A と、 age > 40 を条件に更新したいトランザクション B があったとしよう。 age のインデックスが ある : age でソートされているから A, B の操作は干渉しないことが分かる。 A → B の順に実行しても、B → A の順に実行しても問題ないので、並列に処理できる ない : お互いの条件に合うレコードがどこにあるか分からないので、 全部のレコードを探す必要がある。A, B は並列に実行できない 40
freee さんの記事) 特定の閾値を超えるとパフォーマンスが劣化する例 GROUP BY や ORDER BY のような一時テーブルを利用するクエリで件数が多い https://dev.mysql.com/doc/refman/8.0/ja/internal-temporary-tables.html 集計操作を伴うクエリに対し、一定サイズまではメモリ上の一時テーブルを用いる が、それより大きいとメモリからディスクに書き出す挙動をする ディスクに書き出す処理は高コストなので「特定の ID を指定したクエリでやたら遅い んだけど」という事象が発生する 56
の場合、 (経験上)積極的に行う機会はあまりない b. クエリチューニング クエリ単体をチューニングし、レイテンシ向上を狙う 「個別最適」のように見えて効果が小さいように見えるが、現実には非常に重要 バッファプールや CPU は共有リソース 効率のよいクエリは CPU を専有しないしバッファプールも荒らさないので、 結果的に DB 全体のパフォーマンスが向上することがよくある 68
ベースラインを知り、異常かどうかを把握できるようにしておきたい 大事なメトリクスだが、CPU High それ自身でユーザに影響があるわけではない https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MonitoringOverview.ht ml も参考に 89