SQL
SQLの普遍的なものについて記載していく。
SQLを手元で試したいとき
docker run --platform linux/amd64 --name mysql-container -e MYSQL_ROOT_PASSWORD=rootpassword -d mysql:5.7
# 20秒ぐらい時間を空ける
docker exec -it mysql-container mysql -uroot -prootpassword
# DB作成
mysql> CREATE DATABASE my_database;
# DB一覧
mysql> SHOW DATABASES;
# 現在どこのDBにuseしているのか
mysql> SELECT DATABASE();
# テーブル一覧コマンド
mysql> SHOW TABLES;
# 以下で mysql> のpromptを変更できる。
mysql> prompt Transaction A>
# テーブル作成コマンド
mysql> create table t1(i1 int not null primary key, v2 varchar(20)) engine = innodb;
# 現在のトランザクションレベルを確認するコマンド
mysql> SELECT @@tx_isolation;
# MySQL 8.0以降では次のコマンドを使用
mysql> SELECT @@transaction_isolation;
# トランザクションを始める
mysql> start transaction;
SQLがオンラインでできる
DML・DCL・DDL
SQLは、いくつかのキーワードと、テーブル名や列名などを組み合わせて1つの文とし、操作の内容を記述する
キーワードは最初から意味や使い方が決められている特別な英単語。
SQL文はDBMSに与える命令の種類により、次の3つに分類される
- DDL(Data Definition Language:データ定義言語)
- DML(Data Manipulation Language:データ操作言語)
- DCL(Data Control Language:データ制御言語)
オンラインDDL(Online Data Definition Language)
オンラインDDL(Online Data Definition Language)とは、データベースのテーブル構造(スキーマ)を変更する際に、テーブルへの読み取りや書き込み操作を継続しながら変更する仕組みのこと。
オンラインDDLができるか確認するコマンド
SHOW VARIABLES LIKE 'innodb_online_alter_log_max_size';
Selectの落とし穴
レコード数が多いテーブルの場合はフルスキャ ンに気をつける
LIKE
などを用いたクエリがあたる。
MySQL
MySQLにおいて、クライアントのコネクションを切断しても、サーバー側で実行中の重いSELECT文が自動的に中断されるわけではない場合があります。この挙動は、とくに大きなデータベース操作において問題となることがあります。そのため、手動でこれらのクエリを停止する方法が必要になります。
MySQLでの実行中のクエリの取り扱い
-
SHOW PROCESSLIST
コマンド:SHOW PROCESSLIST
コマンドを実行すると、現在MySQLサーバー上で実行中のすべてのスレッド(プロセス)のリストを表示します。これには、各クエリの状態(例:Query
、Sleep
)や実行時間も含まれます。
-
プロセスのキル:
- クエリが長時間実行されている場合、そのプロセスIDを使用して、明示的にそのクエリを停止(キル)することが可能。たとえば、プロセスIDが
12
のクエリを停 止したい場合は、次のコマンドを使用します:
KILL 12;
- これは該当するプロセスを強制的に終了させます。これにより、不要なリソースの消費を防ぐことができます。
- クエリが長時間実行されている場合、そのプロセスIDを使用して、明示的にそのクエリを停止(キル)することが可能。たとえば、プロセスIDが
注意点
-
データの整合性:
KILL
コマンドを使用してクエリを中断する場合、トランザクション内での操作であれば、変更はロールバックされデータの整合性が保たれます。ただし、SELECTクエリの場合は通常データの整合性に影響はありません。
-
パフォーマンスモニタリング:
- 定期的に
SHOW PROCESSLIST
コマンドを使用してシステムの状態をチェックし、予期しない長時間実行クエリがないか監視することが重要です。 - サーバーのパフォーマンスに影響を与える可能性のあるクエリを事前に特定し、適切に最適化することも考慮してください。
- 定期的に
以上の手法を用いることで、MySQLデータベースの管理とパフォーマンスの向上に役立ちます。また、これによムダなリソースの消費を避け、システムの応答性を維持すること可能
生クエリ
生クエリとは、SQL文そのままのこと。
アプリケーション層でそのまま記載しているのも生クエリ(ORM不使用)
リレーション 外部キー制約(参照整合性ともいう)
外部キーを設定して参照する側は子テーブル、参照される側は親テーブル
リレーションは単方向と双方向しかない。
一方向で参照されている側は何も知 らないということ。
つまり参照されている側から参照先を知ることは難しくなる。そういう時は双方向にする。
外部キーは、親テーブルに存在しない値の登録をエラーにする 外部キーは、子テーブルに存在する値の削除をエラーにする
親子関係とリレーション
親子関係はリレーションの性質を示すものであり、単方向か双方向かとは直接関係ない。
親モデルと子モデルの関係は、通常は双方向のリレーションで実装されますが、必要に応じて単方向にすることも可能です。
双方向リレーションにおける親子関係 双方向リレーションを持つ場合でも、親子関係は変わりません。親モデルは子モデルのコレクションを持ち、子モデルは親モデルを参照します。この関係性は、データベース内の外部キー制約によって強化されます。
リレーションシップの方向
リレーションシップには、双方向のリレーションシップと単方向のリレーションシップがあります。双方向のリレーションシップを扱う場合、リレーションシップには所有者と被所有者があります。単方向のリレーションシップには所有者だけがあります。リレーションシップの所有者は、データベースのリレーションシップの更新を決定できます。
集約の実装とLazy Loading
集約の実装とLazy Loading
Lazy Loadとは
参照URL
関連をたくさん持った巨大な集約というのは扱いづらいし、双方向の関連は複雑さを生む。 必要最低限かつ、単方向の関連しか持たない集約が望ましい
カスケード
リレーションにおけるオプションのひとつで、依存関係を持った親と子のレコード同士の整合性を保つために、親への操作を子のレコードにも一貫して操作を連動させるような仕組み。