データベースは、リレーショナルデータベースと非リレーショナルデータベースに分けられます。これらは、SQLとNoSQLと呼ばれます。これらの2つの方向におけるデータベースの代表的な製品は、MySQLとRedisです。今回は、主にインタビューの質問と回答という形で関係について学びます。 MySQLデータベースの基本的な知識。
面接が始まります、面接官の魂の拷問を受け入れる準備をしてください!
関係データベース
リレーショナルデータベースとは
リレーショナルデータベースとは、リレーショナルモデルを使用してデータを整理するデータベースのことです。ユーザーが理解しやすいように、データは行と列の形式で格納されます。リレーショナルデータベースの一連の行と列は、テーブルと呼ばれ、テーブルのグループで構成されます。データベース。ユーザーはクエリによってデータベース内のデータを取得します。クエリは、データベース内の特定の領域を制限するために使用される実行コードです。
簡単に言えば、リレーショナルモデルは2次元のテーブルモデルです。
リレーショナルデータベースの利点は何ですか?
リレーショナルデータベースの利点:
-
わかりやすい
リレーショナル2次元テーブルの構造は実世界に非常に近く、2次元テーブルはわかりやすいです。
-
複雑なクエリのサポート:SQLステートメントを使用して、テーブルと複数のテーブルの間で非常に複雑なデータクエリを簡単に実行できます。
-
信頼性の高いトランザクション処理をサポートし、トランザクションの整合性を維持することで、高いセキュリティパフォーマンスを備えたデータアクセス要件を実現できます。
MySQLデータベース
SQLとは
SQLと略される構造化照会言語(Structured Query Language)は、特別な目的のプログラミング言語であるデータベースクエリおよびプログラミング言語プログラミング言語であり、データへのアクセスとクエリ、リレーショナルデータベースシステムの更新および管理に使用されます。
MySQLとは何ですか?
MySQLはリレーショナルデータベース管理システムです。MySQLは最も人気のあるリレーショナルデータベース管理システムの1つです。一般的なリレーショナルデータベースには、Oracle、SQL Server、Accessなどがあります。
MySQLは、その高性能、低コスト、および優れた信頼性により、これまで最も人気のあったオープンソースデータベースになり、インターネット上の中小規模のWebサイトで広く使用されてきました。
MySQLとMariaDBは愚かに不明瞭ですか?
MySQLはもともとスウェーデンの会社MySQL ABによって開発されました。MySQLの創設者はUlf Mikhail Videnius(通称モンティ)です。
Oracleに買収された後、Oracleの製品になりました。OracleはMySQL商用版の価格を大幅に引き上げたため、フリーソフトウェアコミュニティは、OracleがMySQLコミュニティ版を引き続きサポートするかどうかを心配していました。
MySQLの創設者は、MySQLに基づいてMariaDBブランチプランを確立したMontyという元ボスです。
MariaDBは、MySQLとの高度な互換性を維持し、ライブラリバイナリパリティの直接置換機能と、MySQL API(アプリケーションプログラムインターフェイス)およびコマンドとの完全な一致を確保する予定です。MySQLを使用していた元のオープンソースソフトウェアは、徐々にMariaDBまたは他のデータベースに移行しました。
ですから、あなたの会社がMariaDBを使用していることがわかったとしても、それを疑うことはありません。
イースターエッグ
MySQLが他の娘にちなんで名付けられたように、MariaDBはモンティの末っ子のマリアにちなんで名付けられました。私の2つの有名なデータベースは2人の娘にちなんで名付けられました。
MySQLの現在のバージョン番号を確認するにはどうすればよいですか?
システムコマンドラインの下:mysql -V
MySQLコマンドラインに接続し、次のように入力します。
> status
;
Server: MySQL
Server version: 5.5.45
Protocol version: 10
または select version();
+------------------------+
| version() |
+------------------------+
| 5.5.45-xxxxx |
+------------------------+
基本的なデータ型
MySQLにはどのようなデータ型がありますか?
MySQLのデータ型は非常に豊富で、一般的な型は次のように簡単に紹介されています。
整数型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
浮動小数点タイプ:FLOAT、DOUBLE、DECIMAL
文字列型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
日付タイプ:Date、DateTime、TimeStamp、Time、Year
その他のデータ型:BINARY、VARBINARY、ENUM、SET
...
CHARとVARCHARの違いは何ですか?
CHARは固定長の文字型であり、VARCHARは可変長の文字型です次の説明はMySQL 5.0以上に基づいています。
共通グラウンド
CHAR(M)とVARCHAR(M)はどちらも、列がM 文字を格納できることを示しています。これはバイトではないことに注意してください。!
CHAR型の特徴
-
CHARは最大255 文字(バイトではないことに注意)を格納でき、UTF8エンコーディング(3バイト)、GBKエンコーディング(2バイト)など、異なるエンコーディングセットを持っています。
-
以下のための
CHAR(M)
保存された実際のデータの長さが小さいM未満である場合、MySQLは自動的にその右側に空白文字を占めるようになるが、フィル空白文字のこれらのうち、検索操作で除去されます。
VARCHARタイプの特性
-
VARCHARの最大長は65535 バイトです。
-
VARCHARは、実際の文字列に実際の文字列の長さを記録するために1または2バイトを加えたものを格納します。文字列の長さが255バイト未満の場合は1バイトを使用して記録し、255バイトを超える場合は2バイトを記録する必要があります。[^ 12]
VARCHAR(50)には漢字をいくつ格納できますか?
格納される漢字の数はバージョンに関連しています。
mysql 4.0より前のバージョンの場合、varchar(50)は50 バイトを指し ます。UTF8形式でエンコードされた中国語の文字(中国語の文字ごとに3バイト)を保存する場合、保存できるのは16文字のみです。
mysql 5.0以降では、varchar(50)は50 文字を指し ます。数字、文字、UTF8エンコードされた中国語の文字のいずれで保存されている場合でも、50文字を保存できます。
int(10)とbigint(10)のデータサイズを同じにすることはできますか?
具体的な理由は次のとおりです。
-
intは4バイトの符号付き整数を格納できます。
-
bigintは、8バイトの符号付き整数を格納できます。
したがって、格納できるデータのサイズは異なり、データ内の数値 10
はデータの表示幅のみを表します。[^ 13]
-
表示幅はMysqlで表示できる最大数を示します。桁数が指定した幅より少ない場合、数字の左側がスペースで埋められて見づらくなります。
-
表示幅よりも大きい値を挿入した場合、その値が型の値の範囲を超えない限り、値を挿入して表示できます。
-
表作成時に
zerofill
オプションを指定した 場合、表示幅未満の部分が0
塗りつぶされ、1の場合は表示されます0000000001
。 -
表示幅が指定されていない場合、bigintのデフォルトの幅は20で、intのデフォルトの幅は11です。
ストレージエンジン関連
MySQLストレージエンジンのタイプは何ですか?
一般的に使用されるストレージエンジンには、InnoDBストレージエンジンとMyISAMストレージエンジンが含まれます。InnoDBはMySQLのデフォルトのトランザクションエンジンです。
データベーステーブルの現在サポートされているエンジンを表示するには、次のクエリステートメントを使用して表示できます。
# 查询结果表中的 Engine 字段指示存储引擎类型。
show table status from 'your_db_name' where name='your_table_name';
InnoDBストレージエンジンのアプリケーションシナリオは何ですか?
InnoDBはMySQLのデフォルトの「トランザクションエンジン」であり、多数の短期トランザクションを処理するように設定されています。短期トランザクションのほとんどは通常コミットされ、めったにロールバックされません。
InnoDBストレージエンジンの特徴は何ですか?
マルチバージョン同時実行制御(MVCC)は、高い同時実行性をサポートするために使用されます。また、4つの標準分離レベルが実装されており、ギャップロックnext-key locking
ストラテジーによってファントムリードが表示されないようにします。
エンジンテーブルはクラスター化インデックスに基づいて構築されており、主キークエリに対して高いパフォーマンスを発揮します。ただし、そのセカンダリインデックスのsecondary index
非プライマリキーインデックスにはプライマリキー列が含まれている必要があるため、プライマリキー列が大きい場合、他のすべてのインデックスも大きくなります。したがって、テーブルにさらに多くのインデックスがある場合は、主キーをできるだけ小さくする必要があります。さらに、InnoDBのストレージフォーマットはプラットフォームに依存しません。
InnoDBは、ディスク読み取りデータの予測可能な先読み、メモリ内のハッシュインデックスの自動作成による読み取り操作の高速化、挿入操作の高速化が可能な適応ハッシュインデックスなど、多くの最適化を行いました。バッファーの挿入(バッファーの挿入)など
InnoDBは、いくつかのメカニズムとツールを通じて真のホットバックアップをサポートしています。他のMySQLストレージエンジンはホットバックアップをサポートしていません。一貫性のあるビューを取得するには、すべてのテーブルへの書き込みを停止する必要があります。読み取りと書き込みが混在するシナリオでは、書き込みを停止することもできます読むのをやめる。
InnoDBエンジンの4つの主要な機能は何ですか?
バッファを挿入
バッファーの挿入は、非クラスター化インデックスの挿入および更新操作に使用されます。最初に、挿入された非クラスター化インデックスがバッファープールにあるかどうかを判断します。ある場合は直接挿入し、それ以外の場合はInsert Bufferオブジェクトに挿入します。次に、特定の頻度で挿入バッファーと補助インデックスリーフノードのマージ操作を実行し、複数の挿入を1つの操作にマージして、非クラスター化インデックスの挿入パフォーマンスを向上させます。
二重書き
二重書き込みは2つの部分で構成されます。1つはメモリ内の二重書き込みバッファ、サイズは2MB、もう1つは物理ディスク上の共有テーブルスペースの連続128ページで、サイズも2MBです。バッファプールのダーティページを更新するとき、ダーティページはディスクに直接書き込まれませんが、最初にmemcpy関数を介してダーティページがメモリ内の領域にコピーされ、次に、1 MBが順次書き込まれるたびに、二重書き込みバッファによって2回に分割されます。共有テーブルスペースの物理ディスクで、すぐにfsync関数を呼び出してディスクを同期し、オペレーティングシステムのバッファー書き込みによる問題を回避します。
適応ハッシュインデックス(適応ハッシュインデックス)
InnoDBは、アクセスの頻度とモードに応じてホットページのハッシュインデックスを作成し、クエリの効率を向上させます。インデックスはバッファプールのB +ツリーページによって構築されるため、確立速度は非常に高速です。InnoDBストレージエンジンは、テーブルの各インデックスページのクエリを監視します。ハッシュインデックスの確立により速度が向上することが確認された場合、Haの確立ギリシャ語のインデックスなので、適応ハッシュインデックスと呼ばれます。
バッファプール
データベースのパフォーマンスを向上させるために、バッファープールの概念が導入されました。パラメーターinnodb_buffer_pool_sizeはバッファープールのサイズを設定でき、パラメーターinnodb_buffer_pool_instancesはバッファープールのインスタンス数を設定できます。バッファプールは主に以下を保存するために使用されます:
バッファプールにキャッシュされるデータページのタイプは、インデックスページ、データページ、元に戻すページ、挿入バッファ、アダプティブハッシュインデックス、InnoDBに格納されているロック情報、およびデータディクショナリ情報です。 (データ辞書)。
MyISAMストレージエンジンのアプリケーションシナリオは何ですか?
MyISAMは、MySQL 5.1以前のバージョンのデフォルトのストレージエンジンです。MyISAMは、フルテキストインデックス作成、圧縮、空間関数(GIS)などを含む多数の機能を提供しますが、MyISAMは「トランザクションおよび行レベルのロックをサポート」していません。読み取り専用のデータ、または小規模で修復操作を許容できるテーブルの場合、それらを引き続き使用できます。それ。
MyISAMストレージエンジンの機能は何ですか?
MyISAMは「行レベルのロックをサポートしていませんが、テーブル全体をロックしています。」読み取り時には、読み取りが必要なすべてのテーブルに共有ロックが追加され、書き込み時には、テーブルに排他ロックが追加されます。ただし、テーブルに読み取り操作がある間は、同時挿入と呼ばれる新しいレコードをテーブルに挿入することもできます。
MyISAMテーブルは、手動または自動でチェックおよび修復できます。ただし、トランザクション回復やクラッシュ回復とは異なり、「データ損失」が発生する可能性があり、修復操作は非常に遅くなります。
MyISAMテーブルでは、同じ長さのフィールドBLOB
でもTEXT
最初の500文字に基づいてインデックスを作成できます。MyISAMは、複雑なクエリをサポートできる単語のセグメンテーションに基づいて作成されたインデックスである「フルテキストインデックス」もサポートしています。
DELAY_KEY_WRITE
オプションが指定されている場合、変更が実行されるたびに、変更されたインデックスデータはすぐにはディスクに書き込まれませんが、キーバッファーがクリアされるかテーブルが閉じられた場合にのみ、メモリ内のキーバッファーに書き込まれます対応するインデックスブロックをディスクに書き込みます。この方法は書き込みパフォーマンスを大幅に改善できますが、データベースまたはホストがクラッシュすると、「インデックスの損傷」が発生し、修復操作を実行する必要があります。
MyISAMとInnoDBストレージエンジンの5つの主な違い
-
InnoDBはサポートしていますが、MyISAMはサポートしていません
-
InnoDBは行レベルのロックをサポートしていますが、MyISAMはテーブルレベルのロックをサポートしています
-
InnoDBはMVCCをサポートしていますが、MyISAMはサポートしていません
-
InnoDBは外部キーをサポートしていますが、MyISAMはサポートしていません
-
InnoDBは全文索引付けをサポートしていませんが、MyISAMはサポートしています
次の表は、2つのエンジンの主な違いを示しています。
SELECT COUNT(*)はどのエンジンより高速に動作しますか?
SELECT COUNT(*)
多くの場合、テーブル内の行の総数をカウントするために使用されます。MyISAMストレージエンジンでは、WHERE条件を追加できない場合に高速です。
これは、MyISAMがテーブルの行数を最適化するためです。変数を使用してテーブルの行数を格納します。クエリ条件にWHERE条件がない場合は、クエリテーブルにあるデータの数を示します。MyISAMは結果をすばやく返すことができます。WHEREが追加された場合条件は機能しません。
InnoDBテーブルには、テーブルの行数を格納する変数もありますが、この値は推定値であるため、あまり実用的な意味はありません。
MySQLの基本
データベース設計の3つのパラダイムは何ですか?
1パラダイム:1NFは属性のアトミック制約であり、属性はアトミックであり、分解できない必要があります(リレーショナルデータベースである限り、1NFは満たされます)
2パラダイム:2NFはレコードに対する一意の制約であり、レコードを一意に識別する必要があります。つまり、エンティティの一意性です。
3パラダイム:3NFはフィールドの冗長性に対する制約です。つまり、どのフィールドも他のフィールドから派生させることはできず、フィールドの冗長性は必要ありません。冗長なデータベース設計を行うことはできません
ただし、冗長性のないデータベースは最適なデータベースではない場合があります。運用効率を向上させるために、パラダイム標準を下げて適切に冗長データを保持する必要がある場合があります。具体的な方法は、概念データモデルを設計するときに3番目のパラダイムに準拠し、パラダイム標準を下げることです。この作業は、物理データモデルを設計するときに考慮されます。パラダイムを減らすことは、フィールドを増やして冗長性を可能にすることです。
SQLステートメントの分類は何ですか?
-
DDL:データ定義言語(create alter drop)
-
DML:データ操作ステートメント(挿入、更新、削除)
-
DTL:データトランザクションステートメント(commit collback savapoint)
-
DCL:データ制御ステートメント(取り消しを許可)
データベースの削除操作での削除、削除、切り捨ての違いは何ですか?
-
テーブルが不要になった場合は、dropを使用してテーブルを削除できます。
-
テーブルを保持したいが、すべてのレコードを削除したい場合は、truncateを使用してテーブル内のレコードを削除します。
-
一部のレコードを削除する場合(通常はWHERE句の制約があります)、deleteを使用してテーブル内の一部のレコードを削除します。
MySqlビューとは何ですか?
ビューは仮想テーブルであり、データを格納せず、定義時のステートメントの動的データのみを格納します。
ビュー構文を作成します。
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
パラメータの説明:
-
OR REPLACE:ビューが存在する場合は、既存のビューを置き換えます。
-
ALGORITHM:ビュー選択アルゴリズム。デフォルトのアルゴリズムはUNDEFINED(未定義)であり、MySQLは使用するアルゴリズムを自動的に選択します。
-
DEFINER:ビューの作成者または定義者を指定します。このオプションを指定しない場合、ビューを作成したユーザーが定義者になります。
-
SQL SECURITY:SQLセキュリティー。デフォルトはDEFINERです。
-
select_statement:ビューを作成するSELECTステートメント。ベーステーブルまたは他のビューからデータを選択できます。
-
WITH CHECK OPTION:ビューが更新されたときに拘束されることが保証されていることを示します。デフォルトはCASCADEDです。
MySQLビューを使用する利点は何ですか?
-
操作はシンプルで便利です。ビューのユーザーは、ビューに対応するテーブルの構造、関連付け条件、およびフィルター条件をまったく気にする必要がありません。ユーザーにとっては、フィルターされた複合条件の結果セットです。
-
データはより安全です。ビューユーザーはビューの結果セットにのみアクセスでき、ビューはテーブルへのアクセスを特定の行と列に制限できます。
-
データの分離。ソーステーブル構造の変更によるユーザーへの影響はシールドされ、ソーステーブル構造が変更されても、ビュー構造は変更されません。^ 1
MySqlサービスのデフォルトのポート番号は何ですか?
デフォルトのポートは 3306
ポートコマンドの表示:> show variables like 'port';
DISTINCTで複数の列をフィルタリングする方法は?
DISTINCTは、選択したデータの重複を排除するために使用され、単一列の使用法は簡単に理解できます。たとえば、次のデータテーブル tamb
:
name number
Tencent 1
Alibaba 2
Bytedance 3
Meituan 3
クエリステートメント:SELECT DISTINCT name FROM table tamb
結果は次のとおりです。
name
Tencent
Alibaba
Bytedance
Meituan
必要に応じてnumber
表示することにより 、同時に列の重複排除機能 name
は、クエリ文を書くことがあります。
SELECT DISTINCT number, name FROM table tamb
マルチパラメータDISTINCT重複除外ルールは、DISTINCTの後のすべてのパラメータをフィルタ条件として扱います。つまり、(number, name)
全体的な重複除外が処理され、組み合わせが異なる場合にのみ重複が重複除外されます 。結果は次のとおりです。
number name
1 Tencent
2 Alibaba
3 Bytedance
3 Meituan
その結果、重複排除の効果が出ていないようですが、どうすれば「number
列の重複排除と同時表示 name
」を実現できるの でしょうか?次のGroup By
ステートメントを使用できます 。
SELECT number, name FROM table tamb GROUP BY number
出力は次のとおりです。これがまさに私たちが望むものです。
number name
1 Tencent
2 Alibaba
3 Bytedance
ストアドプロシージャとは何ですか?
1つ以上のSQLステートメントのコレクションには、次の特性があります。
-
ストアドプロシージャは、より速い実行速度を実現できます。
-
ストアドプロシージャは、フロー制御ステートメントで記述できます。フロー制御ステートメントは、柔軟性が高く、複雑な判断やより複雑な計算を完了することができます。
-
ストアドプロシージャは、セキュリティメカニズムとして完全に利用できます。
-
ストアドプロシージャはネットワークトラフィックを減らすことができます
delimiter 分隔符
create procedure|proc proc_name()
begin
sql语句
end 分隔符
delimiter ; --还原分隔符,为了不影响后面的语句的使用
--默认的分隔符是;但是为了能在整个存储过程中重用,因此一般需要自定义分隔符(除\外)
show procedure status like ""; --查询存储过程,可以不适用like进行过滤
drop procedure if exists;--删除存储过程
ストアドプロシージャと関数は似ているようですが、それらの違いは何ですか?
ストアドプロシージャと関数は、事前にコンパイルされ、データベースに保存されているSQLステートメントのコレクションです。ストアドプロシージャと関数を呼び出すと、アプリケーション開発者の多くの作業を簡略化し、データベースとアプリケーションサーバー間のデータ転送を減らし、データ処理を改善できます。効率は良いです。
同じ点
-
ストアドプロシージャと関数は、データベースを繰り返し実行するためのSQLステートメントのコレクションです。
-
ストアドプロシージャと関数は、一度コンパイルされた後にキャッシュされます。コンパイルされたSQLステートメントは、次に使用されるときに直接ヒットするため、ネットワークの相互作用を減らし、効率を向上させます。
差
-
識別子は異なり、関数の識別子はfunctionであり、ストアドプロシージャはprocedureです。
-
関数は単一の値またはテーブルオブジェクトを返しますが、ストアドプロシージャは値を返しませんが、OUTパラメーターを介して複数の値を返すことができます。
-
関数には多くの制限があります。たとえば、一時テーブルは使用できない、テーブル変数しか使用できない、一部の関数は使用できないなど、ストアドプロシージャの制限は比較的小さいです。
-
一般的に言って、ストアドプロシージャによって実現される関数はもう少し複雑であり、関数の関数実現はよりターゲットを絞っています
-
関数のパラメーターはタイプINのみにすることができ、ストアード・プロシージャーのパラメーターは
IN OUT INOUT
3つのタイプにすることができます。 -
ストアドファンクションはselectを使用して呼び出され、ストアドプロシージャはcallを使用して呼び出す必要があります。
結論として
この記事では、面接での一連の一般的な基本的な知識ポイントを、面接の質問と回答の形式でまとめています。これらはすべて非常に基本的な内容ですが、より基本的であるほど重要です。ナレッジポイントのメモとして使用でき、過去を確認して新しいことを学ぶためによく使用されます。