見出し画像

【MySQL】最適化全然わからん

この記事の対象者

  • データベースの構築、操作はできるが、MySQLの最適化について網羅的に知りたい人

概要

どんもー、今回はMySQLの最適化についてまとめてくれている論文[1]を読んだんで、紹介されたていた内容を元に記事にまとめました🫡  以下が今回読んだ論文

Šušter, I., & Ranisavljević, T. (2023). Optimization of MySQL database. Journal of Process Management and New Technologies, 11(1-2), 141-151.[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句を繰り返し使わないみたいな話は初めて知ったので読んでよかったー

この記事が気に入ったらサポートをしてみませんか?