PHPer が知るべき MySQL クエリチューニング by まみー

PHP Conference Japan 2021
採択
2021/10/02 15:40〜
Track2
Long session (60 mins)
Database Performance

PHPer が知るべき MySQL クエリチューニング

mamy1326 まみー mamy1326

ORM が高性能になり、SQL (クエリ) を意識の外に置くことも増えてきました
おかげでより開発効率も向上し、スピーディ・高品質なコードが書ける率も上がっています

しかし…アラートは突然やってきます
落ちるページ表示速度、上がる DB サーバー の Load Average
そして大量のスロークエリ

もちろん原因はこれだけではありませんが、僕らの日常では、1つのスロークエリが DB サーバーを停止させることも少なくありません
SQL は書き方次第で簡単に障害に繋がります

また、障害発生時、プログラムがどんな SQL を実行しているのか
実装した SQL は速いのか、遅いのか
それがわからないと、障害解析で困る場面も多いです

障害などの緊急事態を回避する以前に、品質の観点でエンジニアには日常的に以下が求められると考えています。

  • スローログ監視
  • スロークエリ解消
  • スロークエリ予防

本セッションは、実例をベースに上記を説明しつつ「現場で使えるスロークエリの倒し方」を持ち帰っていただき、クエリ (SQL) チューニングへの敷居を低くすることが目的です
SQL 見よう!

障害の完全な予測は難しいです
だからこそ打てる手は多く持ち、できれば早めに打っておきたい
その手の1つとして、実際に行っているスロークエリの見方・倒し方・予防方法をお話しします

SQL はチューニングすることで品質の向上が可能です
PHPer であっても、SQL を日頃からチューニングしていきましょう!

スロークエリの見える化

開発当初は快適に動いていても、スロークエリは突然やってきます
では見える化はどうしたら良いのか、を

  • プログラムレベル
  • MySQL サーバーのログ(スローログ)

の 2 パターンで解説します

SQL の分析

スロークエリが見つかった場合に実行する主な内容を、項目別に解説します
普段の実装時・レビュー時にも実行することでパフォーマンス劣化の予防もできます

  • EXPLAIN
  • インデックス
  • インデックス管理

SQL の追求

要求仕様、設計から立ち帰り、そもそもこれ必要なんだっけ?を徹底的に疑ってみることも重要です
では何を追求すれば良いのか?を実例をもとにお話します

改善対応の流れ

まずいスロークエリを見つけ、解決していくまでの流れを、2つの事例から解説します

  • SQL そのものに問題がある場合
  • 複合インデックスで解消できる場合

スロークエリ予防

普段から予防のために実践していることをお話します

  • コード・設計・企画レビュー
  • 勉強会
  • ペアプロ

Discord Channel: #track2-2-mysql-tune