【MySQL】最適化全然わからん
この記事の対象者
データベースの構築、操作はできるが、MySQLの最適化について網羅的に知りたい人
概要
どんもー、今回はMySQLの最適化についてまとめてくれている論文[1]を読んだんで、紹介されたていた内容を元に記事にまとめました🫡 以下が今回読んだ論文
最適化の種類について
最適化ちゅーてもいくつか種類があるんやなと読んでて思いました。
以下の3点が最適化アプローチの指針
障害発生にも負けない堅牢さの向上
操作した際の処理時間短縮
データベースの容量削減
障害発生にも負けない堅牢さの向上
堅牢さの向上については以下の項目を紹介していました。
Sharding
replication
master-slave replication
multi-master replication
replication(複製)について
データベースを複製することで障害につよつよ〜
master-slave replicationについて
【メリット】masterサーバーに影響を与えずに多くのデータを読み込める
具体的なやり方は以下の記事が参考になりそー
ストレージエンジンについて
ストレージエンジンの選択は、堅牢性、速度、データ量の削減全てに関わっています。ストレージエンジンは以下2点のことを扱います。
データベースの読み書きを実行するプログラム
データの保存方法なども扱う
MySQLでは以下のストレージエンジンが扱えます
InnoDB
MyISAM
MEMORY
InnoDB
レコードレベルのロックと外部キー制約を扱える。
システム障害が発生しにくい
同時実行されるようなアプリケーションに最適
MyISAM
【メリット】読み取り集中型のアプリケーションは高速
【デメリット】同時に書き込みされるとデータの不整合が発生することがある
自分はInnoDBしか扱っていなかったんですが、使い分けができたらパフォーマンスめっちゃ向上しそーd(^_^o)
MyISAMが向いているデータ
logデータ
読み込みしかされない大容量データ
インターネットTV(ABEMA)などのサービスの動画とかはMyISAMが向いてそう
操作した際の処理時間短縮とデータベースの容量削減
SQLを効率的に書いてデータベースへのアクセスを最小限にします。以下の6点にまとめました🫡
partitioning
indexing
data compression
data clustering
データ型の選択
SQLの最適化
partitioning(パーティショニング)について
スキャンする必要のあるデータ量を絞り込んで最小限にします。
大きなテーブルに有効です!日付、場所、顧客のタイプ(無料アカウント、有料アカウントとか)に割り振ると効果を発揮します!
以下の記事では、partitioningを具体的に扱っています。年や月などで分割することで、検索するレコード数を大幅に削減してます!
indexing(インデックス作成)
スキャンする範囲を最小限にします。
INDEXを多すぎるとINSERT, UPDATEが速度⤵️
INDEXが少なすぎるとSELECTが速度⤵️
インデックスが有効な条件は以下2点が扱える時です!
ハッシュ
Bツリー
data compression (データ圧縮)
レコードに格納するデータ量を削減します。
画像とか動画を圧縮してからレコードに書き込んだりとか
data clustering (データクラスタリング)
リンクされたデータをストレージに集めます。
このストレージをMyISAMとかにしたらよさそー
データ型の選択
以下のように宣言する型などでできる限り容量を最小にできないか考えます🫡
intからtinyintにできないか?
textからvarcharにできないか?
SQLの最適化
以下の5点について紹介していました。
explainで確認しましょう
結合とサブクエリの改善を意識しましょう
in句は使わずにexists句を使いましょう
繰り返しのgroup句は使わないようにしましょう
nullは排除しましょう
まとめ
MyISAMとかin句をexists句に直したり、group句を繰り返し使わないみたいな話は初めて知ったので読んでよかったー