主キー、インデックス、sqlステートメントの最適化、データタイプの選択

主キー、インデックス、sqlステートメントの最適化、データタイプの選択

1.プライマリキー、外部キー、一意のキー

主キー:エンティティを一意に識別するデータベースエンティティの整合性のルールであり、その値は空ではなく一意です。たとえば、学生テーブルの学生番号。
外部キー:2つ以上のテーブルをリンクする、データベースの参照整合性のルール。値は、参照テーブルの参照フィールドの値から取得する必要があります。値は、空の場合と空でない場合があります。たとえば、コース選択テーブルの学生番号。
一意のキー:一意の制約により、リレーションシップまたはテーブル内の単一のタプルを一意に識別できます。主キーとは異なり、テーブルには複数の一意のキーを含めることができます。一意のキー制約は、列のnull値のみを受け入れることができます。一意の制約は、別のテーブルの外部キーによっても参照されます。これは、非プライマリキー列および列グループに一意の制約を適用する場合に使用できます。

#查询表结构,可以看到主键、外键、唯一键(如果有的话)
desc table;

テーブル構造のキーはMULであり、列の値を繰り返すことができます。列は、一意でないインデックスの先頭の列(最初の列)であるか、一意のインデックスの一部ですが、NULLを含めることができます。

2.インデックス

インデックスを使用して、データベーステーブル内の特定の情報にすばやくアクセスします。たとえば、クエリ:select * from table1 where id = 10000。インデックスがない場合は、IDが10000に等しい行が見つかるまでテーブル全体をトラバースする必要があります。インデックスを作成した後(ID列で確立されたインデックスである必要があります)、インデックスを検索できますが、インデックスは物理スペースを占有する必要があります。 、また、データの保守速度が低下するため、できるだけ多くはなりません。
インデックス分類:通常のインデックス、一意のインデックス、プライマリキーインデックス、複数列のインデックス

#显示已有的索引
show INDEX FROM table1;

プライマリキーインデックス:null値を許可しない特別な一意のインデックスです。
一意のインデックス:インデックス列の値は一意である必要がありますが、null値は許可されます

#创建唯一索引
CREATE UNIQUE INDEX frame_num_index on payment_invoices_management(frame_num);
#创建多列索引
CREATE INDEX payment_framenum_invoicevalidity on payment_invoices_management(frame_num,invoice_validity);
#删除索引
ALTER TABLE payment_invoices_management DROP INDEX payment_framenum_invoicevalidity;

カバーするクエリとカバーしないクエリ(frame_numがプライマリキーです)
カバレッジクエリ:

SELECT frame_num FROM payment_invoices_management WHERE frame_num='LRH03120000000001';

対象外のクエリ:

SELECT frame_num FROM payment_invoices_management WHERE invoice_number=666;

3.Sqlステートメントの最適化

a。SELECT*ステートメントをできるだけ少なく記述し、必要なデータのみを返し、WHERE句を合理的に記述し、WHEREなしでSQLステートメントを記述しないでください。いくつかのsqlステートメントをマージするために可能な限り反復作業を少なくするようにしてください
b、次のように完全なテーブルスキャンを実行しないようにしてください:
左ファジークエリ '%...'
は等しくない演算子を使用します!=
または、不適切に使用されているか、両側にインデックスが必要です。Where句
ではなく
、フィールドで式操作を実行します。
作成された複合インデックス(左端から結合)の場合、クエリ条件で使用される列は左から開始する必要があります。間隔。それ以外の場合は無効です。複合インデックスの構造は電話帳の
フルテキストインデックスに似ています。ファイルに対してシソーラスのインデックスが確立されている場合(ファイルのフルテキストインデックスはファジーマッチング効果よりも優れています)、char、varchar、textの列に配置できます。フルテキストインデックスを作成します。MySQL5.6Innodbエンジンは、フルテキストインデックス、検索構文も実行できます。MATCH(列名1、列名2、...)AGAINST(検索文字列[検索修飾子])、列タイプが文字列の場合、クエリでは、文字列の名前に数値定数が割り当てられます。名前の列にはインデックスがありますが、使用されていません。
c。サブクエリの代わりに結合を
使用しますd、一時テーブルを手動で作成する代わりに結合を使用します

4.データタイプの選択

TINYINT / INT / BIGINT

区別するための数値タイプフロートと二重選択(可能な限りフロートを選択)。負の数値を使用しないフィールドは、符号なしの定義を追加することをお勧めします。
文字列タイプの
文字タイプの代わりに数値タイプフィールドを使用して数値タイプを選択することができます。
char、varchar、TEXTの選択:最後の手段としてTEXTデータタイプを使用しないでください。固定長フィールド。CHARタイプ(空白を埋める)を使用し、可変長フィールドにVARCHARを使用する(長さに自動的に適応し、ステージを超える)ことをお勧めします。適切なものだけを設定してください。最大長時間
タイプ
選択の優先度で並べ替えDATE(その日に正確)、TIMESTAMP、DATETIME(時間に正確)
ENUM
ステータスフィールドの場合、ENUMを使用して保存することができ
ます。NULLフィールドの使用は避けてください最適化のクエリが難しく、追加のインデックススペースを占有します。

おすすめ

転載: blog.csdn.net/Krystal_RonghuiLi/article/details/107999397