[一般] コンピュータ クラシックの基本的な面接の質問 3 日目
1. mysql の 2 つの主要なエンジンについて説明してください
MySQL にはさまざまなストレージ エンジンがありますが、最も一般的な 2 つの主要なエンジンは InnoDB と MyISAM です。
2. 2 つの mysql エンジンの使用シナリオについて話しましょう。
MySQL の 2 つの主要なエンジンである InnoDB と MyISAM は、さまざまな使用シナリオに適しています。その主な用途と適切なアプリケーション シナリオは次のとおりです。
- InnoDB エンジン:
- トランザクション サポート: InnoDB は MySQL のデフォルトのトランザクション ストレージ エンジンであるため、電子商取引 Web サイト、銀行システム、注文処理システムなど、トランザクション サポートを必要とするアプリケーションに非常に適しています。これにより、データの一貫性と整合性だけでなく、トランザクションのアトミック性、一貫性、分離性、耐久性 (ACID プロパティ) も保証されます。
- 高い同時実行パフォーマンス: InnoDB は行レベルのロックをサポートしているため、複数の同時ユーザーが同じテーブルの異なる行に同時にアクセスできるため、同時実行パフォーマンスが向上します。これは、同時に多数のオンライン ユーザーがいるアプリケーションにとって重要です。
- 外部キー制約: データベースでテーブル間の関係と参照整合性を維持する必要がある場合は、外部キー制約をサポートしている InnoDB を選択することをお勧めします。
適切なアプリケーションシナリオ:
- トランザクションアプリケーション
- 高度な同時読み取りおよび書き込み操作
- 外部キーのサポートが必要なアプリケーション
- 高いデータ整合性と一貫性要件が必要なアプリケーション
- MyISAM エンジン:
- 読み取り集中型アプリケーション: MyISAM は、大量の読み取り操作を処理する場合に非常に優れたパフォーマンスを発揮します。テーブルレベルのロックを使用するため、同時書き込み操作がほとんどない、ブログ、ニュース Web サイト、データ ウェアハウスなどの読み取り集中型のアプリケーションに適しています。
- トランザクションのサポートは不要: MyISAM はトランザクションをサポートしていないため、ACID プロパティを必要としないアプリケーション向けに検討される可能性があります。データの一貫性と整合性がアプリケーションにとって重要な問題ではなく、パフォーマンスが主な懸念事項である場合は、MyISAM が選択肢になる可能性があります。
- 一時テーブル: MyISAM は、中間結果を保存したりデータをキャッシュしたりするための一時テーブルを作成するためによく使用されます。
適切なアプリケーションシナリオ:
- 読み取り集中型アプリケーション
- シンプルなクエリとレポートの生成
- トランザクションサポートを必要としないアプリケーション
- 一時テーブルとキャッシュの要件
3. MySQL の最適化方法は何だと思いますか?
- 適切なインデックス設計:
- 適切なインデックスを作成すると、クエリのパフォーマンスが大幅に向上します。一般的なクエリでインデックスを使用できるように、テーブル内のフィールドが適切に選択され、計画されていることを確認してください。
- クエリの最適化:
- 適切な SQL クエリを使用し、SELECT * の使用を避け、必要な列のみを選択し、データ転送を最小限に抑えます。
- EXPLAIN を使用してクエリ実行プランを分析し、クエリを最適化します。
- ハードウェアの最適化:
- 高速ディスク、大容量メモリ、マルチコア プロセッサなどの高性能ハードウェアを使用して、データベース サーバーのパフォーマンスを向上させます。
- SSD を使用してディスク I/O 操作を高速化し、読み取りおよび書き込みの遅延を短縮します。
- バッファを調整します。
- バッファ プール サイズ、クエリ キャッシュなどの MySQL のバッファ パラメータを調整して、データがメモリ内で適切に管理されアクセスされるようにします。
- パーティションとサブテーブル:
- 大きなテーブルの場合は、クエリのパフォーマンスを向上させるためにデータをより小さな部分に分割するパーティショニングまたはサブテーブルを検討できます。
- 定期メンテナンス:
- データベースのパフォーマンスを維持するために、テーブルの最適化、インデックスの再構築、使用されなくなったデータのクリーンアップなどの定期的なデータベース メンテナンスを実行します。
- 適切なストレージ エンジンを使用します。
- トランザクションまたは読み取り/書き込みのニーズを満たすアプリケーションのニーズに基づいて、InnoDB や MyISAM などの適切なストレージ エンジンを選択します。
- 分散アーキテクチャ:
- 高負荷アプリケーションの場合は、水平方向のスケーラビリティを実現するために、MySQL Cluster やシャーディングなどの分散データベース アーキテクチャを検討してください。
- クエリキャッシュとキャッシュレイヤー:
- クエリ キャッシュまたは Memcached や Redis などのキャッシュ レイヤーを使用して、データベース サーバーの負荷を軽減します。
- 監視とログ分析:
- 監視ツールとログ分析を使用してデータベースのパフォーマンスを追跡し、問題を迅速に特定して解決します。
- SQL オプティマイザーのヒント:
- SQL_HINTS を使用して、MySQL オプティマイザーにクエリを実行するように指示します。これは、インデックス ヒント、クエリ キャッシュ ヒントなどを通じて実現できます。
- 接続プールの管理:
- 接続プールを使用してデータベース接続を管理すると、接続のオーバーヘッドが削減され、同時実行パフォーマンスが向上します。
- テーブル構造を最適化します。
- 適切なデータ型を使用し、NULL 値を回避し、データを正規化してデータ ストレージを削減し、クエリのパフォーマンスを向上させることを検討してください。
- バックアップとリカバリの戦略:
- データ損失やハードウェア障害を防ぐために、効果的なバックアップおよびリカバリ戦略を確立します。
4. インデックスが無効になる原因となるクエリ条件は何ですか?
- 関数または式の使用: 関数または式をクエリ条件で使用すると、通常、インデックスのエラーが発生します。たとえば、
WHERE YEAR(date_column) = 2023
データベースは年を検索するためにインデックスを直接使用できないため、これによりインデックスが無効になります。- インデックス列で型変換が実行される: 整数列を文字列に強制するなど、クエリ内のインデックス列で型変換が実行されると、インデックスが無効になる可能性があります。
- あいまい検索のためのインデックス列の先頭でのワイルドカードの使用: インデックス列の先頭でワイルドカード ( など) を使用すると
LIKE '%keyword'
、インデックスが効率的に使用されないことがよくあります。データベースが一致するものをすぐに見つけることができないため、先頭にワイルドカードを使用するとインデックスが無効になります。- NOT 演算子を使用する:
NOT
演算子を使用してクエリ条件を否定すると、インデックスが無効になる可能性があります。たとえば、WHERE NOT column_name = 'value'
。- OR 演算子を使用する
OR
:演算子を使用して複数の条件を接続する場合、いずれかの条件でインデックスを使用できない場合、クエリ全体によってインデックスが失敗する可能性があります。- 不等演算子 (!= または <>) を使用する: 場合によっては、特に不等演算子がデータの大部分をカバーする場合、不等演算子を使用したフィルター処理によってインデックス エラーが発生する可能性があります。
- 不均一なデータ分布: データがインデックス列全体に不均一に分布している場合、つまり、ある値が非常に頻繁に出現し、他の値がほとんど出現しない場合、頻繁に出現する値にはインデックスが使用されない可能性があります。
- インデックス列が計算に参加する: クエリ内の条件にインデックス列の計算が含まれる場合、インデックスが無効になる可能性があります。たとえば、
WHERE column1 * 2 = 10
。- テーブルが小さすぎる: テーブルが非常に小さい場合、データベース エンジンがデータをより速くフェッチするためにテーブル全体のスキャンを選択する可能性があるため、インデックスを使用してもパフォーマンスが大幅に向上しない可能性があります。
- データ型の不一致: クエリ条件のデータ型がインデックス列のデータ型と一致しない場合、インデックスが失敗する可能性があります。
5. mysqlのインデックス分類について話しましょう
- B ツリー インデックス:
- B ツリー インデックスは MySQL で最も一般的なインデックス タイプであり、デフォルトのインデックス タイプでもあります。
- これは、等価クエリ、範囲クエリ、並べ替え操作で機能します。
- B ツリー インデックスは、数値、文字列、日付など、ほとんどのデータ型に適しています。
- InnoDB ストレージ エンジンのデフォルトのインデックス タイプは B ツリー インデックスです。
- ハッシュインデックス:
- ハッシュ インデックスは等価クエリに適しています。つまり、完全一致の場合にのみ使用できます。
- 特定のシナリオでは非常に高速なクエリ速度を実現できますが、範囲クエリや並べ替え操作には適していません。
- ハッシュ インデックスは通常、メモリ ストレージ エンジンで使用され、永続ストレージをサポートしません。
- 全文索引:
- 全文インデックス作成はテキスト データに適しており、全文検索の実装に使用されます。
- 単語を含むテキストフィールドを処理でき、高度な検索および並べ替え機能をサポートします。
- MyISAM と InnoDB ストレージ エンジンは両方ともフルテキスト インデックス作成をサポートしていますが、MyISAM のフルテキスト インデックス作成機能はより強力です。
- 空間インデックス:
- 空間インデックスは、座標点、線、エリアなどの地理空間データの処理に適しています。
- 包含、交差、距離計算などの空間ジオメトリ操作をサポートします。
- MySQL は R ツリー インデックスを使用して空間インデックスを実装し、InnoDB および MyISAM ストレージ エンジンをサポートします。
- プレフィックスインデックス:
- 接頭辞インデックスは、列全体ではなく、列の最初の N 文字に基づいて作成されるインデックスです。
- これを使用すると、精度が犠牲になる可能性がありますが、インデックスのサイズを削減し、クエリのパフォーマンスを向上させることができます。
- プレフィックス インデックスは、長いテキスト列を処理するためによく使用されます。
- 複合インデックス:
- 複合インデックスは、複数の列を 1 つのインデックスに結合して、複数列のクエリをサポートします。
- 複数列の条件付きクエリのパフォーマンスを向上させることができますが、最適なパフォーマンスを確保するには慎重に設計する必要があります。
- 複合インデックスの順序とどの列が選択されるかは非常に重要です。
- 一意のインデックス:
- 一意のインデックスにより、インデックス付き列の値が一意であることが保証され、値の重複は許可されません。
- 一意のインデックスを使用して、主キーまたは一意の制約を実装できます。
- データを挿入または更新するとき、MySQL は一意のインデックスをチェックしてデータの一意性を確認します。
- 主キーインデックス (主キーインデックス) :
- 主キー インデックスは、テーブル内の各行を一意に識別する特別な一意のインデックスです。
- 主キー インデックスはテーブルごとに 1 つだけ存在でき、通常は主キー列と一緒に定義されます。
- 主キー インデックスはテーブルの物理的な並べ替え順序であるため、主キー列のクエリは通常非常に効率的です。
6. いくつかの Linux コマンドをリストします。
- ls : 現在のディレクトリ内のファイルとサブディレクトリを一覧表示します。
ls
- pwd : 現在の作業ディレクトリのパスを表示します。
pwd
- cd : 現在のディレクトリを変更します。
cd /path/to/directory
- mkdir : 新しいディレクトリを作成します。
mkdir new_directory
- touch : 新しいファイルが作成または更新されたときのタイムスタンプ。
touch filename
- cp : ファイルまたはディレクトリをコピーします。
cp source_file destination
- mv : ファイルを移動するか、ファイルの名前を変更します。
mv old_name new_name
- rm : ファイルまたはディレクトリを削除します。
rm filename
- cat : ファイルの内容を表示します。
cat filename
- less : ファイルの内容をページごとに表示します。
less filename
- head : ファイルの最初の数行を表示します。
head -n 10 filename
- tail : ファイルの最後の数行を表示します。
tail -n 10 filename
- grep : ファイル内のテキスト パターンを検索します。
grep pattern filename
- ps : 実行中のプロセスを表示します。
ps aux
- kill : 実行中のプロセスを終了します。
kill process_id
- ifconfig : ネットワークインターフェース情報を表示します。
ifconfig
- ping : リモート ホストへのネットワーク接続をテストします。
ping remote_host
- ssh : SSH プロトコル経由で別のコンピューターにリモートでログインします。
ssh username@hostname
- top : システムリソースの使用状況と実行中のプロセスをリアルタイムで表示します。
top
- tar : アーカイブ ファイル (通常は .tar.gz または .tar.bz2 ファイル) を作成または解凍します。
tar -zxvf archive.tar.gz
7. Linux の > と >> の違い、よく使われるログ表示コマンド
Linux では、
>
および は>>
出力をリダイレクトするために使用される特殊なシンボルであり、次のような違いがあります。
- >:
>
シンボルは、コマンドの出力をファイルにリダイレクトするために使用されます。ターゲット ファイルが既に存在する場合、元の内容は上書きされます。- たとえば、
command > file
コマンドの出力をfile
という名前のファイルに書き込みます。ファイルが存在しない場合は新しいファイルが作成され、ファイルが既に存在する場合は元の内容がクリアされて新しい出力が書き込まれます。例:
echo "Hello, World!" > output.txt
これにより、新しいファイルが作成され
output.txt
、そのファイルに文字列「Hello, World!」が書き込まれます。
- >>:
>>
シンボルは、コマンドの出力をファイルにリダイレクトするためにも使用されますが、>
ターゲット ファイルがすでに存在する場合とは異なり、>>
新しい出力は既存の内容に追加されます。- 例:
command >> file
コマンドの出力をfile
という名前のファイルの末尾に追加します。例:
echo "Appended text." >> output.txt
これにより、既存のファイル
output.txt
の末尾に「追加されたテキスト」というテキストが追加されます。ログを表示するために一般的に使用されるコマンド:
- 猫:
cat
ファイルの内容を表示するコマンド。小さなファイルの内容を表示するために使用できます。例:
cat filename
- 以下:
less
これは、検索および参照機能を提供しながら、大きなファイルをページごとに表示するために使用できるページビューアです。例:
less filename
では
less
、矢印キーを使用して上下にスクロールし、/
キー検索し、q
キーを押して終了します。
- 尻尾:
tail
このコマンドは、ファイルの最後の数行を表示するために使用されます。デフォルトでは、最後の 10 行が表示されます。例:
tail filenameb
このオプションを使用して
-n
表示する行数を指定できます。たとえばtail -n 20 filename
、最後の 20 行が表示されます。
- 頭:
head
このコマンドは、ファイルの最初の数行を表示するために使用されます。デフォルトでは、最初の 10 行が表示されます。例:
head filename
このオプションを使用して
-n
表示する行数を指定できます。たとえばhead -n 20 filename
、最初の 20 行が表示されます。
8. scp コマンドについてのあなたの理解を教えてください。
SCP (Secure Copy Protocol) は、異なるシステム間でファイルとディレクトリを安全にコピーするためのコマンド ライン ツールです。SSH プロトコルに基づいて構築されており、データの暗号化と認証を提供するため、データ送信は安全です。
SCP コマンドの基本的な構文は次のとおりです。
scp [options] source destination
source
: コピーするファイルまたはディレクトリのソース パス。ローカル ファイル システム パスまたはリモート ホスト上のファイル パスを指定できます。リモート パスの場合は、通常、次のuser@host:source_path
形式で指定します。 はuser
リモート ホストのユーザー名、host
はリモート ホストのホスト名または IP アドレス、 はsource_path
ソース ファイルまたはディレクトリへのパスです。destination
: コピー先のパス。繰り返しますが、これはローカル ファイル システム パスまたはリモート ホスト上のパスにすることができます。リモート パスの場合は、user@host:destination_path
フォームでも指定します。一般的な SCP オプションは次のとおりです。
-r
: 再帰的コピー。ディレクトリとその内容をコピーするために使用されます。-P
:リモートSSHポート番号を指定します。-i
:認証に使用する秘密鍵ファイルを指定します。-v
: デバッグ目的で詳細出力を有効にします。SCP の一般的な用途には次のようなものがあります。
- ファイルまたはディレクトリをローカル システムからリモート ホストにコピーします。
scp local_file user@remote_host:remote_path
- ファイルまたはディレクトリをリモート ホストからローカル システムにコピーします。
scp user@remote_host:remote_file local_path
- リモート ホスト間でファイルまたはディレクトリをコピーします。
scp user1@remote_host1:source_path user2@remote_host2:destination_path
- 別の SSH ポート番号を使用します。
scp -P 2222 local_file user@remote_host:remote_path
9. tar コマンドについてのあなたの理解を教えてください
tar
(テープ アーカイブ) は、Unix および Linux システムでファイルとディレクトリのアーカイブを作成、表示、抽出、圧縮するために一般的に使用されるコマンド ライン ツールです。tar
このコマンドは通常、バックアップ、転送、またはアーカイブのために複数のファイルとディレクトリを 1 つのファイルにパッケージ化するために使用されます。tar
コマンドについての私の理解は次のとおりです。
tar
コマンドの基本的な構文は次のとおりです。tar [选项] [目标] [源]
一般的な
tar
オプションは次のとおりです。
-c
:新しいアーカイブファイルを作成します。-x
: アーカイブからファイルを抽出します。-t
: アーカイブ内のファイルを一覧表示します。-f
: アーカイブファイルの名前を指定します。-v
: 詳細情報を表示します。通常は、抽出または作成されたファイルのリストを表示するために使用されます。-z
: 圧縮/解凍には gzip を使用します。-j
:圧縮・解凍にはbzip2を使用します。-C
: ファイルを解凍するときにターゲット ディレクトリを指定します。一般的なコマンドの例をいくつか
tar
示します。
- アーカイブを作成します。
tar -cvf archive.tar file1 file2 directory1
これにより、 、 、および を
archive.tar
含むという名前のアーカイブ ファイルが作成されます。file1
file2
directory1
- アーカイブ ファイルを抽出します。
tar -xvf archive.tar
これにより、
archive.tar
そこからすべてのファイルとディレクトリが抽出されます。
- アーカイブの内容を表示します。
tar -tvf archive.tar
これにより、
archive.tar
内のファイルがリストされます。
- gzip 圧縮を使用します。
tar -czvf archive.tar.gz directory1
これにより、gzip を使用してペアが圧縮され
directory1
、archive.tar.gz
という名前のアーカイブが作成されます。
- gzip 圧縮されたアーカイブを解凍します。
tar -xzvf archive.tar.gz
これにより、
archive.tar.gz
中のファイルが解凍されて抽出されます。
tar
これらのコマンドは非常に便利で、バックアップ、ファイルの移行、ソフトウェア配布パッケージの作成などのタスクに使用できます。これは、Unix および Linux システムの標準ツールの 1 つであり、ニーズに応じて構成できる豊富なオプションと機能を備えています。詳細については、コマンドtar
を使用してコマンドのマニュアル ページを表示できますman tar
。