PHP の mysql 面接質問の完全なコレクション (継続的に更新)

目次

1. MySQL インデックスの知識ポイント 

 1. インデックスとは何ですか?

2. インデックスの種類 

 3. 主キーと通常のインデックスの違い

4. 主キー、外部キー、インデックスの違いは何ですか?

5. インデックスの長所と短所

6. インデックス障害の状況

7. データテーブルのインデックス作成の原則は何ですか?

8. インデックスの作成が不適切となるのはどのような状況ですか? 

9. msyql インデックスをテーブルに戻す

 10. インデックスの左端の一致原則 

11. クラスター化インデックスと非クラスター化インデックスの違い 

12. mysqlインデックスの最適化

13. MyISAM と InnoDB の基本的な違いは何ですか? インデックス構造はどのように実装されていますか?

14. MySQL は B+ ツリー インデックス構造を使用します

2. ロック機構

1. ロックとは何ですか?

 2. MySQL にはどのような種類のロックがありますか?

3. 行レベルのロックとは何ですか? MySQL で行レベルのロックを実装するにはどうすればよいですか?

4. テーブルレベルのロックとは何ですか? MySQL でテーブルレベルのロックを実装するにはどうすればよいですか?

 5. ページレベルのロックとは何ですか? MySQL でページ レベルのロックを実装するにはどうすればよいですか?

6. 共有ロックと排他ロックとは何ですか?

7. デッドロックとは何ですか? デッドロックを回避するにはどうすればよいですか?

8. 楽観的ロックと悲観的ロックとは何ですか?

9. デッドロック検出とデッドロック回復とは何ですか?

10. トランザクション分離レベルとは何ですか? MySQL にはどのようなトランザクション分離レベルがありますか?

11. ギャップロックとは何ですか? MySQL でギャップ ロックを使用するにはどうすればよいですか?

12. デッドロック タイムアウトとは何ですか?

13. スピンロックとは何ですか? スピンロックをいつ使用するか?

14. ロックの粒度とは何ですか? 適切なロック粒度を選択するにはどうすればよいですか?

15. ロックのアップグレードとロックのダウングレードとは何ですか?

16. デッドロック グラフとは何ですか?

17. msyql の悲観的ロックと楽観的ロックは、共有ロックまたは排他的ロックとして分類されますか?

3. MySQL の基本

1. PHP の PDO とは何ですか?

 2. mongodbとmysqlの違い

3. SQL実行処理

4. データベース内のトランザクションとは何ですか?

  5. char と varchar の違い

6. リレーショナル データベースと非リレーショナル データベースの違いは何ですか?

 7. MySQL の左結合、右結合、内部結合の違いを簡単に説明してください。

8. PHP の PDO と mysqli 拡張機能の違いは何ですか? データベースを操作するにはどの拡張子を使用する必要がありますか?

9. count(1)、count(*)、count(column name)?の実行の違いを簡単に説明します。

10. Where、jion、limit、group by、having、などの実行順序

4.mysqlの最適化 

1. MySQL には 1 つのテーブルに 1 億を超えるデータがあります。クエリ速度を最適化するにはどうすればよいですか?

2. 遅い SQL を見つける方法

3. テーブルとデータベースを msyql に分割する方法 

4. MySQL マスター/スレーブ レプリケーション 

5. MySQL データベースの CPU が 100% に急増した場合はどうすればよいですか?

6. 数百億のデータがテーブルに分割された後、ページごとにクエリを実行するにはどうすればよいですか?

7. MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか?

8. MySQL のテーブル構造を最適化するにはどうすればよいですか?

9. MySQL 構成パラメータを最適化するにはどうすればよいですか? ​​​​​​​

5.mysqlのセキュリティ

1. SQL インジェクションとは何ですか? SQL インジェクションを防ぐ方法は何ですか? 

 2. MySQL データベースのセキュリティを保護するにはどうすればよいですか?

3. MySQL データベースへのアクセスを制限するにはどうすればよいですか?

4. MySQL データベース内の機密データを保護するにはどうすればよいですか?


 

1. MySQL インデックスの知識ポイント 

 1. インデックスとは何ですか?
高速検索のためのソートされたデータ構造
2. インデックスの種類 
  1. 通常インデックス: 非一意インデックスとも呼ばれ、最も基本的なインデックス タイプです。インデックス列に通常の B ツリー インデックス構造を作成します。これによりクエリが高速化されますが、インデックス列に重複した値が許可されます。
  2. 一意のインデックス: 一意のインデックスは、インデックス列に一意の制約を作成し、インデックス列の値が一意であることを保証します。通常のインデックスとは異なり、一意のインデックスではインデックス列の値が重複できない必要があり、データの挿入または更新時に一意性制約に違反すると、一意性の競合エラーが発生します。
  3. 主キー インデックス: 主キー インデックスは、テーブル内のデータの各行を一意に識別するために使用される特別な一意のインデックスです。主キー インデックスでは、インデックス列の値を NULL にすることはできず、一意制約が自動的に作成されます。テーブルには主キー インデックスを 1 つだけ持つことができます。
  4. 複合インデックス: 複合インデックスは、複数の列に対して作成されたインデックスを指し、複数列インデックスとも呼ばれます。複数の列にインデックスを作成すると、複数列の条件付きクエリのパフォーマンスを向上させることができます。複合インデックスの順序は重要であり、クエリ時にインデックス列の順序で使用する必要があります。
  5. フルテキスト インデックス: フルテキスト インデックスは、テキスト コンテンツの全文検索に使用されます。テキストフィールドにインデックスを作成して、キーワードの効率的な検索と照合を行うことができます。全文インデックスは、キーワードのあいまい一致と並べ替えをサポートします。
 3. 主キーと通常のインデックスの違い
主キー インデックスは一意であり、空にすることはできません。
主キー インデックスはテーブル内の行を一意に識別するために使用され、クエリ効率が高くなります。通常のインデックスはクエリを高速化するために使用され、頻繁にクエリされる列に適しています。
4. 主キー、外部キー、インデックスの違いは何ですか?
主キー 外部キー 索引
意味 レコードを一意に識別します。重複することはできず、空にすることもできません。 テーブルの外部キーは、別のテーブルの主キーです。外部キーは繰り返されるか、NULL 値を持つことができます。 このフィールドには重複する値はありませんが、NULL 値を含めることができます。
効果 データの整合性を確保するために使用されます 他のテーブルとの関係を確立するために使用されます クエリのソート速度を向上させるためです
番号 主キーは 1 つだけ存在できます テーブルには複数の外部キーを含めることができます テーブルには複数の一意のインデックスを含めることができます
5. インデックスの長所と短所
ディレクトリを確立すると、データ取得の効率が向上し、データベース IO コストが削減されます。インデックス キュー データを並べ替えることで、データの並べ替えコストと CPU 消費量が削減されます。インデックスが多すぎると、使用される一時領域が増加し、更新と削除の速度にも影響します
6. インデックス障害の状況
各インデックスの使用または使用なし (%、!⁼ などのファジー クエリ条件は無効になります。
文字列の場合、int を使用したクエリは無効になります。引用符が必要です。
データが少なすぎます
。関数または計算を使用してください。)
7. データテーブルのインデックス作成の原則は何ですか?

インデックス作成は、データベース クエリのパフォーマンスを向上させる重要な手段の 1 つです。インデックス作成の原則は次のとおりです。

  1. 一意性の原則: 一意である必要がある主キー、一意制約、または列については、一意のインデックスを確立する必要があります。これにより、データの一意性が確保され、列の検索操作が高速化されます。
  2. 頻繁なクエリの原則: 頻繁にクエリが実行される列に対してインデックスを作成する必要があります。これにより、関連するクエリの実行が高速化され、データベースのクエリのパフォーマンスが向上します。
  3. 条件付きクエリの原則: クエリ条件で頻繁に使用される列に対してインデックスを作成する必要があります。これにより、条件を満たすクエリ操作が高速化され、クエリ効率が向上します。
  4. 結合クエリの原則: クエリ条件として複数の列を同時に使用することが多いクエリ ステートメントの場合は、結合インデックスを確立する必要があります。これにより、複数の列をインデックスとして使用できるようになり、クエリの効率が向上します。
  5. データ ボリュームの原則: データ テーブルが大きい場合は、インデックスを作成する必要があります。大規模なデータ テーブルのフル テーブル スキャンは非常にコストがかかるため、インデックスを作成するとクエリを高速化できます。
  6. インデックスが多すぎることを避ける原則: インデックスが多すぎると、データベースのメンテナンス コストが増加し、データの挿入、更新、および削除操作のパフォーマンスに影響します。したがって、過剰なインデックス作成を避け、必要なインデックスのみを作成する必要があります。
  7. データ型の原則: テキスト型または長い列の場合は、インデックスを作成するかどうかを慎重に検討する必要があります。これらの列のインデックスはより多くの記憶領域を占有し、インデックスの効率に影響を与えるためです。インデックス作成の原則は、特定のビジネス ニーズとデータベース クエリの状況に基づいて包括的に検討する必要があります。
8. インデックスの作成が不適切となるのはどのような状況ですか? 

場合によっては、インデックス作成が賢明な選択ではない可能性があります。インデックス作成が推奨されない場合の考慮事項をいくつか示します。

  1. データ テーブルが非常に小さい: データ テーブルが非常に小さい (わずか数十行以下など) 場合、インデックス作成によるパフォーマンスの利点は非常に限られており、パフォーマンスの低下を引き起こす可能性さえあります。したがって、小さなテーブルのインデックス作成は必要ない場合があります。
  2. データ テーブルは、大量の挿入、更新、および削除操作を頻繁に実行します。インデックスを作成すると、データ テーブルのメンテナンス コストが増加します。大量の挿入、更新、および削除操作を頻繁に実行するデータ テーブルの場合、インデックスのメンテナンスコストがインデックスのコストを超える可能性があります。パフォーマンスの向上。この場合、インデックス作成が本当に必要かどうかを検討できます。
  3. データ テーブルのクエリがほとんどないか、インデックス フィールドを含むクエリがほとんどない: データ テーブルがめったにクエリされない場合、またはインデックス フィールドを含むクエリが非常に少ない場合は、インデックス作成によるパフォーマンスの利点が非常に限定されている可能性があります。この場合、インデックスを作成しないことを検討してください。
  4. データ テーブルの列値は基本的に一意です。データ テーブルの列値が基本的に一意である場合、インデックスの選択性が低いため、インデックス作成の効果は減少します。この場合、インデックスを作成しないことを検討してください。
  5. クエリ パフォーマンスが十分に優れている: データ テーブルのクエリ パフォーマンスが十分に優れており、明らかなパフォーマンスのボトルネックがない場合は、インデックス作成は必要ない可能性があります。この場合、データベースのメンテナンスのオーバーヘッドを軽減するために、インデックスを作成しないことを検討できます。インデックスを構築するかどうか、どのインデックスを構築するかは、具体的なビジネス ニーズやデータベースのクエリ条件に基づいて総合的に検討する必要があります。決定を下す前に、データベースのクエリ最適化ツールを使用するか、いくつかのテストを実行してインデックス作成の影響を評価できます。
9. msyql インデックスをテーブルに戻す

MySQL のテーブルへのインデックスバックとは、クエリにインデックスを使用するときに、クエリ結果でテーブル内の他の列データを取得する必要がある場合、テーブルへのインデックスバックを通じて取得する必要があることを意味します。次に、MySQL インデックス バック テーブルに関する手順をいくつか示します。

  • インデックス テーブル バッキングは、データ行への直接アクセスを回避することでクエリのパフォーマンスを向上させるクエリ最適化手法です。
  • InnoDB ストレージ エンジンでは、クラスター化インデックス (主キー インデックスとも呼ばれる) のリーフ ノードにデータ行全体のデータが格納されるため、テーブルにインデックスを作成する必要はありません。
  • 非クラスター化インデックス (セカンダリ インデックス) のリーフ ノードには、インデックス列と主キーの値のみが格納され、他の列データをクエリする場合は、主キーの値を介してテーブルの戻り操作を実行する必要があります。
  • テーブルにインデックスを戻すと、データ行を主キー値を通じてランダムに読み取る必要があるため、追加の IO 操作が追加されます。
  • クエリ結果により多くの列データを取得する必要がある場合、テーブルにインデックスを作成するコストが比較的大きくなり、クエリのパフォーマンスが低下する可能性があります。
  • インデックスを上書きすることで、テーブルにインデックスを作成し直すオーバーヘッドを回避できます。カバリング インデックスとは、クエリに必要なすべての列がインデックスに含まれており、テーブルを返す操作を必要とせずにクエリ結果をインデックスから直接取得できることを意味します。
  • テーブルの構造とインデックスを設計するときは、テーブルにインデックスを作成するコストを削減するために、実際の状況に基づいてカバー インデックスを使用する必要があるかどうかを検討できます。
  • MySQL 実行プランでは、Extra カラムに using インデックスまたは using インデックス条件が含まれているかどうかを確認することで、インデックスを返す操作が発生したかどうかを判断できます。テーブルへのインデックス作成によるパフォーマンスへの影響は、クエリ条件、テーブル構造、データ量によって異なることに注意してください。実際のアプリケーションでは、クエリのパフォーマンスを向上させるために、特定の状況に応じてテストと最適化を実行する必要があります。
  • users以下は、テーブルへのインデックスを使用する方法を示す例です。次の列を持つ名前のテーブルがあるとします: idnameおよびageその中にid主キーがあります。「John」という名前のユーザーの年齢をクエリするには、次の SQL ステートメントを使用できます。
  • ​
    SELECT age
    FROM users
    WHERE name = 'John';
    
    ​

    name非クラスター化インデックスがインデックス名 の列に作成されたとしますidx_nameテーブルへのインデックスの再作成を避けるために、カバーインデックスを使用できます。

    SELECT name, age
    FROM users
    WHERE name = 'John';

    この場合、インデックスにはと列の値がidx_name直接含まれるため、テーブル バック操作を必要とせずにクエリ結果をインデックスから直接取得できます。特定の SQL ステートメントは、テーブル構造とクエリ要件の違いにより異なる場合があることに注意してください。実際のアプリケーションでは、最高のクエリ パフォーマンスを得るために、特定の条件に従って調整および最適化する必要があります。nameage

 10. インデックスの左端の一致原則 

インデックスの左端の一致原則は、データベース インデックスの使用規則です。これは、複合インデックス (複合インデックス) で、クエリ条件に複合インデックスのプレフィックス列のみが含まれる場合、データベースはクエリと最適化にそのインデックスを使用できることを意味します。

具体的には、複数の列 A、B、C を含む複合インデックスがあるとします。クエリ条件に列 A のみ、または列 A と列 B が含まれ、列 C は含まれない場合、データベースはこの複合インデックスを使用できます。クエリを実行し、フィルタリング。ただし、クエリ条件に列 C は含まれるが、列 A または列 A と列 B は含まれない場合、複合インデックスは使用されません。この原理の機能は、左端のプレフィックスによってクエリ効率を向上させ、インデックスのスキャン範囲を減らし、それによってクエリ速度を向上させることです。

したがって、複合インデックスを設計する場合は、実際のクエリのシナリオとニーズに基づいてインデックスの列の順序を合理的に選択し、クエリ条件として頻繁に使用される列を先頭に配置する必要があります。インデックスの左端の一致原則はすべてのデータベースに適用されるわけではなく、データベース システムが異なればインデックスの実装や最適化戦略も異なる場合があることに注意してください。したがって、特定のデータベース環境では、データベースの特性とパフォーマンス特性に基づいてインデックスを設計および最適化することをお勧めします。

11. クラスター化インデックスと非クラスター化インデックスの違い 

クラスター化インデックスと非クラスター化インデックスは、データベースで一般的な 2 つのインデックス タイプですが、データの保存時とクエリ時にいくつかの違いがあります。

  1. 保管方法:
    • クラスター化インデックス: クラスター化インデックスのリーフ ノードには、テーブルのすべての列データが格納され、インデックスの並べ替え順序に従ってデータが物理的に編成されます。各テーブルにはクラスター化インデックスを 1 つだけ含めることができるため、クラスター化インデックスによってテーブルの物理的な格納順序が決まります。
    • 非クラスター化インデックス: 非クラスター化インデックスのリーフ ノードには、インデックス列の値と実際のデータ行へのポインターが格納されます。テーブルには、データ行が格納される物理的な順序とは無関係に、複数の非クラスター化インデックスを持つことができます。
  2. クエリ効率:
    • クラスター化インデックス: クラスター化インデックスはテーブルの物理的な格納順序を決定するため、クエリにクラスター化インデックスを使用すると、インデックスの順序でデータに直接アクセスでき、クエリの効率が向上します。ただし、クエリ条件にクラスター化インデックス列が含まれていない場合でも、テーブル全体のスキャンが必要です。
    • 非クラスター化インデックス: 非クラスター化インデックスを使用してクエリを実行する場合は、まずインデックスを通じて対応する行ポインターを見つけてから、そのポインターに基づいて実際のデータ行にアクセスする必要があります。したがって、非クラスター化インデックスのクエリ効率は、クラスター化インデックスのクエリ効率よりもわずかに低くなる可能性があります。
  3. インデックスの更新:
    • クラスター化インデックス: クラスター化インデックスはテーブルの物理的な格納順序を決定するため、クラスター化インデックス列に対する更新操作によりデータの物理的な並べ替えが発生する可能性があります。これにより、ページの断片化が発生し、更新のオーバーヘッドが増加する可能性があります。
    • 非クラスター化インデックス: 非クラスター化インデックスでは、実際のデータ行はインデックスとは独立した順序で格納されるため、インデックス列の更新操作によってデータの物理的な並べ替えが発生することはありません。したがって、非クラスター化インデックスの更新操作におけるオーバーヘッドは比較的わずかです。特定のデータベース システムとテーブルの設計に応じて、適切なインデックス タイプを選択すると、クエリの効率とデータ更新のパフォーマンスが向上します。通常、クラスター化インデックスは範囲クエリによく使用される列に適しており、非クラスター化インデックスは等価クエリによく使用される列に適しています。
12. mysqlインデックスの最適化
  1. 適切なインデックス タイプを選択します。MySQL は、B ツリー インデックス、ハッシュ インデックス、フルテキスト インデックスなどの複数のインデックス タイプをサポートします。実際の状況に応じて適切なインデックス タイプを選択し、クエリ効率を向上させます。
  2. 適切なインデックス列を選択します。インデックス列は、めったに使用されない列ではなく、頻繁にクエリされる列である必要があります。同時に、インデックス列の選択ではデータの分散を考慮し、頻繁に繰り返される値を持つ列をインデックスとして選択することを避ける必要があります。
  3. 複合インデックスの作成: クエリ条件に複数の列が含まれる場合、複合インデックスを作成してクエリの効率を向上させることができます。複合インデックスの順序は、クエリ条件の頻度と選択性に基づいて決定されます。
  4. インデックスの多すぎを避ける: インデックスの作成が多すぎると、データ書き込みコストが増加し、クエリのパフォーマンスにも影響します。無効な冗長インデックスを避けるために、必要なインデックスのみを作成してください。
  5. インデックス付きカラムに対する関数操作を避ける: インデックス付きカラムに対して関数操作を実行すると、MySQL は最適化にインデックスを使用できず、テーブル全体のスキャンが発生します。インデックス付き列に対して関数演算を使用することは避けてください。
  6. SELECT * の使用を避けます。必要な列のみを選択し、不必要なデータの読み取りと送信を回避し、クエリの効率を向上させます。
  7. インデックスを定期的に分析および最適化する: データベースの使用状況に基づいて、インデックスを定期的に分析および最適化して、インデックスの最高のパフォーマンスを確保します。
  8. カバーリング インデックスの使用: カバーリング インデックスの使用を試みます。つまり、クエリに必要な列がインデックスに含まれるため、データ行へのアクセスが回避され、クエリの効率が向上します。
  9. インデックス列の頻繁な更新と削除を避ける: インデックス列の更新と削除を頻繁に行うと、インデックスが不安定になり、クエリのパフォーマンスの低下につながります。つまり、MySQL インデックスの最適化は、特定のビジネス ニーズとデータベースの使用状況に応じて調整および最適化する必要がある包括的な作業です。インデックスを適切に作成して使用することにより、MySQL データベースのクエリ パフォーマンスを向上させることができます。
13. MyISAM と InnoDB の基本的な違いは何ですか? インデックス構造はどのように実装されていますか?
A. MyISAM タイプはトランザクションとテーブル ロックをサポートしておらず、断片化が起こりやすいです。頻繁に最適化する必要があり、読み取りと書き込みの速度が速いです。頻繁にクエリを行うアプリケーションに適しています。B. InnoDB タイプはトランザクションをサポートし
、行ロック、クラッシュ回復機能、読み取りおよび書き込み機能を備えています。MyISAM よりも低速で、挿入および更新操作が多いアプリケーションに適しています。多くのスペースを占有し、フルテキスト インデックス作成はサポートされていません。
インデックスを作成します: アラート テーブル テーブル名 インデックスを追加 インデックス名 (`フィールド名`)
14. MySQL は B+ ツリー インデックス構造を使用します
  1. バランス: B+ ツリーはすべてのリーフ ノードの深さを同じに保ち、クエリ操作の時間計算量を O(logN) レベルに保ちます。
  2. マルチパス: B+ ツリーの各ノードは複数のインデックス キー値と対応するデータ ポインターを保存できるため、各ノードがより多くのデータを保存できるようになり、ディスク I/O の数が減り、クエリ効率が向上します。
  3. 順序性: B+ ツリーのリーフ ノードはインデックス キー値のサイズに従って並べ替えられ、範囲クエリと並べ替え操作がより効率的になります。
  4. 分割とマージ: ノード内のキーと値のペアが多すぎる場合、B+ ツリーはノード分割を実行し、いくつかのキーと値のペアを新しいノードに割り当てます。ノード内のキーと値のペアが少なすぎる場合、B+ ツリーはノードの分割を実行します。ツリーはノードのマージを実行します。ツリーのバランスを維持するために、隣接するノードを 1 つのノードにマージします。
  5. リーフ ノードのリンク リスト: B+ ツリーのリーフ ノードは、ポインタを介して順序付きリンク リストを形成します。これにより、範囲クエリと順次走査が容易になります。MySQL の通常のインデックス、一意のインデックス、主キー インデックス、複合インデックスなどはすべて B+ ツリーに基づいて実装されています。B+ ツリーの利点は、範囲クエリ、並べ替え操作、効率的な挿入および削除操作に適しており、複数列のインデックスと高度な同時データ アクセスをサポートできることです。B+ ツリー インデックスを適切に設計して使用することにより、MySQL データベースのクエリ パフォーマンスとデータ アクセス効率を向上させることができます。
2. ロック機構
1. ロックとは何ですか?
  • ロックは、共有リソースへのアクセスを制御するために使用されるメカニズムです。データベースでロックを使用すると、同時トランザクションの一貫性と整合性が保証されます。
 2. MySQL にはどのような種類のロックがありますか?
  • MySQL には、行レベルのロック、テーブルレベルのロック、ページレベルのロックなど、さまざまなタイプのロックがあります。
3. 行レベルのロックとは何ですか? MySQL で行レベルのロックを実装するにはどうすればよいですか?
  • 行レベルのロックとは、データベース内の単一のデータ行をロックして、他のトランザクションがデータ行を変更できないようにすることを指します。MySQL では、SELECT ... FOR UPDATE ステートメントを使用して行レベルのロックを実現できます。
4. テーブルレベルのロックとは何ですか? MySQL でテーブルレベルのロックを実装するにはどうすればよいですか?
  • テーブルレベルのロックとは、他のトランザクションがテーブルを変更できないようにテーブル全体をロックすることを指します。MySQL では、LOCK TABLES ステートメントを使用してテーブルレベルのロックを実装できます。
 5. ページレベルのロックとは何ですか? MySQL でページ レベルのロックを実装するにはどうすればよいですか?
  • ページ レベルのロックとは、データベース内のデータのページをロックして、他のトランザクションがページ データを変更できないようにすることを指します。MySQL では、InnoDB ストレージ エンジンを使用してページレベルのロックを実装できます。
6. 共有ロックと排他ロックとは何ですか?
  • 共有ロックでは、他のトランザクションがロックされたデータを読み取ることはできますが、他のトランザクションがデータを変更することはできません。排他ロックでは、他のトランザクションによるデータの読み取りも、他のトランザクションによるデータの変更も許可されません。
7. デッドロックとは何ですか? デッドロックを回避するにはどうすればよいですか?
  • デッドロックは、2 つ以上のトランザクションが互いのロックの解放を待機し、それ以上の処理が妨げられる場合に発生します。デッドロックを回避するには、トランザクション タイムアウト メカニズムを使用し、適切なトランザクション分離レベルを設定し、トランザクションの同時実行性を減らすことができます。
8. 楽観的ロックと悲観的ロックとは何ですか?
  • オプティミスティック ロックはオプティミスティック同時実行制御メカニズムであり、同時実行の競合がめったに発生しないことを前提としているため、積極的にロックは行われませんが、送信時に他のトランザクションがデータを変更したかどうかをチェックします。悲観的ロックは悲観的な同時実行制御メカニズムであり、同時実行の競合が頻繁に発生することを想定しているため、データの読み取り時にアクティブにロックして、他のトランザクションがデータを変更するのを防ぎます。
9. デッドロック検出とデッドロック回復とは何ですか?
  • デッドロックの検出とは、システムがデッドロックの存在を検出し、デッドロックの問題を解決するために対応する措置を講じることを意味します。
  • デッドロック回復とは、システムがデッドロックを解除するプロセスを指します。これには通常、ロールバックまたは終了するトランザクションの選択が含まれます。上記は、MySQL ロックに関連する面接での一般的な質問の一部です。これらの質問に答えるときは、あなた自身の実体験と理解に基づいて答えることができます。
10. トランザクション分離レベルとは何ですか? MySQL にはどのようなトランザクション分離レベルがありますか?
  • トランザクション分離レベルは、複数の同時トランザクションが互いに分離される程度を指します。MySQL には、READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE の 4 つのトランザクション分離レベルがあります。
11. ギャップロックとは何ですか? MySQL でギャップ ロックを使用するにはどうすればよいですか?
  • ギャップ ロックとは、他のトランザクションがそのギャップに新しいデータを挿入するのを防ぐために、データ範囲間のギャップをロックすることを指します。MySQL では、ギャップ ロックは SELECT ... LOCK IN SHARE MODE または SELECT ... FOR UPDATE ステートメントを使用して使用できます。
12. デッドロック タイムアウトとは何ですか?
  • デッドロック タイムアウトとは、デッドロックが発生した場合、システムがデッドロックを解消するために一定時間待機した後、トランザクションの 1 つを自動的に終了することを意味します。MySQL のデッドロック タイムアウトは、パラメータ innodb_lock_wait_timeout を通じて設定できます。
13. スピンロックとは何ですか? スピンロックをいつ使用するか?
  • スピンロックとはロック待ちのビジー状態の仕組みで、ロックを取得するとスレッドはロックを取得するまでループでロックの状態を確認します。スピン ロックはマルチコア CPU でより適切に実行され、ロックの競合が短時間発生し、スレッドが長時間ブロックされない状況に適しています。
14. ロックの粒度とは何ですか? 適切なロック粒度を選択するにはどうすればよいですか?
  • ロックの粒度は、行レベルのロック、テーブルレベルのロック、ページレベルのロックなど、ロックされたデータの範囲サイズを指します。適切なロック粒度の選択は、同時アクセス、データ アクセス モード、パフォーマンス要件などの要素に基づいて総合的に検討する必要があります。
15. ロックのアップグレードとロックのダウングレードとは何ですか?
  • ロックのアップグレードは、低レベルのロックを高レベルのロックにアップグレードすることを指し、ロックのダウングレードは、高レベルのロックを低レベルのロックにダウングレードすることを指します。MySQL では、ロックの昇格は自動的に行われますが、ロックのダウングレードは手動で行う必要があります。
16. デッドロック グラフとは何ですか?

デッドロック図は、データベース内のデッドロックされたトランザクション間の関係を説明するグラフィック表現です。デッドロックグラフを分析することで、各トランザクション間の待ち関係を把握し、デッドロック問題を解決することができます。

17. msyql の悲観的ロックと楽観的ロックは、共有ロックまたは排他的ロックとして分類されますか?
  • デッドロックとは、2 つ以上のトランザクションが互いのリソースを待機しており、その結果、すべてのトランザクションが実行を継続できなくなる状況を指します。簡単に言うと、2 つ以上のトランザクションがお互いのリソースの解放を待っているため、継続不可能な膠着状態に陥ってしまいます。
  • ダーティ リードとは、あるトランザクションが別のトランザクションからコミットされていないデータを読み取ることを意味します。あるトランザクションがデータを読み取っているときに、別のトランザクションがデータを変更しましたが、まだコミットされていないため、この時点で、最初のトランザクションによって読み取られたデータは矛盾しているか無効です。
  • ファントム読み取りとは、あるトランザクションがデータを読み取っているときに、別のトランザクションが同じデータを挿入または削除し、最初のトランザクションが一貫性のないデータ行を読み取ることを意味します。ファントム読み取りとダーティー読み取りの違いは、ダーティー読み取りはコミットされていない変更されたデータを読み取るのに対し、ファントム読み取りは他のトランザクションによって送信された新しいデータまたは削除されたデータを読み取ることです。
  • 非反復読み取りとは、1 つのトランザクションがデータを読み取るときに、別のトランザクションが同じデータを変更してコミットするため、最初のトランザクションが同じデータを複数回読み取ると結果が不一致になることを意味します。ノンリピート読み取りとファントム読み取りの違いは、ノンリピート読み取りは他のトランザクションによって送信された変更されたデータを読み取るのに対し、ファントム読み取りは他のトランザクションによって送信された新しいデータまたは削除されたデータを読み取ることです。これらの問題は主に同時トランザクション処理環境で発生し、複数のトランザクションが同時にデータベースに読み書きすることによって発生します。これらの問題を解決するために、データベース システムはさまざまな分離レベル (非コミット読み取り、コミット読み取り、反復読み取り、シリアル化など) を提供しており、開発者は特定の状況に応じて適切な分離レベルを選択して、これらの問題を回避または軽減できます。

3. MySQL の基本

1. PHP の PDO とは何ですか?
PDO (PHP Data Objects) は、MySQL、PostgreSQL、Oracle などのさまざまなデータベースに接続して操作するために使用される PHP 拡張機能です。PDO は、データベース操作を実行するための統合インターフェイスとメソッドのセットを提供し、
プリペアド ステートメントやトランザクション処理などの高度な機能をサポートします。
 2. mongodbとmysqlの違い
Mongodb は非リレーショナル データベースであり、MySQL はリレーショナル データベースです。MySQL は
比較的成熟しており、より複雑なリレーショナル SQL をサポートしています。欠点は、データが大きくなると速度が低下することです。MongoDB の
ホット データは物理メモリに直接存在します。ビッグ データは、クエリも迅速に実行できますが、トランザクションはサポートされていません。
3. SQL実行処理
SQL ステートメント -) コネクタ -) クエリ キャッシュ -) インタープリタ -) エグゼキュータ

4. データベース内のトランザクションとは何ですか?

データベースでは、トランザクションは一連のデータベース操作 (挿入、更新、削除など) の論理単位であり、すべてが正常に実行されるか、すべてロールバックされて元に戻されます。トランザクションには次の 4 つの特性があり、ACID プロパティとも呼ばれます。

  1. アトミック性: トランザクションは、すべてが正常に実行されるか、すべてが失敗してロールバックされる、分割できない作業単位です。トランザクション内のいずれかの操作が失敗した場合、トランザクション全体は部分的な変更を加えずに元の状態にロールバックされます。
  2. 一貫性: データベースはトランザクション実行の前後で一貫した状態を維持する必要があります。これは、データの整合性と有効性を確保するために、トランザクション内の操作が事前定義されたルールと制約を満たす必要があることを意味します。
  3. 分離: トランザクションの実行は相互に分離される必要があり、トランザクションが相互に干渉しないようにする必要があります。データの不整合や競合を避けるために、同時に実行される複数のトランザクションは互いに分離しておく必要があります。
  4. 耐久性: トランザクションがコミットされると、データベースへの変更は永続的であり、システム障害やクラッシュの後でも持続する必要があります。トランザクションを使用すると、データベースのデータの整合性と一貫性を確保できます。アプリケーションにおけるトランザクションの一般的な用途には、銀行振込、注文処理、在庫管理、およびデータの正確性と完全性を保証する必要があるその他のシナリオが含まれます。
  5. char と varchar の違い

char 固定長 varchar 可変長スペース char は固定ストレージスペースを占有します varchar 実スペース char はクエリ効率が高いです

6. リレーショナル データベースと非リレーショナル データベースの違いは何ですか?

リレーショナル データベースと非リレーショナル データベースの違いは、次のように簡単に要約できます。

  • データの保存方法: リレーショナル データベースはテーブルの形式でデータを保存しますが、非リレーショナル データベースはキーと値のペア、ドキュメントなどの形式でデータを保存します。
  • データ モデル: リレーショナル データベースは構造化データ モデルを使用し、操作とクエリに SQL を使用します。非リレーショナル データベースは非構造化または半構造化データ モデルを使用し、さまざまなクエリ言語または API を使用します。
  • スケーラビリティ: リレーショナル データベースは通常、垂直方向に拡張します。つまり、ハードウェア リソースを追加してパフォーマンスを向上します。非リレーショナル データベースは水平方向に拡張でき、ノードを追加することでストレージ容量とスループットを向上できます。
  • データの一貫性: リレーショナル データベースは ACID の特性に従ってデータの整合性と一貫性を確保しますが、非リレーショナル データベースは高可用性と分散パフォーマンスを追求するため、場合によっては特定のデータの一貫性が犠牲になる場合があります。
  • 適用可能なシナリオ: リレーショナル データベースは、データの一貫性、トランザクション処理、および複雑なクエリを保証する必要があるアプリケーションに適しており、非リレーショナル データベースは、大規模なデータと高い同時アクセスを処理するアプリケーションに適しています。
 7. MySQL の左結合、右結合、内部結合の違いを簡単に説明してください。
  1. LEFT JOIN: 左結合は、左側のテーブルのすべてのレコードと、左側のテーブルに一致する右側のテーブルのレコードを返します。右側のテーブルに一致するレコードがない場合は、NULL 値が返されます。左側の結合キーワードはLEFT JOINまたはですLEFT OUTER JOIN
  2. RIGHT JOIN: 右結合は、右側のテーブルのすべてのレコードと、右側のテーブルに一致する左側のテーブルのレコードを返します。左側のテーブルに一致するレコードがない場合は、NULL 値が返されます。正しい結合キーワードはRIGHT JOINまたはですRIGHT OUTER JOIN
  3. INNER JOIN: 内部結合は、左側のテーブルと右側のテーブルで一致するレコードのみを返します。結合条件に基づいて、両方のテーブルから一致する行をフィルターで除外します。内部結合キーワードは ですINNER JOIN要約:
  • LEFT JOIN左側のテーブル内のすべてのレコードと、一致する右側のテーブルのレコードを返します。
  • RIGHT JOIN右側のテーブル内のすべてのレコードと、一致する左側のテーブルのレコードを返します。
  • INNER JOIN左右のテーブルから一致するレコードのみが返されます。接続条件の正確さが接続の結果に重要な影響を与えることに注意してください。また、結合操作で WHERE 句を使用すると、結合操作が内部結合に変換される可能性があるため、使用には注意が必要です
8. PHP の PDO と mysqli 拡張機能の違いは何ですか? データベースを操作するにはどの拡張子を使用する必要がありますか?

PDO と mysqli はどちらもデータベースを操作するために使用される PHP の拡張機能です。違いは、PDO はさまざまなデータベースをサポートし、移植性に優れた軽量のデータベース アクセス抽象化レイヤーであるのに対し、mysqli は PHP を MySQL データベースに拡張したもので、MySQL データベースのみをサポートすることです。どの拡張機能を使用するかは、特定のニーズとプロジェクトの条件に基づいて選択する必要があります。複数のデータベースをサポートする必要がある場合、または移植性要件がある場合は、PDO を使用することを選択できます。MySQL データベースを操作する必要があるだけの場合は、mysqli を使用することを選択できます。それは、より多くの MySQL 固有の機能と最適化を提供するためです。

9. count(1)、count(*)、count(column name)?の実行の違いを簡単に説明します。
  1. COUNT(1): 使用するとCOUNT(1)、実際に条件を満たす行数がカウントされます。各行は1定数を表しており、追加の計算や取得が必要ないため、実行効率は比較的高くなります。この書き方は通常、単純な行カウントに使用されます。
  2. COUNT(*): 使用するとCOUNT(*)、実際に条件を満たす行数がカウントされます。*すべての列が選択されていることを示すため、行数を計算するときにすべての列の値を取得する必要があり、追加のオーバーヘッドが発生する可能性があります。COUNT(*)テーブルに多数の列がある場合、またはテーブルに多数の行がある場合、使用するとパフォーマンスが低下する場合があります。
  3. COUNT(列名): 使用するとCOUNT(列名)、条件を満たす空ではない行の数が実際にカウントされます。この書き方では、指定した列をカウントし、その列内の null 以外の値のみをカウントします。指定した列にNULL値が存在する場合、それらのNULL値はカウントされません。要約:
  • COUNT(1)最も一般的に使用される記述方法で、行ごとに定数を返し、追加の計算や取得が不要なため、実行効率が比較的高くなります。
  • COUNT(*)すべての列の値が取得され、条件を満たす行数が計算されます。場合によっては、特にテーブルに多数の列がある場合、またはテーブルに多数の行がある場合、追加のオーバーヘッドが発生する可能性があります。
  • COUNT(列名)指定された列をカウントし、その列の非 null 値のみをカウントします。指定した列にNULL値が存在する場合、それらのNULL値はカウントされません。
10. Where、jion、limit、group by、having、などの実行順序
  1. FROM: 指定したテーブルからデータを取得します。複数のテーブルがある場合は、対応する接続​​操作 (JOIN) が実行されます。
  2. WHERE: 指定された条件を満たす行をフィルターで除外します。
  3. GROUP BY: 指定した列ごとに結果をグループ化します。
  4. HAVING: グループ化された結果をフィルターします。
  5. SELECT: クエリする列を選択します。
  6. ORDER BY: 結果を並べ替えます。
  7. LIMIT: 返される結果行の数を制限します。

4.mysqlの最適化 

1. MySQL には 1 つのテーブルに 1 億を超えるデータがあります。クエリ速度を最適化するにはどうすればよいですか?
  1. インデックスの最適化: インデックスを適切に作成、使用、維持すると、クエリ速度が大幅に向上します。クエリ条件として頻繁に使用されるフィールドについては、インデックスの作成を検討してください。ただし、インデックスが多すぎるとデータの挿入と更新の速度にも影響するため、トレードオフが生じます。
  2. パーティションテーブル: 特定の条件に従って大きなテーブルをパーティション分割することにより、データを異なる物理的な場所に保存してクエリ効率を向上させることができます。実際のシナリオに応じて、時間、地域などに応じて分割できます。
  3. 垂直分割: テーブルを同様の列を持つ複数の小さなテーブルに分割すると、1 つのテーブル内のデータ量が削減され、クエリ速度が向上します。ただし、クエリの複雑さの増加につながる過度の分割を避けるために、実際の状況に応じて分割する必要があります。
  4. 水平分割: 特定の条件に従ってテーブルを分割し、データを異なるテーブルに格納します。これにより、1 つのテーブル内のデータ量が削減され、クエリ速度が向上します。ただし、クエリ中に必要なデータを正しく取得できるようにするには、データの関連付けの問題を考慮する必要があります。
  5. クエリの最適化: クエリ ステートメントを最適化して、テーブル全体のスキャンや多数の一時テーブル操作を回避します。適切なインデックスを使用し、クエリ ステートメントの記述を最適化し、クエリの繰り返しを回避することで、クエリの効率を向上させることができます。
  6. データ圧縮: コールド データを圧縮して保存することで、ディスク領域の使用量を削減し、クエリ速度を向上させることができます。
  7. ハードウェアの最適化: データベースの全体的なパフォーマンスを向上させるために、SSD ハード ドライブ、大容量メモリなどのより高性能なハードウェアの使用を検討できます。上記は一般的に使用される最適化戦略の一部であり、具体的な最適化計画は実際の状況に応じて選択および調整する必要があります。さらに、MySQL 独自の EXPLAIN ステートメントや低速クエリ ログなどの監視およびチューニング ツールを通じて、潜在的なパフォーマンスの問題を発見し、最適化することができます。
2. 遅い SQL を見つける方法
  1. スロー クエリ ログをオンにする: MySQL 構成ファイルでslow_query_logパラメータを に設定し、パラメータONを指定してslow_query_log_fileスロー クエリ ログ ファイルのパスを指定します。設定を有効にするには、MySQL を再起動します。
  2. 低速クエリのしきい値を設定する:long_query_timeパラメータを設定して低速クエリ時間のしきい値を秒単位で指定します。デフォルト値は 10 秒です。実際の状況に応じて調整できます。
  3. スロー クエリ ログを分析する: スロー クエリ ログ ファイルを分析することで、遅い SQL を特定できます。mysqldumpslowこのツールを使用すると、遅いクエリ ログを解析して分析し、実行時間ごとにクエリ ステートメントを並べ替えることができます。
    mysqldumpslow -s t /path/to/slow_query_log

  4. このコマンドは、スロー クエリ ログ内のクエリ ステートメントを実行時間の降順でリストします。
  5. EXPLAIN を使用してクエリ プランを分析する: 遅いクエリの場合は、EXPLAINキーワードを使用してクエリ プランを表示できます。実行EXPLAINコマンドでは、クエリ文の実行計画やオプティマイザの使用状況を表示できます。クエリ プランを分析することで、クエリでインデックスが使用されているかどうか、テーブル全体のスキャンが実行されているかどうかなどを判断できます。
  6. EXPLAIN SELECT * FROM table WHERE column = 'value';

  7. パフォーマンス監視ツールを使用する: 低速クエリ ログとログに加えてEXPLAIN、パフォーマンス監視ツールを使用して低速 SQL を見つけることもできます。たとえば、MySQL に付属のパフォーマンス監視ツールを使用するかなどPerformance Schemaのサードパーティ ツールを使用します。上記の手順により、遅い SQL を特定し、状況に応じて最適化してデータベースのパフォーマンスを向上させることができます。pt-query-digestPercona Toolkit
3. テーブルとデータベースを msyql に分割する方法 
  1. ブランチライブラリ:
    • ビジネス ニーズとデータの特性に基づいて、分割する必要があるデータベースの論理的な分割を決定します。さまざまなビジネス モジュールまたはデータの種類に応じて分割できます。
    • 複数のデータベース インスタンスを作成します。各インスタンスはサブデータベースに対応します。
    • パーティション化ルールに従って元のデータベース テーブルを移行し、各サブデータベース内のデータがパーティション化ルールを満たすようにします。
  2. サブテーブル:
    • ビジネス ニーズとデータの特性に基づいて、分割する必要があるテーブルの論理的な分割を決定します。時間、地域、ユーザーなどの情報に応じて分割できます。
    • 複数のテーブルを作成し、各テーブルがサブテーブルに対応するようにします。
    • パーティション ルールに従って元のテーブル データを移行し、各テーブルのデータがパーティション ルールを満たすようにします。
  3. データルーティング:
    • アプリケーションにデータ ルーティング ロジックを実装し、ビジネス ニーズに基づいてデータ アクセスに適切なサブデータベースとテーブルを選択します。
    • データ ルーティング機能は、データベース接続プールまたはデータ アクセス フレームワークを通じて実装できます。
  4. インデックスの最適化:
    • テーブルとデータベースを分割した後は、インデックスの設計を再評価して最適化する必要があります。クエリの頻度と実際のニーズに応じて、適切なインデックスを再作成してクエリのパフォーマンスを向上させます。サブテーブルとサブデータベースは、特定のビジネス ニーズとデータベースの使用状況に基づいて設計および実装する必要があることに注意してください。同時に、サブテーブルとサブデータベースにより、データ同期、データベース間のクエリなど、追加の管理およびメンテナンス作業も発生します。したがって、サブテーブルとサブデータベースを実装する前に、サブテーブルとサブデータベースが期待される目的を達成できることを確認するために十分な評価と計画を行い、十分なテストと検証を行う必要があります。
4. MySQL マスター/スレーブ レプリケーション 

MySQL マスター/スレーブ レプリケーションは、複数の MySQL サーバー間でデータ同期を実現するために使用される、一般的に使用されるデータベース レプリケーション テクノロジです。マスター/スレーブ レプリケーションでは、1 つの MySQL サーバー (マスターと呼ばれます) がデータのソースとして機能し、1 つ以上の他の MySQL サーバー (スレーブと呼ばれます) がマスター上にデータを複製します。マスター/スレーブ レプリケーションは次のように動作します。

  1. メインサーバーは、追加、削除、変更などの操作を含む更新データをバイナリログに書き込みます。
  2. スレーブ サーバーはマスター サーバーに接続し、バイナリ ログ内のログ イベントを要求することでマスター サーバーで発生したデータ変更を取得します。
  3. スレーブ サーバーは、取得したログ イベントを自身のデータベースに適用して、スレーブ サーバー上のデータがマスター サーバーと一致するようにします。マスター/スレーブ レプリケーションを構成およびセットアップする手順は次のとおりです。
  4. マスターサーバー上で、バイナリログが有効になっていることを確認します。log_bin設定ファイルにパラメータを設定し、一意の識別子を設定することで、バイナリログ機能を有効にできますserver_id
  5. CREATE USER 'replication_user'@'slave_ip' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'slave_ip';

  • このうち、slave_ipはスレーブサーバーのIPアドレス、passwordはコピーしたユーザーのパスワードです。スレーブ サーバーでserver_idパラメーターを設定し、server_idマスター サーバーのパラメーターと異なることを確認します。スレーブ サーバーで次のコマンドを実行して、マスター サーバーの IP アドレスを指定し、ユーザーとパスワード、その他の情報をコピーします。
    CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='log_file', MASTER_LOG_POS=log_position;

    ここでmaster_ip、 はマスターサーバーの IP アドレス、replication_userpasswordマスターサーバー上で作成されたレプリケーションユーザーのユーザー名とパスワード、log_filelog_positionそれぞれマスターサーバーのバイナリログのファイル名と場所です。SHOW MASTER STATUS;コマンドを使用して、マスターサーバー上の現在のバイナリログファイルの名前と場所を表示できます。

  • START SLAVE;

  • これにより、スレーブ サーバーがマスター サーバーに接続し、データの複製が開始されます。
  • SHOW SLAVE STATUS;このコマンドを使用して、レプリケーションが正常かどうか、遅延などのスレーブ サーバーのレプリケーション ステータスを確認できます上記の手順により、MySQL マスター/スレーブ レプリケーションを設定し、データ同期を実現できます。マスター/スレーブ レプリケーションは、データ バックアップ、読み取り/書き込み分離、負荷分散、およびデータベースの可用性とパフォーマンスを向上させるその他の機能を提供します。
5. MySQL データベースの CPU が 100% に急増した場合はどうすればよいですか?
  1. クエリ ステートメントを確認して最適化する: CPU 使用率が高くなるのは、特定のクエリ ステートメントの実行が非効率であることが原因である可能性があります。EXPLAIN ステートメントを使用してクエリ ステートメントの実行計画を分析し、遅いクエリや多くのリソースを使用するクエリ ステートメントを見つけて最適化します。クエリのパフォーマンスを向上させるために、適切なインデックスの追加、クエリ ステートメントの書き換え、テーブル全体のスキャンの回避などを検討できます。
  2. データベース接続プール設定を調整します。同時接続数が多すぎると、CPU リソースが多数の接続要求によって占有されます。データベース接続プールのパラメータを調整して同時接続の数を制限し、CPU スパイクの原因となる過剰な接続要求を回避できます。たとえば、最大接続数を減らしたり、接続タイムアウトを調整したりできます。
  3. データベース構成パラメータを確認して最適化する: MySQL 構成パラメータはデータベースのパフォーマンスに重要な影響を与えます。innodb_buffer_pool_size、query_cache_size などのいくつかの重要な構成パラメータを確認および調整して、現在のデータベースの負荷に適応させることができます。
  4. データベース テーブル構造を分析して最適化する: データベース テーブル構造が適切に設計されていない場合、CPU 使用率が高くなる可能性があります。テーブル構造を分析し、大きなテーブルの分割、小さなテーブルの結合、フィールドの型と長さの標準化などの必要な最適化を行うことで、データベースの負荷を軽減できます。
  5. 多数の同時更新操作があるかどうかを確認します。多数の同時更新操作により、CPU スパイクが発生する可能性があります。更新操作の頻度を調整したり、更新操作をマージしたりすることで、同時更新による CPU への影響を軽減できます。
  6. ハードウェアのアップグレードとサーバー リソースの最適化を検討する: データベースの CPU が引き続き急増し、上記の最適化方法を試した場合は、サーバー ハードウェアをアップグレードし、CPU コアの数とメモリ容量を増やしてパフォーマンスを向上させることを検討できます。要約すると、MySQL データベースの CPU が 100% に上昇した場合、クエリ ステートメントの最適化、データベース接続プール設定の調整、構成パラメータの最適化、データベース テーブル構造の最適化、および同時更新操作の削減によって問題を解決できます。問題が解決しない場合は、ハードウェアをアップグレードし、サーバー リソースを最適化することを検討してください。
6. 数百億のデータがテーブルに分割された後、ページごとにクエリを実行するにはどうすればよいですか?
  1. テーブル分割ルールを決定する: 時間、地域、ユーザー、その他の条件に応じてテーブルを分割するなど、実際のニーズとデータ特性に基づいて適切なテーブル分割ルールを選択します。
  2. ページング オフセットを計算する: 各ページに表示されるデータ量と現在のページ番号に基づいて、スキップする必要があるデータ量を計算し、ページング オフセットを取得します。
  3. ターゲット テーブルの検索: クエリ条件のキー フィールドに基づいて、クエリの対象となるターゲット テーブルを決定します。
  4. ターゲット テーブルのクエリ: クエリ条件とページング オフセットに従って、ターゲット テーブルのデータをクエリします。シャーディング ルールとインデックスを使用してクエリを高速化できます。
  5. 結果セットを返す: 表示またはさらなる処理のために、クエリされたデータをアプリケーションに返します。テーブルを分割した後にページング クエリを実行すると、テーブルをまたがる状況が発生する可能性があることに注意してください。つまり、ページング クエリは複数の分割テーブルを同時にクエリする必要があります。このとき、結合クエリや分散クエリなどの技術を利用して処理することができます。さらに、クエリ効率を向上させるために、データの総量や各テーブルの境界値などの一部の統計情報をテーブル シャーディング プロセス中に事前に計算して保存し、ページング クエリ中の最適化を促進することができます。まとめると、数百億のデータをテーブルに分割した後のページング クエリでは、テーブル分割ルールとクエリ条件に従ってターゲット テーブルを特定し、クエリのページング オフセットを計算する必要があります。同時に、インデックス作成や事前計算などのテクノロジーを使用して、クエリ効率を向上させることができます。
7. MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか?
  • 適切なインデックスを使用する: クエリ条件とテーブルの特性に基づいて適切なインデックスを作成し、クエリを高速化します。
  • フルテーブルスキャンを避ける: クエリされるデータ量を減らすために、インデックスのないクエリ条件の使用を避けます。
  • クエリ ステートメントの最適化: 複雑なクエリ ステートメントの使用を避け、適切なクエリ ステートメントを使用し、SELECT * の使用を避け、必要な列のみを選択します。
  • ページング クエリの最適化: LIMIT ステートメントを使用してページング クエリを実行し、大量のデータのクエリを回避します。
  • サブクエリと一時テーブルの使用を避ける: サブクエリと一時テーブルの使用は避けてください。クエリ ステートメントを書き直すか、JOIN を使用することで最適化できます。
  • 過剰な正規化を避け、データを適切に冗長化し、テーブル上の関連クエリの数を減らします。
  • テーブル構造の最適化: テーブル構造を適切に設計して、フィールドや不要なデータ型の使用が多すぎないようにします。
  • 構成パラメータの最適化: サーバーのハードウェア構成とデータベースの負荷に応じて MySQL 構成パラメータを調整し、パフォーマンスを向上させます。
8. MySQL のテーブル構造を最適化するにはどうすればよいですか?
  • 適切なデータ型を使用する: データを保存するために適切なデータ型を選択し、長すぎるまたは大きすぎるデータ型の使用を避けます。
  • 正則化と冗長性: 実際のニーズとクエリ頻度に基づいて、関連するクエリの数を減らすために正則化と冗長性が実行されます。
  • インデックスの合理的な使用: クエリ条件とテーブルの特性に基づいて適切なインデックスを作成し、クエリ速度を向上させます。
  • パーティション化されたテーブル: 大きなテーブルの場合、特定のフィールドの範囲に基づいてパーティション化を実行し、クエリとメンテナンスの効率を向上させることができます。
  • 垂直セグメンテーションと水平セグメンテーション: 非常に大きなテーブルの場合、垂直セグメンテーションと水平セグメンテーションによってテーブルを分割し、単一のテーブル内のデータ量を減らすことができます。
  • テーブルとサマリー テーブルのキャッシュ: クエリ頻度は高くても更新頻度が低いテーブルの場合、クエリ結果をテーブルにキャッシュしてクエリ速度を向上させることができます。
9. MySQL 構成パラメータを最適化するにはどうすればよいですか?
  • サーバーのハードウェア構成とデータベースの負荷に応じて、MySQL 構成パラメーターを調整してパフォーマンスを向上させます。
  • バッファ サイズを調整する: データベースのワークロードとメモリ サイズに応じて、innodb_buffer_pool_size、key_buffer_size などのパラメータを調整して、キャッシュ効果を向上させます。
  • 同時接続数を調整する: サーバーの負荷に応じて、max_connections パラメータを調整して同時接続数を制御します。
  • クエリ キャッシュ サイズを調整する: クエリの特性と頻度に応じて、query_cache_size パラメーターを調整して、クエリ キャッシュの効果を向上させます。
  • ログパラメータを調整する: 必要に応じて binlog_format、sync_binlog、およびその他のパラメータを調整して、ログの書き込みと同期速度を向上させます。
  • スロー クエリ ログを有効にする: スロー クエリ ログを有効にし、クエリ時間のしきい値に基づいてスロー クエリ ステートメントを特定し、それらを最適化します。
  • 定期的な最適化とメンテナンス: テーブルとインデックスを定期的に分析して最適化し、データベースのバックアップと最適化を実行して、データベースのパフォーマンスと安定性を維持します。

5.mysqlのセキュリティ

1. SQL インジェクションとは何ですか? SQL インジェクションを防ぐ方法は何ですか? 
SQLインジェクション(SQL Injection)は一般的なセキュリティ脆弱性攻撃手法で、攻撃者がユーザーが入力したデータに悪意のあるSQLコードを挿入し、アプリケーションがSQLクエリを実行する際に攻撃者が作成した悪意のあるコードを実行することで不正アクセスにつながります。データベースへのデータ漏洩や改ざん。
SQL インジェクション攻撃を防ぐには、次の対策を講じることができます。


パラメーター化されたクエリまたはプリペアド ステートメントを使用します。これは、ユーザーが入力したデータを SQL に直接接続するのではなく、パラメーターとして SQL クエリに渡すことで SQL インジェクションを防ぐ最も一般的な方法です。これにより、インジェクション攻撃を効果的に防ぐことができます。

入力の検証とフィルタリング: ユーザーが入力したデータを検証してフィルタリングし、正当な入力のみを受け入れ、特殊文字をエスケープします。正規表現やホワイトリストなどを使用して入力検証を実行できます。

ORM フレームワークを使用する: ORM フレームワークを使用すると、データベース操作を抽象化し、SQL ステートメントを手動で結合する機会を減らすことができるため、インジェクションの可能性が低くなります。

最小権限の原則: データベース ユーザーは最小限の権限を持つ必要があり、攻撃者によるデータベースの悪用を防ぐために必要な操作のみを実行できます。

ロギングと監視: データベース操作をタイムリーに記録および監視し、異常な操作をタイムリーに検出して、タイムリーな対策を講じることができます。

ファイアウォールと侵入検知システム: ファイアウォールや侵入検知システムなどのセキュリティ デバイスを使用して、侵入を監視および防止します。
要約すると、SQL インジェクション攻撃は、パラメーター化されたクエリ、入力検証とフィルタリング、ORM フレームワークの使用、最小特権の原則、ロギングと監視、セキュリティ デバイスなどのさまざまな手段を講じることによって効果的に防止できます。
 2. MySQL データベースのセキュリティを保護するにはどうすればよいですか?
  • 強力なパスワードを使用する: 複雑で長く、ランダムなパスワードを設定し、定期的に変更します。
  • アクセス権の制限:必要なユーザーのみを許可し、アクセス範囲を制限します。
  • データを定期的にバックアップする: データの損失を防ぐためにデータベースを定期的にバックアップし、バックアップ データを安全な場所に保管します。
  • アップデートとパッチ適用: 既知のセキュリティ脆弱性から保護するために、パッチとセキュリティ アップデートで MySQL とオペレーティング システムを最新の状態に保ちます。
  • ファイアウォールを使用する: ファイアウォールを使用して、MySQL ポートへのアクセスを制限し、承認された IP アドレスのみが接続できるようにします。
  • SSL/TLS を有効にする: SSL/TLS を使用して接続を暗号化し、データ送信のセキュリティを保護します。
  • 監視と監査: データベースのアクティビティを監視し、監査を実施して異常な動作を検出します。
  • 不要な機能を無効にする: 潜在的なセキュリティ リスクを軽減するために、不要な MySQL 機能とプラグインを無効にします。
3. MySQL データベースへのアクセスを制限するにはどうすればよいですか?
  • 強力なパスワードを作成する: ユーザーごとに強力なパスワードを作成し、定期的に変更します。
  • ユーザー権限を制限する: 過剰な権限を付与しないように、ユーザーに必要な最小限の権限のみを付与します。
  • ファイアウォールを使用する: ファイアウォールを使用して、MySQL ポートへのアクセスを制限し、承認された IP アドレスのみが接続できるようにします。
  • リモート アクセスを無効にする: MySQL へのリモート アクセスが必要ない場合は、構成ファイルでリモート アクセスを無効にすることができます。
  • ネットワーク アクセスを制限する: ネットワーク レベルで、ファイアウォールまたはネットワーク デバイスを介した MySQL サーバーへのアクセスを制限します。
  • SSL/TLS 暗号化接続を使用する: SSL/TLS 暗号化接続を有効にして、送信中のデータのセキュリティを保護します。
  • IP ホワイトリストを使用する: 特定の IP アドレスのユーザーのみが MySQL サーバーにアクセスできるようにします。
4. MySQL データベース内の機密データを保護するにはどうすればよいですか?
  • データの暗号化: 機密データを暗号化して保存し、データが盗まれた場合でも解読できないようにします。
  • データの感度を解除: ユーザーのプライバシーを保護するために、機密データの感度を解除します。
  • 厳格なアクセス制御: 必要なユーザーのみに機密データへのアクセスを許可し、アクセス許可を制限します。
  • 定期的な監査: 機密データのアクセス記録を定期的に監査し、異常な動作をタイムリーに検出します。
  • データベース ログを有効にする: MySQL のログ機能を有効にして、機密データのアクセスと変更の記録を記録します。
  • データベース セキュリティの強化: データベース サーバーのセキュリティをハッカーから保護し、機密データの漏洩を防ぎます。
  • データを定期的にバックアップする: データの損失や破損を防ぐために、機密データを定期的にバックアップし、バックアップ データを安全な場所に保存します。上記は、MySQL のセキュリティに関する面接での質問と回答です。お役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/weixin_39934453/article/details/133307559