MySQLでFLOAT型を定義

MySQLでFLOAT型を定義

MySQLでFLOAT型を定義する方法について説明します。
FLOAT型は浮動小数点数を扱うために使用され、数値データのうち、小数点を含む値を保存するのに適しています。
MySQLには、FLOATとDOUBLEの2つの浮動小数点型があり、精度に違いがあります。
FLOATは、DOUBLEに比べて精度が低く、主にメモリの節約が必要な場合や、高い精度が不要な場合に使用されます。

FLOAT型の基本的な定義

MySQLでFLOAT型を定義する際は、次のような構文を使います

CREATE TABLE テーブル名 (
  カラム名 FLOAT(精度, スケール)
);

FLOAT型は、(精度, スケール)という形式で指定することができ、精度は全体の桁数、スケールは小数点以下の桁数を表します。
たとえば、FLOAT(7, 3)と定義した場合、最大で7桁の数値を保存でき、そのうち3桁が小数点以下の桁数として扱われます。
このため、値の範囲は-9999.999から9999.999となります。

精度とスケールの指定

FLOAT型の精度とスケールは省略可能であり、省略した場合はMySQLがデフォルトの値を使用します。
FLOAT型を定義する際に、精度やスケールを指定しなければ、MySQLはその型の最大範囲内で値を扱います。

例えば、次のようにFLOAT型を定義できます

CREATE TABLE products (
  price FLOAT(5, 2)
);

この場合、priceカラムには、最大で5桁の数値を保存でき、そのうち2桁が小数点以下の値として保持されます。
具体的には、99.99までの値を保存できるようになります。

浮動小数点数の精度の問題

FLOAT型は精度が限られているため、特定の値を正確に表現できない場合があります。
これは、コンピュータが内部で浮動小数点数を二進数で表現するため、一部の小数点数は近似的にしか保存できません。
そのため、精度が重要な金融計算などでは、FLOAT型の使用を避け、DECIMAL型やNUMERIC型を使用する方が適切です。
DECIMAL型は、固定小数点数として数値を保持し、浮動小数点数のように精度の誤差が生じることを防ぎます。

一方、FLOAT型の利点は、比較的少ないメモリで大きな範囲の数値を扱えることです。
MySQLでは、FLOAT型は通常4バイトを使用し、約7桁の有効桁数を保持します。
DOUBLE型では、より多くのメモリを使用し、15桁程度の有効桁数を保持できるため、精度を優先する場合はDOUBLE型を使用するのが一般的です。

ゼロ埋めや符号付きの値

FLOAT型のカラムには、符号付きまたは符号なしのオプションを指定することができます。
デフォルトでは符号付きであり、正の数と負の数の両方を保存できますが、UNSIGNEDを指定することで正の数のみを扱うこともできます。
以下はその例です

CREATE TABLE scores (
  score FLOAT UNSIGNED
);

この場合、scoreカラムには正の数のみが保存され、負の数は保存できません。

まとめ

MySQLでFLOAT型を使用する場合は、主にメモリ効率を考慮しつつ、精度の問題を理解して選択することが重要です。
FLOAT型は、浮動小数点数を扱うためのデータ型で、(精度, スケール)で表すことができ、特定の精度を持たない近似的な数値を効率的に保存できます。
ただし、精度が重要なケースではFLOAT型は適していないため、その場合はDECIMALやDOUBLEなどのデータ型を検討する必要があります。

MySQLのEXPLAIN(実行計画)の見方

MySQLのEXPLAIN(実行計画)の見方

MySQLのEXPLAINコマンドは、クエリがどのように実行されるかを可視化するために使用されるツールです。
クエリのパフォーマンスを最適化する際に有用で、テーブルのスキャン方法やインデックスの使用状況などを確認できます。
実行計画の見方を理解することで、非効率なクエリを特定し、適切なインデックスの作成やクエリの書き換えなどでパフォーマンスを改善する手助けになります。

EXPLAINの出力にはいくつかのカラムがあり、それぞれが異なる情報を提供します。
以下は主要なカラムとその意味です。

1. id

idカラムは、クエリ内のSELECT文の識別子を示します。
idが同じ行は、同じクエリブロックに属していることを示し、通常は同時に処理されます。
idが異なる場合は、それぞれの部分が別の順番で評価されます。
idが大きいほど、評価される順序が遅くなります。

2. select_type

select_typeは、クエリの種類やサブクエリの位置を示します。
主なタイプには以下があります。

  • SIMPLE: サブクエリやUNIONが含まれないシンプルなSELECT文
  • PRIMARY: クエリの最上位のSELECT文
  • SUBQUERY: サブクエリ
  • DERIVED: 派生テーブルを使っている場合
  • UNION: UNIONを使っている場合の一部

3. table

tableはクエリで参照しているテーブルの名前、または派生テーブルや一時テーブルを示します。

4. type

typeカラムは、テーブルアクセスの方法、つまり、どの程度効率的にデータにアクセスできるかを示します。
主要な値は以下の通りです。

  • ALL: フルテーブルスキャン(最も非効率)
  • index: インデックス全体のスキャン
  • range: インデックスの範囲スキャン
  • ref: インデックスの参照(複数の行を参照)
  • eq_ref: 一致する行が1つだけの場合(最も効率的)
  • const: 定数テーブルとして扱われる場合(効率的)

typeがALLの場合は、テーブル全体をスキャンしているので、インデックスを利用するか、クエリの最適化が必要な可能性があります。
※フルスキャンだから遅いという結論に必ずしもなるわけではないので、注意が必要です。

5. possible_keys

possible_keysカラムは、クエリの実行に使用できる可能性のあるインデックスのリストを表示します。
このフィールドにはインデックスが指定されていない場合はNULLになります。

6. key

keyは、実際に使用されているインデックスを示します。
もしkeyがNULLであれば、インデックスが使用されていないことを意味します。
possible_keysにインデックスが表示されていても、keyがNULLであれば、最適なインデックスが使用されていない可能性があるので、クエリやインデックスの見直しが必要です。

7. key_len

key_lenは、使用されているインデックスの長さ(バイト単位)を示します。
この値が短すぎる場合、インデックスが一部しか使われていないことを意味します。

8. ref

refカラムは、インデックスに基づいて検索されるカラムや定数を示します。
たとえば、constやNULL、または別のテーブルのカラムが表示されることがあります。

9. rows

rowsカラムは、クエリ実行中にMySQLが読み込むと予想している行数を示します。
この値が大きいほど、クエリが多くのデータを処理している可能性があり、パフォーマンスに影響を与えることがあります。

10. Extra

Extraカラムは、クエリの実行に関する追加情報を提供します。
ここには、最適化に関する重要なヒントが表示されることがあります。
よく見られる値は以下の通りです。

  • Using where: WHERE句で条件が適用されていることを示します。
  • Using index: クエリがインデックスだけを使ってデータを取得していることを示します。

これは効率的です。

  • Using temporary: 一時テーブルが使用されていることを示します。

一般的に避けるべきです。

  • Using filesort: ファイルソートが使用されていることを示し、パフォーマンスの低下を引き起こす可能性があります。

実例

次のクエリの例を見てみます。

EXPLAIN SELECT * FROM employees WHERE age > 30;

これに対してのEXPLAINの結果は以下のようになるかもしれません。

id select_type table type possible_keys key key_len ref rows Extra
---- ------------- ----------- ------ --------------- ------ --------- ------ ------ ----------------
1 SIMPLE employees ALL NULL NULL NULL NULL 1000 Using where

この場合、typeがALLであるため、employeesテーブル全体がスキャンされ、インデックスが使用されていないことが分かります。
インデックスが存在しない、またはインデックスを使用していないため、効率が悪い可能性があります。
このような場合、ageカラムに対してインデックスを追加することで、パフォーマンスを改善できる可能性があります。

まとめ

EXPLAINコマンドを使うことで、クエリの実行計画を確認し、どのようにデータにアクセスしているかを把握できます。
各カラムの意味を理解し、クエリやインデックスを適切に最適化することで、MySQLのパフォーマンスを大幅に向上させることができます。

MySQLのEXISTSで効率的なクエリを作成

MySQLのEXISTSの使い方

MySQLのEXISTSは、サブクエリの結果が存在するかどうかを確認するために使用されるSQLの条件式です。
サブクエリが1つ以上の行を返す場合、EXISTSはTRUEを返し、サブクエリが結果を返さない場合はFALSEを返します。
この機能は、大規模なデータベースで条件に一致するレコードが存在するかどうかを効率的に確認するために役立ちます。

基本的なEXISTSの構文は以下の通りです。

SELECT column_name
FROM table_name
WHERE EXISTS (サブクエリ);

サブクエリが結果を返すかどうかによって、メインクエリが実行されるかが決まります。
EXISTSは、サブクエリ自体の結果が重要なのではなく、サブクエリが何らかの結果を持つかどうかだけを確認します。

次に、具体的な使用例を説明します。
例えば、2つのテーブルemployees(従業員テーブル)とdepartments(部署テーブル)があるとします。
それぞれの従業員は部署に所属しており、employeesテーブルにはdepartment_idという列があります。
特定の部署に従業員がいるかどうかを確認する場合、EXISTSを使って次のようにクエリを書くことができます。

SELECT department_name
FROM departments d
WHERE EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.department_id
);

このクエリは、従業員が存在する部署のみをリストアップします。
サブクエリ部分では、employeesテーブルを参照し、departmentsテーブルの各行に対応する従業員がいるかどうかを確認しています。
サブクエリ内のSELECT 1は、サブクエリの結果に実際のデータを返す必要がないため、任意の定数値(この場合は1)を使用していることに注意してください。
サブクエリが1つ以上の行を返す場合、EXISTSはTRUEを返し、対応する部署がメインクエリにリストされます。

次に、NOT EXISTSを使う例を見てみましょう。
これは、指定した条件に一致する行がサブクエリに存在しない場合にTRUEを返します。
例えば、従業員がいない部署を表示したい場合は、以下のようなクエリになります。

SELECT department_name
FROM departments d
WHERE NOT EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.department_id
);

このクエリは、従業員がいない部署をすべてリストアップします。
EXISTSの逆の動作をするため、サブクエリが結果を返さない場合にTRUEを返し、該当する部署がメインクエリの結果に含まれるようになります。

EXISTSは特に、大量のデータを効率的に処理する場合に有用です。
INやJOINと似たような目的で使用されることがありますが、EXISTSはサブクエリの結果が存在するかどうかだけを評価するため、パフォーマンスが向上するケースが多いです。
INは、サブクエリが返す全ての結果をリストとして評価するため、場合によっては非効率になることがあります。

例えば、以下の2つのクエリを比較すると、EXISTSの方が効率的な場合があります。

INを使用したクエリ

SELECT department_name
FROM departments
WHERE department_id IN (
  SELECT department_id
  FROM employees
);

EXISTSを使用したクエリ

SELECT department_name
FROM departments d
WHERE EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.department_id
);

INはサブクエリで返されたすべてのdepartment_idを比較する必要がありますが、EXISTSは1つでも結果が返されれば条件を満たすため、パフォーマンスが改善されることが多いです。

このように、MySQLのEXISTSは特定の条件に基づいてデータの存在を確認するために便利で、効率的なクエリを作成する際に活用されます。
特にサブクエリを使用する場合には、EXISTSとINの使い分けを考慮すると、クエリのパフォーマンスを最適化できる場面が多いです。

MySQLでダンプデータをエクスポートする方法

MySQLでダンプデータをエクスポートする方法

MySQLでデータベースのダンプデータをエクスポートする方法は、mysqldumpというコマンドを使用するのが一般的です。
mysqldumpは、MySQLデータベースのテーブルやスキーマをSQL形式でエクスポートするためのコマンドです。
使い方は様々で、以下にその基本的な使い方とオプションについて説明します。

基本的なmysqldumpコマンド

次のようなコマンドで、データベース全体をエクスポートすることができます。

mysqldump -u ユーザー名 -p データベース名 > エクスポート先のファイル名.sql

このコマンドでは、-uオプションでMySQLに接続するユーザー名を指定し、-pでパスワード入力を求められます。
データベース名にはエクスポートしたいデータベース名を指定し、出力先となる.sqlファイルを右辺にリダイレクトします。

例えば、test_dbというデータベースをbackup.sqlというファイルにエクスポートする場合、次のようにコマンドを実行します。

mysqldump -u root -p test_db > backup.sql

実行すると、パスワードの入力が求められ、正しく認証されるとデータベースのダンプがファイルに出力されます。

特定のテーブルだけをエクスポートする場合

データベース全体ではなく、特定のテーブルだけをエクスポートしたい場合は、以下のようにテーブル名を指定します。

mysqldump -u ユーザー名 -p データベース名 テーブル名1 テーブル名2 > エクスポート先のファイル名.sql

例えば、usersとordersという2つのテーブルをエクスポートしたい場合は、次のようにします。

mysqldump -u root -p test_db users orders > backup.sql

データのみ、またはスキーマのみをエクスポートする

mysqldumpコマンドはデフォルトでテーブル構造とデータの両方をエクスポートしますが、必要に応じてどちらか一方だけをエクスポートすることもできます。

データのみをエクスポート

テーブル構造を含まず、データだけをエクスポートする場合は、--no-create-infoオプションを使用します。

mysqldump -u root -p --no-create-info test_db > data_only.sql
スキーマのみをエクスポート

データを含まず、テーブルの構造(スキーマ)のみをエクスポートする場合は、--no-dataオプションを使用します。

mysqldump -u root -p --no-data test_db > schema_only.sql

圧縮してエクスポートする

ダンプファイルが大きくなる場合、圧縮してエクスポートすることも可能です。
以下のようにしてgzipを使用して圧縮します。

mysqldump -u root -p test_db | gzip > backup.sql.gz

この場合、出力ファイルはgzip形式で圧縮され、backup.sql.gzとして保存されます。
復元時にはgzipで解凍する必要があります。

すべてのデータベースをエクスポートする場合

MySQLのインスタンスに存在するすべてのデータベースをエクスポートする場合は、--all-databasesオプションを使用します。

mysqldump -u root -p --all-databases > all_databases.sql

このコマンドを実行すると、MySQLサーバー内のすべてのデータベースが1つのダンプファイルにエクスポートされます。

特定のデータベース以外を除外する

一部のデータベースだけを除外したい場合は、--ignore-databaseオプションはないため、個別に指定するか、複数のコマンドを組み合わせて処理する必要があります。

エクスポート時の注意点

エクスポートを実行する際には、ユーザーが適切な権限を持っていることを確認してください。
例えば、SELECTやLOCK TABLESの権限が必要になります。
また、大規模なデータベースのエクスポート中にパフォーマンスの影響が発生する可能性があるため、負荷が少ない時間帯に実行することが推奨されます。

まとめ

  • mysqldumpを使用してデータベースのダンプをエクスポートできます。
  • 特定のテーブルやスキーマのみのエクスポートも可能です。
  • 圧縮や全データベースのエクスポートもサポートしています。

これらの手順を使うことで、MySQLのデータを安全にバックアップし、必要に応じて復元することができます。

MySQLでダンプデータをインポートする方法

MySQLでダンプデータをインポートする方法

MySQLでダンプデータをインポートする方法は、バックアップやデータ移行の際に有用です。
MySQLダンプファイル(通常は.sql形式)は、データベースの内容を保存したテキストファイルです。
このファイルをインポートすることにより、以前の状態のデータベースを復元できます。
以下の手順でMySQLのダンプデータをインポートする方法を説明します。

1. 前提条件

  • MySQLサーバーがインストールされ、起動していること。
  • インポートしたいダンプファイル(.sqlファイル)が存在すること。
  • ダンプデータをインポートするためのデータベースがあらかじめ作成されていること(必要に応じてデータベースを作成してください)。

2. データベースの作成

インポートする前に、データベースが作成されていない場合は、まずデータベースを作成します。
MySQLにログインし、以下のコマンドを使用してデータベースを作成できます。

CREATE DATABASE database_name;

database_nameはインポート先のデータベース名です。

3. ダンプデータのインポート手順

a. MySQLコマンドラインでのインポート

MySQLのダンプデータは、mysqlコマンドを使用してインポートできます。
コマンドは以下の形式です。

mysql -u username -p database_name < dump_file.sql
  • username: MySQLのユーザー名。
  • database_name: インポート先のデータベース名。
  • dump_file.sql: ダンプファイルのパス。

実行例:

mysql -u root -p my_database < dumpfile.sql

このコマンドを実行すると、パスワードの入力を求められるので、指定されたMySQLユーザーのパスワードを入力します。

b. MySQL Workbenchでのインポート

GUIツールを使いたい場合は、MySQL Workbenchを使用してダンプファイルをインポートすることも可能です。

1. MySQL Workbenchを開き、接続を選択します。
2. メニューから「データインポート」を選択します。
3. 「インポート元」で「Dump Project Folder」や「Self-Contained File」を選び、ダンプファイルを指定します。
4. 「インポート先」を選び、インポートするデータベースを選択します。
5. 「開始」ボタンを押すと、インポートが開始されます。

c. phpMyAdminでのインポート

ウェブベースの管理ツールであるphpMyAdminでも、ダンプファイルを簡単にインポートできます。

1. phpMyAdminにログインします。
2. インポート先のデータベースを選択します。
3. 「インポート」タブをクリックします。
4. 「ファイルを選択」ボタンを使って、ローカルのダンプファイル(.sql)を選びます。
5. インポート設定を確認し、「実行」ボタンを押します。

4. インポート時の注意点

  • 既存データの上書き:

ダンプファイルには、既存のテーブルを削除するDROP TABLE文が含まれている場合があります。
既存データを上書きしたくない場合は、事前にダンプファイルを確認し、必要に応じて編集することが大切です。

  • エンコーディングの問題:

ダンプファイルをインポートする際に、エンコーディングの不一致が原因で文字化けが発生することがあります。
ダンプファイルのエンコーディングがUTF-8であることを確認し、MySQLの接続設定も同様にUTF-8に設定してください。
MySQLのクライアント接続でエンコーディングを指定するには、以下のようにコマンドを使います。

mysql -u username -p --default-character-set=utf8 database_name < dump_file.sql
  • 大規模なデータ:

ダンプファイルが大きい場合、インポート時にタイムアウトエラーが発生することがあります。
この場合、MySQLの設定(max_allowed_packetやinnodb_buffer_pool_sizeなど)を調整するか、ダンプファイルを分割してインポートする方法を検討してください。

5. エラーが発生した場合の対処法

インポート中にエラーが発生した場合、MySQLのエラーログやコマンドラインに表示されるメッセージを確認してください。
例えば、テーブルがすでに存在している場合は、DROP TABLE文を手動で追加するか、--forceオプションを使用して強制的にインポートを進めることができます。

mysql -u username -p database_name --force < dump_file.sql
    • forceオプションはエラーを無視して処理を続行するため、エラーが軽微な場合に役立ちますが、データの一貫性を失う可能性もあるため、慎重に使用する必要があります。

MySQLのダンプデータをインポートする方法には、コマンドライン、GUIツール、Webツールなどさまざまな方法があります。
用途や環境に応じて最適な方法を選び、正確かつ効率的にインポート作業を行いましょう。

MySQLのDUALの使い方

MySQLのDUALの使い方

MySQLにおけるDUALは、特定の状況で使用される仮想的なテーブルです。
MySQLのクエリで、テーブルを指定しないSELECT文を実行する場合に、FROM句が必須な場合がありますが、そのようなケースでDUALを使用します。
DUALは存在しない特別なテーブルで、どのデータベースにも自動的に含まれており、常に1行1列だけを持つと見なされます。
このため、DUALは、データを実際に取得する必要がないクエリで便利に使われます。

次に、いくつかの例を使ってDUALの使い方を説明します。

基本的な使い方

MySQLでは、例えば定数や計算式などを直接SELECT文で取得することができます。
このとき、実際のテーブルを指定しない場合でも、FROM句が必要になる場合があります。
以下の例を見てください。

SELECT 1 + 1;

このクエリは問題なく実行され、結果として「2」を返します。
この場合、テーブルからデータを取得するわけではないため、FROM句は不要です。
しかし、FROM句が必要なシチュエーションでは、DUALを指定します。

SELECT 1 + 1 FROM DUAL;

このように書くことで、MySQLは特定のテーブルからデータを取得することなく、計算結果のみを返します。
DUALはMySQLによって仮想的なテーブルとして扱われるため、このような用途に適しています。

複雑な例

次に、もう少し複雑な例として、関数を使用する場合を考えます。
例えば、現在の日付と時刻を取得する場合は、以下のようにNOW()関数を使用します。

SELECT NOW() FROM DUAL;

このクエリは、システムの現在の日付と時刻を返します。
DUALを使用することで、実際のテーブルを指定せずにMySQLのシステム情報や定数、関数の結果を取得することができます。

DUALを使用する理由

DUALは、もともとOracleなどのデータベースシステムで使われていた概念で、MySQLでも採用されています。
特に、標準SQLではFROM句が必要な場合があるため、このようなケースに対応するために使用されます。
MySQLの場合、DUALを省略しても問題なくクエリを実行できますが、他のデータベースシステムとの互換性を考慮して使用することが一般的です。

例えば、以下のような計算を行いたいとき、DUALを使うことでクエリがより標準的に見えます。

SELECT 5 * 5 FROM DUAL;

これは「25」という結果を返します。
このような場合、MySQLではDUALを省略しても同じ結果を得ることができますが、明示的にDUALを指定することで、他のRDBMSでも通用するクエリになります。

DUALは省略可能

MySQLでは、他の多くのRDBMSとは異なり、FROM句を省略することが許されています。
したがって、DUALを明示的に指定する必要はありません。
次の2つのクエリはどちらも同じ結果を返します。

SELECT 'Hello, World!';
SELECT 'Hello, World!' FROM DUAL;

どちらのクエリも「Hello, World!」という文字列を返します。
MySQLにおいては、簡潔なクエリを書くためにDUALを省略することがよくあります。

まとめ

MySQLにおけるDUALは、テーブルを指定しないクエリで使用される仮想テーブルです。
定数や関数の結果を取得する際に、標準SQLの文法を守るために使われることが一般的ですが、MySQLではDUALを省略することも可能です。
特に、他のRDBMSとの互換性を考慮して、DUALを使用することが推奨される場合があります。

MySQLをDockerで使用する方法

MySQLをDockerで使用する方法

Dockerはアプリケーションをコンテナとしてパッケージ化し、そのコンテナをどこでも実行できるお馴染みのツールですね。
MySQLのようなデータベースもDockerを使って簡単にセットアップできます。

まず、Dockerがインストールされていることを確認します。
インストールされていない場合は、公式サイトからインストールしてください。

次に、MySQLのDockerイメージを取得します。
以下のコマンドで公式のMySQLイメージをダウンロードできます。

docker pull mysql:latest

このコマンドは、最新バージョンのMySQLをダウンロードします。
latestの代わりに特定のバージョンを指定することもできます。

次に、MySQLコンテナを起動します。
以下のコマンドを使います。

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

このコマンドの各部分についてですが、

  • --name mysql-container: コンテナにmysql-containerという名前を付けます。

この名前は任意ですが、わかりやすい名前を付けると管理がしやすくなります。

  • -e MYSQL_ROOT_PASSWORD=my-secret-pw: 環境変数MYSQL_ROOT_PASSWORDにルートユーザーのパスワードを設定します。

my-secret-pwの部分は、任意のパスワードに置き換えてください。

  • -d: デタッチモードでコンテナを実行します。

つまり、コンテナをバックグラウンドで実行します。

  • mysql:latest: 使用するMySQLのイメージとそのバージョンを指定します。

コンテナが起動したら、MySQLサーバーが稼働しています。
コンテナ内のMySQLにアクセスするには、以下のコマンドを使用します。

docker exec -it mysql-container mysql -u root -p

このコマンドでは、mysql-containerという名前のコンテナ内でMySQLクライアントを起動し、ルートユーザーでログインします。
ログイン時に先ほど設定したパスワードを入力してください。

また、MySQLのデータを永続化するために、ホストマシンのディレクトリをコンテナのデータディレクトリにマウントすることが推奨されます。
以下のようにコマンドを変更することでデータを永続化できます。

docker run --name mysql-container -v /path/to/local/dir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

ここで、/path/to/local/dirはホストマシン上のディレクトリを指定し、/var/lib/mysqlはMySQLのデータディレクトリです。
この設定により、MySQLのデータがホストマシンのディレクトリに保存され、コンテナが停止してもデータが失われません。

MySQLの設定をカスタマイズするには、カスタムの設定ファイルを作成し、それをコンテナにマウントします。
以下のようにします。

docker run --name mysql-container -v /path/to/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

このコマンドでは、/path/to/my.cnfにカスタム設定ファイルを指定し、コンテナの/etc/mysql/my.cnfにマウントします。

最後に、MySQLコンテナを停止する方法についてです。
コンテナを停止するには、以下のコマンドを使用します。

docker stop mysql-container

コンテナを削除する場合は、以下のコマンドを実行します。

docker rm mysql-container

Dockerを使うことで、MySQLを簡単にセットアップし、必要に応じて他のシステムに移行することが容易になります。
また、ホストマシンへの影響を最小限に抑えることができ、開発やテスト環境に適しています。