MySQL インタビュー質問と回答

MySQLBeginner
オンラインで実践に進む

はじめに

MySQL の面接で成功するために必要な知識と自信を身につけるための包括的なガイドへようこそ。このドキュメントでは、基本的な概念や高度な SQL テクニックから、アーキテクチャ、パフォーマンスチューニング、セキュリティに至るまで、幅広いトピックを網羅しています。開発者、DBA、DevOps エンジニアのいずれの方でも、あらゆるチャレンジに備えるための貴重な洞察、実践的な演習、シナリオベースの質問を見つけることができるでしょう。さあ、次の MySQL 面接を成功させるための専門知識を身につけましょう!

MYSQL

MySQL の基本概念と SQL の基礎

SQL と MySQL の違いは何ですか?

回答:

SQL(Structured Query Language)は、データベースと通信し、操作するために使用される標準言語です。MySQL は、データ管理に SQL を使用する、人気のあるオープンソースのリレーショナルデータベース管理システム(RDBMS)です。したがって、SQL は言語であり、MySQL はそのデータベースシステムの特定のインプリメンテーションです。


プライマリキーとユニークキーの違いを説明してください。

回答:

プライマリキーは、テーブル内の各レコードを一意に識別し、NULL 値を含めることはできません。テーブルごとにプライマリキーは 1 つしか存在できません。ユニークキーも、列内のすべての値が一意であることを保証しますが、1 つの NULL 値を含めることができます。テーブルには複数のユニークキーが存在する場合があります。


外部キー(Foreign Key)とは何ですか?また、なぜ使用されるのですか?

回答:

外部キーは、あるテーブルの 1 つ以上の列で、別のテーブルのプライマリキーを参照するものです。これにより、2 つのテーブル間にリンクが確立され、参照整合性が強制され、関連データ間の整合性が維持されます。これは、テーブル間のリンクを破壊する操作を防ぐのに役立ちます。


MySQL の CHAR と VARCHAR データ型の違いを説明してください。

回答:

CHAR は固定長文字列データ型で、定義された長さになるまで短い文字列をスペースでパディングします。VARCHAR は可変長文字列データ型で、提供された文字と少量のオーバーヘッドバイトのみを格納します。CHAR は固定長データには高速ですが、VARCHAR は可変長データにはスペースを節約します。


SQL のGROUP BY句の目的は何ですか?

回答:

GROUP BY句は、結果セット内の同一データをグループにまとめるために使用されます。これは、集計関数(COUNT、SUM、AVG、MAX、MIN など)と組み合わせて、各グループに対して計算を実行するためによく使用されます。例:「SELECT department, COUNT(*) FROM employees GROUP BY department;


DELETETRUNCATEDROPコマンドの違いを説明してください。

回答:

DELETEは WHERE 句に基づいてテーブルから行を削除し、DML コマンドであり、ロールバック可能です。TRUNCATEはテーブルからすべての行を削除し、DDL コマンドであり、DELETE よりも高速で、ロールバックできません。DROPはデータベースからテーブル全体(構造とデータ)を削除し、DDL コマンドであり、ロールバックできません。


SQL の JOIN とは何ですか?一般的なタイプをいくつか挙げ、簡単に説明してください。

回答:

SQL の JOIN は、2 つ以上のテーブル間で関連する列に基づいて行を結合するために使用されます。一般的なタイプには、INNER JOIN(一致する行を返します)、LEFT JOIN(左テーブルのすべての行と右テーブルの一致する行を返します)、RIGHT JOIN(右テーブルのすべての行と左テーブルの一致する行を返します)、FULL OUTER JOIN(どちらかのテーブルに一致があるすべての行を返します。MySQL では直接サポートされていませんが、シミュレートされます)があります。


MySQL のインデックスとは何ですか?また、なぜ重要なのでしょうか?

回答:

インデックスは、データベース検索エンジンがデータ取得操作を高速化するために使用できる特別なルックアップテーブルです。本の索引のようなものです。インデックスはSELECTクエリのパフォーマンスを向上させますが、インデックスも更新する必要があるため、INSERTUPDATEDELETE操作を遅くする可能性があります。


MySQL で既存のテーブルに新しい列を追加するにはどうすればよいですか?

回答:

ALTER TABLEステートメントとADD COLUMN句を使用します。例えば、「users」という名前のテーブルに VARCHAR(255) 型の「email」列を追加する場合、コマンドは次のようになります:「ALTER TABLE users ADD COLUMN email VARCHAR(255);


WHERE句の目的は何ですか?

回答:

WHERE句は、指定された条件に基づいてレコードをフィルタリングするために使用されます。指定された基準を満たすレコードのみを抽出します。SELECTUPDATEDELETEステートメントで使用して、特定の行を対象にすることができます。例:「SELECT * FROM products WHERE price > 100;


高度な SQL とクエリ最適化

MySQL におけるDELETETRUNCATEDROPステートメントの違いを説明してください。

回答:

DELETEは行を一つずつ削除し、各削除をログに記録し、ロールバック可能です。TRUNCATEはデータページを解放することで全ての行を削除し、より高速でロールバックできません。DROPはテーブル構造とデータ全体を削除し、これもロールバックできません。


MySQL におけるインデックスとは何ですか?また、どのようにクエリパフォーマンスを向上させるのですか?インデックスが有害になる可能性はありますか?

回答:

インデックスは、データベーステーブルに対するデータ取得操作の速度を向上させるデータ構造です。1 つ以上の列の値に基づいて行への高速なルックアップアクセスを提供することで機能します。インデックスは更新する必要があるためINSERTUPDATEDELETE操作中に有害になる可能性があり、ディスクスペースも消費します。


MySQL におけるEXPLAINの目的を説明してください。クエリ最適化のためにどのような主要情報を提供しますか?

回答:

EXPLAINは、MySQL がクエリをどのように実行するかを分析するために使用されます。結合のtype、使用されるpossible_keyskey、スキャンされるrows、およびextra情報などの情報を提供し、ボトルネックを特定しクエリパフォーマンスを最適化するのに役立ちます。


カバリングインデックス(Covering Index)とは何ですか?また、なぜクエリパフォーマンスに有益なのですか?

回答:

カバリングインデックスとは、クエリに必要なすべての列を含むインデックスのことです。これにより、MySQL は実際のテーブル行にアクセスすることなく、インデックスから必要なすべてのデータを直接取得できます。これはディスク I/O を大幅に削減し、クエリ速度を向上させます。


サブクエリの概念を説明してください。相関サブクエリと非相関サブクエリのどちらを使用すべきですか?

回答:

サブクエリは、別の SQL クエリ内にネストされたクエリです。非相関サブクエリは独立して実行され、その結果は外部クエリによって使用されます。相関サブクエリは値のために外部クエリに依存し、外部クエリによって処理される各行に対して一度実行され、行ごとの処理や存在チェックによく使用されます。


MySQL でクエリが遅くなる一般的な原因は何ですか?また、それらをトラブルシューティングするにはどのようにアプローチしますか?

回答:

一般的な原因には、インデックスの欠落または非効率性、クエリ設計の不備(例:SELECT *、インデックスが設定されていない列に対するOR句、LIKE %value)、大規模なテーブルスキャン、高い競合などが含まれます。トラブルシューティングには、EXPLAINの使用、スロークエリログの分析、サーバーステータス変数の確認、スキーマ/インデックスの最適化が含まれます。


UNIONUNION ALLを使用する場合、いつ考慮すべきですか?パフォーマンスへの影響は何ですか?

回答:

UNIONは、2 つ以上のSELECTステートメントの結果セットを結合し、重複行を削除します。これにはソートと重複排除が含まれます。UNION ALLは、重複を削除せずに結果セットを結合します。UNION ALLは、ソートと重複排除のオーバーヘッドを回避するため、一般的にUNIONよりも高速です。


ストアドプロシージャとは何ですか?その利点と欠点は何ですか?

回答:

ストアドプロシージャは、データベースに格納され、その名前を呼び出すことで実行できる SQL ステートメントのセットです。利点には、パフォーマンスの向上(事前コンパイル)、ネットワークトラフィックの削減、セキュリティの強化が含まれます。欠点には、デバッグの複雑さ、異なる DBMS 間での移植性の問題、データベースサーバー負荷の増加が含まれます。


LEFT JOINRIGHT JOININNER JOINの違いを説明してください。

回答:

INNER JOINは、両方のテーブルに一致する値を持つ行のみを返します。LEFT JOINは、左テーブルのすべての行と、右テーブルの一致する行(一致しない場合は NULL)を返します。RIGHT JOINは、右テーブルのすべての行と、左テーブルの一致する行(一致しない場合は NULL)を返します。


MySQL で大規模データセットのページネーションを効率的に処理するにはどうすればよいですか?

回答:

効率的なページネーションは、通常LIMITOFFSETを使用します。非常に大きなオフセットの場合、MySQL はスキップされた行をスキャンするため、OFFSETは遅くなる可能性があります。大規模データセットに対するより効率的な方法は、前のページの最後の ID を使用したWHERE句と、ORDER BYおよびLIMITを組み合わせることです。


GROUP BYHAVING句の目的は何ですか?どのように異なりますか?

回答:

GROUP BYは、指定された列で同じ値を持つ行を要約行にグループ化し、集計関数と組み合わせて使用されることがよくあります。HAVINGは、GROUP BY句の結果をフィルタリングするために使用され、集計値に条件を適用します。WHEREはグループ化のに個々の行をフィルタリングしますが、HAVINGはグループ化のにグループをフィルタリングします。


MySQL のアーキテクチャと管理

MySQL における InnoDB と MyISAM ストレージエンジンの違いを説明してください。

回答:

InnoDB はトランザクション(ACID 準拠)、行レベルロック、外部キーをサポートしており、OLTP アプリケーションに適しています。MyISAM は古く、テーブルレベルロックをサポートしており、トランザクション整合性の要件がない読み取り負荷の高いワークロードに対してはより高速です。


MySQL のbinlog(バイナリログ)の目的は何ですか?

回答:

バイナリログは、データや構造を変更するすべてのデータ変更(DDL および DML ステートメント)を記録します。これは、ポイントインタイムリカバリ、データレプリケーション(マスター-スレーブ)、およびデータベースに加えられた変更の監査に不可欠です。


MySQL データベースのフルバックアップを実行するにはどうすればよいですか?

回答:

一般的な方法としては、論理バックアップにmysqldumpを使用します:mysqldump -u user -p database_name > backup.sql。物理バックアップ、特に InnoDB の場合、一貫性のあるバックアップのために Percona XtraBackup や LVM スナップショットなどのツールが使用されます。


レプリケーションにおける MySQL のrelay logの役割を説明してください。

回答:

リレーログは、MySQL レプリケーションのスレーブサーバーによって使用されます。これは、マスターのバイナリログから受信したイベントを、スレーブのデータベースに適用される前に格納します。これにより、スレーブの SQL スレッドはイベントを非同期に適用できます。


innodb_buffer_pool_sizeパラメータの目的を説明してください。

回答:

innodb_buffer_pool_sizeパラメータは、InnoDB がデータとインデックスをキャッシュするメモリ領域のサイズを定義します。バッファプールが大きいほどディスク I/O が削減され、頻繁にアクセスされるデータをメモリ内に保持することで、読み取り負荷の高いワークロードのパフォーマンスが大幅に向上します。


MySQL レプリケーションのステータスを確認するにはどうすればよいですか?

回答:

スレーブ上のレプリケーションステータスは、SHOW SLAVE STATUS\G;を使用して確認できます。このコマンドは、Slave_IO_RunningSlave_SQL_RunningLast_IO_ErrorLast_SQL_ErrorSeconds_Behind_Masterなどの詳細を提供します。


MySQL における論理バックアップと物理バックアップの違いを説明してください。

回答:

論理バックアップ(例:mysqldump)は、データを SQL ステートメントとしてエクスポートするため、ポータブルですが、大規模データベースでは遅くなります。物理バックアップ(例:Percona XtraBackup)は、生のデータファイルをコピーし、特に大規模データセットに対して高速なバックアップ/リストアを提供しますが、ポータビリティは低いです。


データベーストランザクションのコンテキストにおけるACIDプロパティの概念を説明してください。

回答:

ACID は、原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、永続性(Durability)の頭文字です。原子性は、すべて実行されるか、何も実行されないことを保証します。一貫性は、有効な状態を保証します。独立性は、同時実行トランザクションが干渉しないことを保証します。永続性は、コミットされた変更がシステム障害後も永続することを保証します。


MySQL の root パスワードを忘れた場合、どのようにリセットしますか?

回答:

一般的なプロセスは、MySQL サーバーを停止し、セーフモード(--skip-grant-tables)で起動し、パスワードなしで root として接続し、mysql.userテーブルを更新し、権限をフラッシュしてから、サーバーを通常通り再起動することです。


MySQL 設定におけるmax_connectionsの重要性は何ですか?

回答:

max_connectionsは、MySQL サーバーへの同時クライアント接続の最大数を設定します。低すぎると「Too many connections」エラーが発生する可能性があり、高すぎるとサーバーリソースを使い果たしパフォーマンスが低下する可能性があります。


パフォーマンスチューニングとベストプラクティス

MySQL データベースのパフォーマンスボトルネックを特定するために、どのような主要なステップを踏みますか?

回答:

まずスロークエリログを確認して、実行時間の長いクエリを特定します。次に、EXPLAINを使用してクエリ実行計画を分析し、インデックスの欠落や非効率な結合を特定します。SHOW PROCESSLISTMySQL Enterprise Monitor(または類似ツール)などの監視ツールは、アクティブな接続とリソース使用率に関するリアルタイムの洞察を得るために不可欠です。


MySQL パフォーマンスにおけるインデックスの重要性を説明してください。インデックスを避けるべきなのはいつですか?

回答:

インデックスは、MySQL がテーブル全体をスキャンすることなく行を迅速に見つけられるようにすることで、データ取得操作を大幅に高速化します。これらはWHEREORDER BYGROUP BY、およびJOIN句に不可欠です。ただし、カーディナリティが非常に低い列、頻繁に更新される列(インデックスは書き込みにオーバーヘッドを追加するため)、または過度に幅の広い列にはインデックスを付けることを避けてください。


EXPLAINステートメントはクエリ最適化にどのように役立ちますか?

回答:

EXPLAINは、MySQL がSELECTステートメントをどのように実行するかについての詳細情報を提供します。これには、テーブル結合の順序、結合の種類、インデックスの使用状況などが含まれます。フルテーブルスキャン、非効率なインデックスの使用、およびクエリパフォーマンスを向上させるためのインデックスの追加または変更の機会を特定するのに役立ちます。


MySQL のスロークエリログの目的は何ですか?また、どのように設定しますか?

回答:

スロークエリログは、指定されたlong_query_timeよりも実行に時間がかかる SQL クエリを記録し、パフォーマンスのボトルネックを特定するのに役立ちます。これは、my.cnfslow_query_log = 1long_query_time = N(N は秒数)を設定し、slow_query_log_fileを指定することで有効化および設定できます。


パフォーマンスの観点から、InnoDBMyISAMストレージエンジンの違いを説明してください。

回答:

InnoDBはトランザクション、行レベルロック、外部キーをサポートしており、データ整合性を必要とする高同時実行性、書き込み負荷の高いアプリケーションに適しています。MyISAMはテーブルレベルロックを使用し、トランザクションのない読み取り負荷の高いワークロードに対しては高速ですが、クラッシュリカバリや参照整合性が欠けています。


MySQL でJOIN操作を最適化するにはどうすればよいですか?

回答:

両方のテーブルでJOIN条件に使用される列にインデックスが付けられていることを確認して、JOIN操作を最適化します。適切なJOINタイプを使用します(可能な場合はINNER JOINなど)。JOINの順序が効率的であることを確認します。これはEXPLAINで特定できます。適切なインデックスなしで大規模なテーブルを結合することは避けてください。


パフォーマンスを最適化するために、データベーススキーマを設計するためのベストプラクティスをいくつか教えてください。

回答:

データの冗長性を減らすために正規化しますが、必要に応じてパフォーマンスのために戦略的に非正規化します。適切なデータ型を選択します(ID にはVARCHARよりもINTなど)。可能な場合はNOT NULLを使用します。効果的な主キーと外部キーを設計し、一般的なクエリパターンを考慮して、最初からインデックス作成を計画します。


コネクションプーリングの概念とその MySQL パフォーマンスに対するメリットを説明してください。

回答:

コネクションプーリングは、新しい接続を確立するたびに新しい接続を開くのではなく、既存のデータベース接続を再利用します。これにより、接続の確立とクエリのオーバーヘッドが削減され、クライアントとサーバーの両方で CPU とメモリリソースが節約されます。特に高負荷時において、アプリケーションの応答性とスケーラビリティを向上させます。


パフォーマンスを維持するために、MySQL で大規模データセットをどのように扱いますか?

回答:

大規模データセットの場合、適切なインデックスを使用し、EXPLAINでクエリを最適化し、テーブルをパーティショニングしてデータを複数のファイルまたはディスクに分散することを検討します。頻繁にアクセスされるデータには、キャッシングメカニズム(例:Memcached、Redis)を実装します。古いデータをアーカイブし、レポート用にサマリーテーブルを使用して、プライマリテーブルへのクエリ負荷を軽減します。


MySQL のクエリキャッシュとは何ですか?また、なぜ新しいバージョンでは無効になっていることが多いのですか?

回答:

MySQL クエリキャッシュは、SELECTクエリの結果セットを格納し、同一のクエリが再度実行された場合に直接返します。読み取りを高速化できますが、テーブルの変更があればキャッシュされた結果が無効になるため、特に書き込み負荷の高いシステムでは、高い競合とオーバーヘッドが発生します。これらのスケーラビリティの問題により、非推奨となり、MySQL 8.0 では削除されました。


トラブルシューティングとデバッグ MySQL

遅い MySQL クエリのトラブルシューティングは、通常どのように開始しますか?

回答:

まずスロークエリログを有効にして、問題のあるクエリを特定します。次に、特定したクエリに対してEXPLAINを使用し、その実行計画を理解し、インデックスの欠落や非効率な結合を探します。


EXPLAINステートメントの目的は何ですか?また、どのような主要な情報を提供しますか?

回答:

EXPLAINステートメントは、MySQL がSELECTステートメントをどのように実行するかを示します。結合タイプ、可能なキー、使用されたキー、検査された行数、および追加情報などの情報を提供し、これらはクエリパフォーマンスの最適化に不可欠です。


MySQL サーバーで CPU 使用率が高い状態が発生しています。問題診断のための最初のステップは何ですか?

回答:

アクティブなクエリとその状態を確認するためにSHOW PROCESSLISTを確認します。また、デッドロックや高い競合などの InnoDB 固有の問題については、SHOW ENGINE INNODB STATUSを確認します。tophtopなどのシステムツールは、mysqldプロセスによる高い CPU 使用率を確認します。


MySQL で「Too many connections」エラーをどのように診断しますか?

回答:

このエラーは、max_connectionsの上限に達したことを示します。ピークを確認するためにSHOW STATUS LIKE 'Max_used_connections'を確認します。解決策としては、max_connectionsを増やす(リソースが許せば)か、アイドル状態の接続を特定して終了させることが含まれます。


トラブルシューティングのために MySQL のエラーログをどのように使用するか説明してください。

回答:

エラーログ(log_error変数)は、サーバーの起動/シャットダウン、非致命的なエラー、警告などの重要なイベントを記録します。潜在的なシステムまたは設定の問題を示唆する可能性のある異常なエントリ、警告、またはエラーがないか定期的に確認します。


MySQL でのデッドロックの一般的な原因は何ですか?また、どのように特定できますか?

回答:

デッドロックは通常、2 つ以上のトランザクションがお互いが保持しているロックを待機している場合に発生します。これらは高同時実行環境で一般的です。SHOW ENGINE INNODB STATUSの出力、特にLATEST DETECTED DEADLOCKセクションを確認することで特定できます。


MySQL サーバーの現在のステータスと変数をどのように確認できますか?

回答:

実行時ステータス情報(例:接続数、クエリ数、稼働時間)を表示するにはSHOW STATUS;を使用し、システム設定変数(例:innodb_buffer_pool_sizemax_connections)を表示するにはSHOW VARIABLES;を使用します。これらのコマンドは、サーバーの健全性と設定の概要を迅速に提供します。


特定のクエリのパフォーマンスが低下していますが、EXPLAINでは正しいインデックスが使用されていることが示されています。他にどのような問題が考えられますか?

回答:

正しいインデックスが使用されている場合でも、インデックスのカーディナリティが低すぎる、テーブル内のデータが多すぎて多数の行がスキャンされる、またはクエリがインデックス付き列に対して複雑な計算や関数を含むなどの問題が遅延の原因となる可能性があります。ネットワーク遅延やディスク I/O も要因となる可能性があります。


パフォーマンスチューニングとトラブルシューティングにおけるinnodb_buffer_pool_sizeの重要性は何ですか?

回答:

innodb_buffer_pool_sizeは、InnoDB のデータとインデックスのキャッシュであるため、非常に重要です。小さすぎると、MySQL は頻繁にディスクから読み取るようになり、高い I/O と遅いパフォーマンスにつながります。バッファプールのヒット率を監視することで、その有効性を判断できます。


MySQL サーバーが応答しない、またはクラッシュした場合、どのように対処しますか?

回答:

まず、クラッシュの詳細を確認するためにシステムログ(syslogdmesg)と MySQL のエラーログを確認します。応答しない場合は、正常な再起動を試みます。それが失敗した場合は、強制再起動が必要になる可能性があり、その後mysqlcheckを使用してデータ破損がないか確認します。


Scenario-Based and Problem-Solving Questions

You have a users table with id, name, and last_login_at columns. How would you find the top 5 users who have not logged in for the longest time?

Answer:

You would order the users by last_login_at in ascending order (oldest first) and then limit the result to 5. SELECT id, name, last_login_at FROM users ORDER BY last_login_at ASC LIMIT 5;


A query involving a large orders table with order_date and customer_id columns is performing slowly when filtering by date range. What steps would you take to diagnose and resolve this?

Answer:

First, use EXPLAIN to analyze the query plan. If no index exists on order_date, create one: CREATE INDEX idx_order_date ON orders (order_date);. Also, ensure statistics are up-to-date. Consider partitioning if the table is extremely large.


You need to update a million rows in a table. What precautions would you take to avoid locking issues or performance degradation during the update?

Answer:

Perform the update in batches using LIMIT and OFFSET or a WHERE clause on an indexed column. Wrap each batch in a transaction. Consider running during off-peak hours and monitoring server performance.


Describe a scenario where you would use a LEFT JOIN instead of an INNER JOIN.

Answer:

Use LEFT JOIN when you want to return all rows from the left table, even if there are no matching rows in the right table. For example, listing all customers and their orders, including customers who have placed no orders.


How would you handle a situation where a unique constraint violation occurs during an INSERT operation, but you want to update the existing row instead?

Answer:

Use INSERT ... ON DUPLICATE KEY UPDATE. This statement attempts the insert, and if a duplicate key is found, it executes the specified update clause instead. INSERT INTO users (id, name) VALUES (1, 'Alice') ON DUPLICATE KEY UPDATE name = 'Alice';


You have a table products with product_id and price. How would you find the second highest price without using LIMIT with OFFSET?

Answer:

You can use a subquery: SELECT MAX(price) FROM products WHERE price < (SELECT MAX(price) FROM products); This finds the maximum price that is less than the overall maximum price.


A database server is experiencing high CPU usage. What are the first few things you would check in MySQL to identify the cause?

Answer:

Check SHOW PROCESSLIST to see active queries and their states. Examine the slow query log for long-running queries. Review SHOW ENGINE INNODB STATUS for locking information and buffer pool activity. Monitor SHOW GLOBAL STATUS for key performance indicators.


You need to migrate data from an old table old_data to a new table new_data with a slightly different schema. How would you approach this, ensuring data integrity?

Answer:

First, create the new_data table with the correct schema and constraints. Then, use INSERT INTO new_data SELECT ... FROM old_data; to transfer data, handling any necessary data type conversions or transformations. Validate data counts and sample rows after migration.


Explain the difference between DELETE and TRUNCATE and when you would use each.

Answer:

DELETE is a DML command that removes rows one by one, logs each deletion, and can be rolled back. TRUNCATE is a DDL command that quickly removes all rows by deallocating data pages, resets auto-increment, and cannot be rolled back. Use DELETE for selective row removal or when rollback is needed; use TRUNCATE for fast, complete table emptying.


How would you design a database schema to store hierarchical data, like categories and subcategories, in MySQL?

Answer:

A common approach is the Adjacency List model, where each row has a parent_id column referencing its parent's ID. For better performance on deep hierarchies, consider Materialized Path or Nested Set models, though they are more complex to maintain.


シナリオベースおよび問題解決型の質問

idnamelast_login_at カラムを持つ users テーブルがあります。最も長くログインしていない上位 5 人のユーザーを見つけるにはどうすればよいですか?

回答:

last_login_at でユーザーを昇順(最も古い順)に並べ替え、結果を 5 件に制限します。SELECT id, name, last_login_at FROM users ORDER BY last_login_at ASC LIMIT 5;


order_date および customer_id カラムを持つ大規模な orders テーブルを含むクエリが、日付範囲でのフィルタリング時にパフォーマンスが低下しています。診断および解決のためにどのような手順を踏みますか?

回答:

まず、EXPLAIN を使用してクエリプランを分析します。order_date にインデックスが存在しない場合は、CREATE INDEX idx_order_date ON orders (order_date); を作成します。また、統計情報が最新であることを確認します。テーブルが非常に大きい場合は、パーティショニングを検討してください。


テーブルの 100 万行を更新する必要があります。更新中にロックの問題やパフォーマンスの低下を回避するために、どのような予防措置を講じますか?

回答:

LIMIT および OFFSET またはインデックス付きカラムの WHERE 句を使用して、バッチで更新を実行します。各バッチをトランザクションでラップします。オフピーク時間中に実行することを検討し、サーバーのパフォーマンスを監視します。


INNER JOIN の代わりに LEFT JOIN を使用するシナリオを説明してください。

回答:

右テーブルに対応する行がない場合でも、左テーブルのすべての行を返したい場合は LEFT JOIN を使用します。たとえば、注文をしていない顧客を含め、すべての顧客とその注文をリストアップする場合です。


INSERT 操作中に一意制約違反が発生したが、既存の行を更新したい場合はどのように処理しますか?

回答:

INSERT ... ON DUPLICATE KEY UPDATE を使用します。このステートメントは挿入を試行し、重複キーが見つかった場合は、指定された更新句を代わりに実行します。INSERT INTO users (id, name) VALUES (1, 'Alice') ON DUPLICATE KEY UPDATE name = 'Alice';


product_idprice を持つ products テーブルがあります。LIMITOFFSET を使用せずに 2 番目に高い価格を見つけるにはどうすればよいですか?

回答:

サブクエリを使用できます。SELECT MAX(price) FROM products WHERE price < (SELECT MAX(price) FROM products); これは、全体的な最大価格よりも小さい最大価格を見つけます。


データベースサーバーで CPU 使用率が高くなっています。MySQL で原因を特定するために最初に確認する項目は何ですか?

回答:

アクティブなクエリとその状態を確認するために SHOW PROCESSLIST を確認します。長時間実行されているクエリについては、スロークエリログを調べます。ロック情報とバッファプールのアクティビティについては SHOW ENGINE INNODB STATUS を確認します。主要なパフォーマンス指標については SHOW GLOBAL STATUS を監視します。


古いテーブル old_data から、スキーマがわずかに異なる新しいテーブル new_data にデータを移行する必要があります。データ整合性を確保しながら、どのようにアプローチしますか?

回答:

まず、正しいスキーマと制約を持つ new_data テーブルを作成します。次に、INSERT INTO new_data SELECT ... FROM old_data; を使用してデータを転送し、必要なデータ型変換または変換を処理します。移行後にデータ数とサンプル行を検証します。


DELETETRUNCATE の違いと、それぞれを使用するタイミングを説明してください。

回答:

DELETE は行を 1 つずつ削除し、各削除をログに記録し、ロールバックできる DML コマンドです。TRUNCATE はデータページを解放してすべての行を迅速に削除する DDL コマンドであり、自動インクリメントをリセットし、ロールバックできません。選択的な行の削除やロールバックが必要な場合は DELETE を使用します。テーブルの高速かつ完全な空にする場合は TRUNCATE を使用します。


MySQL で階層データ(カテゴリやサブカテゴリなど)を格納するために、データベーススキーマをどのように設計しますか?

回答:

一般的なアプローチは隣接リストモデルであり、各行は親の ID を参照する parent_id カラムを持ちます。深い階層でのパフォーマンス向上のために、マテリアライズドパスまたはネストセットモデルを検討してください。ただし、これらはメンテナンスがより複雑です。


セキュリティと高可用性

MySQL ユーザーアカウントを保護し、不正アクセスを防ぐにはどうすればよいですか?

回答:

強力なパスワードポリシーを実装し、最小権限の原則に従って GRANT ステートメントを使用し、デフォルトユーザーを削除し、ユーザーのホストアクセスを制限します。ユーザー権限を定期的にレビューし、不要なアクセスを失効させます。


MySQL の GRANT および REVOKE ステートメントの目的を説明してください。

回答:

GRANT は、データベース、テーブル、またはカラムに対する特定の権限(例:SELECT、INSERT、UPDATE)をユーザーに割り当てるために使用されます。REVOKE は、以前に付与されたそれらの権限をユーザーから削除するために使用されます。これにより、ユーザーが実行できるアクションが制御されます。


MySQL セキュリティにおける SSL/TLS の役割と、その有効化方法を教えてください。

回答:

SSL/TLS は、MySQL クライアントとサーバー間の通信を暗号化し、盗聴や中間者攻撃を防ぎます。これは、サーバー(my.cnfssl_cassl_certssl_key)で SSL 証明書とキーを構成し、クライアントからの SSL 接続を要求することによって有効化されます。


MySQL レプリケーションの概念とその主な利点を説明してください。

回答:

MySQL レプリケーションは、1 つの MySQL サーバー(マスター)から 1 つ以上の他の MySQL サーバー(スレーブ)に変更をコピーするプロセスです。主な利点は、高可用性(フェイルオーバー)、読み取りスケーラビリティ(読み取りクエリの分散)、およびデータバックアップ/災害復旧です。


MySQL レプリケーションの異なるタイプと、それぞれを使用するタイミングを教えてください。

回答:

主なタイプは、非同期(デフォルト、マスターはスレーブの確認を待たない、パフォーマンスに優れる)と半同期(マスターは少なくとも 1 つのスレーブがイベントの受信を確認するのを待つ、データの一貫性が向上する)です。グループレプリケーションは、強力な一貫性を持つマルチマスター更新機能を提供します。


MySQL グループレプリケーションは、従来のマスター・スレーブレプリケーションとどのように異なりますか?

回答:

グループレプリケーションは、Paxos ライクな分散合意アルゴリズムに基づいたマルチマスター更新ソリューションです。従来のマスター・スレーブとは異なり、組み込みの耐障害性、自動フェイルオーバー、および強力な一貫性(グループ全体でのアトミックな書き込み)を提供します。従来のマスター・スレーブは通常シングルマスターであり、結果的に一貫性があります。


MySQL Binlog の目的と、レプリケーションおよびリカバリにおけるその重要性を説明してください。

回答:

Binlog(バイナリログ)は、データベースに加えられたすべてのデータ変更ステートメントと変更を記録します。スレーブはマスターの binlog からイベントを読み取って適用するため、レプリケーションにとって不可欠です。また、特定のイベントまでのデータを復元できるため、ポイントインタイムリカバリにも不可欠です。


MySQL で高可用性を実現するための一般的な戦略は何ですか?

回答:

一般的な戦略には、MySQL レプリケーション(例:マスター・スレーブまたはグループレプリケーション)と、Orchestrator、MHA、または ProxySQL のような高可用性マネージャーを組み合わせることが含まれます。これらのツールはクラスターを監視し、障害を検出し、正常なレプリカへのフェイルオーバーを自動化して、ダウンタイムを最小限に抑えます。


従来の MySQL マスター・スレーブレプリケーション設定でマスター障害をどのように処理しますか?

回答:

従来のセットアップでは、スレーブを手動で昇格させて新しいマスターにします。これには、選択したスレーブでのレプリケーションの停止、RESET MASTER の実行、および他のスレーブを新しいマスターからレプリケートするように再構成することが含まれます。MHA や Orchestrator のような自動化ツールは、このプロセスを簡素化します。


MySQL サーバーを保護する上でファイアウォールの役割は何ですか?

回答:

ファイアウォールは MySQL サーバーへのネットワークアクセスを制限し、信頼できる IP アドレスと特定のポート(デフォルトは 3306)からの接続のみを許可します。これにより、不正な外部アクセスを防ぎ、攻撃対象領域を削減し、最初の防御線として機能します。


セキュリティ侵害や異常なアクティビティのために MySQL をどのように監視しますか?

回答:

MySQL のエラーログ、一般クエリログ(監査のために有効化されている場合)、およびスロークエリログを定期的にレビューします。監査プラグイン(例:MySQL Enterprise Audit)を実装して、ユーザーのアクションを追跡します。外部監視ツールを使用して、異常な接続パターンや権限の変更を検出します。


実践的な演習

'employees' テーブル('id' および 'salary' カラムを持つ)から 2 番目に高い給与を見つける SQL クエリを記述してください。

回答:

SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees);


MySQL における DELETETRUNCATE、および DROP ステートメントの違いを説明してください。

回答:

DELETE は行を削除し、ロールバック可能で、トリガーを発火させます。TRUNCATE はすべての行を削除し、ロールバックできず、自動インクリメントをリセットします。DROP はテーブル構造全体とデータを永続的に削除します。


大規模テーブルでパフォーマンスが低下しているクエリをどのように最適化しますか?

回答:

まず EXPLAIN を使用してクエリを分析し、ボトルネックを特定します。次に、適切なインデックスの追加、WHERE 句の最適化、SELECT * の回避、必要に応じて正規化の解除を検討します。


少なくとも他の従業員と同じ給与を持つ従業員の名前を取得する SQL クエリを記述してください。

回答:

SELECT name, salary FROM employees GROUP BY salary HAVING COUNT(*) > 1;


INNER JOIN の代わりに LEFT JOIN を使用するシナリオを説明してください。

回答:

左テーブルのすべてのレコードと、右テーブルの一致するレコードを取得したい場合に LEFT JOIN を使用します。右テーブルに一致がない場合、右テーブルのカラムは NULL になります。例えば、注文がない顧客も含めて、すべての顧客とその注文をリストアップする場合です。


テーブル内の重複レコードをどのように処理しますか?

回答:

重複を見つけるには:SELECT column1, COUNT(*) FROM table_name GROUP BY column1 HAVING COUNT(*) > 1;。それらを削除するには、サブクエリまたは JOIN を使用した DELETE ステートメントで 1 つのインスタンスのみを特定して削除するか、一意の値を持つ新しいテーブルを作成してから元のテーブルを置き換える場合があります。


各部署の従業員数を見つける SQL クエリを記述してください。

回答:

SELECT department_id, COUNT(employee_id) AS num_employees FROM employees GROUP BY department_id;


主キーとは何ですか?また、その特性は何ですか?

回答:

主キーは、テーブル内の各レコードを一意に識別します。一意の値を含み、NULL 値を含めることはできず、テーブルには 1 つの主キーしか持てません。インデックス作成やリレーションシップの確立によく使用されます。


'users' テーブルの 'email' カラムにインデックスを作成するにはどうすればよいですか?

回答:

CREATE INDEX idx_email ON users (email); これにより、email カラムでフィルタリングまたはソートするクエリが高速化されます。


データベーストランザクションのコンテキストにおける ACID プロパティの概念を説明してください。

回答:

ACID は、原子性(すべてまたは何も)、一貫性(前後で有効な状態)、分離性(同時実行トランザクションが干渉しない)、および永続性(コミットされた変更は持続する)を表します。これらのプロパティは、信頼性の高いトランザクション処理を保証します。


まとめ

本ドキュメントでは、一般的な MySQL の面接で問われる質問とその効果的な回答について包括的な概要を提供しました。これらの概念を習得することは、今日のテクノロジー環境で高く評価されるスキルであるデータベース管理におけるあなたの能力を示すために不可欠です。徹底した準備は、自信を築くだけでなく、潜在的な雇用主に対してあなたの献身と理解を示すことにもつながります。

学習の旅は継続的であることを忘れないでください。面接が成功した後も、MySQL、そして一般的にデータベースの世界は、成長とより深い理解のための無限の機会を提供します。好奇心を持ち続け、練習を続け、高度なトピックを探求することで、あなたの専門知識とキャリアの見通しをさらに高めてください。