最近、データベース関連の操作が多くなり、会社の既存の仕様はあまり包括的ではありません。インターネット上のさまざまな専門家の関連仕様に基づいて、自分用にいくつかの標準的な使用方法をまとめました。ご訂正いただければ幸いです。 データベース環境 dev: 開発環境 開発者はテーブル構造を読み取り、書き込み、変更できます。開発者はテーブル構造とその中のデータを自由に変更できますが、他の開発者に影響を与えないようにする必要があります。 テスト: テスト環境 開発者は読み取りと書き込みが可能で、開発者はツールを使用してテーブル構造を変更できます。 オンライン: オンライン環境 開発者はオンライン環境で直接データベース操作を実行することはできません。操作が必要な場合は、DBA を見つけて操作を実行し、対応する記録を作成する必要があります。ストレス テストは禁止されています。 重要な問題は、各環境の MySQL サーバーに対応するユーザー権限が明確に分割され、認識可能であり、ビジネス シナリオを具体的に区別できる必要があることです。 命名規則 基本的な命名ルール
すべてのライブラリ、テーブル、フィールドが小文字なのはなぜですか? MySQL では、データベースとテーブルはディレクトリとそのディレクトリ内のファイルに対応します。したがって、オペレーティング システムの感度によって、データベース名とテーブル名の大文字と小文字の区別が決まります。
テーブル名 同じモジュール内のテーブルでは、可能な限り同じプレフィックスを使用し、テーブル名は可能な限り意味のあるものにする必要があります。すべてのログテーブルはlog_で始まります。 フィールドの命名
インデックスの命名
制約の命名
テーブル設計仕様 テーブル エンジンは実際のアプリケーション シナリオによって異なります。ログ テーブルとレポート テーブルには MyISAM が推奨され、トランザクション、監査、金額に関連するテーブルには InnoDB が推奨されます。特に指定がない限り、テーブルの作成時には innodb エンジンが使用されます。 デフォルトの文字セットはutf8mb4で、データベースの照合ルールはutf8mb4_general_ciです。(データベース定義はデフォルトを使用しているため、データテーブルを再定義できますが、安全のために、次のように記述することをお勧めします。 文字セットで utf8 が選択されず、照合順序で utf8_general_ci が使用されないのはなぜですか? utf8 エンコーディングを使用する MySQL では、プレースホルダーとして 4 バイトを使用する絵文字表現を保存できません。バックエンド プロジェクトがクライアントによって入力された絵文字表現を完全にサポートするようにするには、エンコーディングを utf8mb4 にアップグレードするのが最善の解決策です。 JDBC 接続文字列の characterEncoding が utf8 に設定されている場合、または上記の設定後に絵文字データを正常に挿入できない場合は、コードで接続の文字セットを utf8mb4 として指定する必要があります。 すべてのテーブルとフィールドでは、コメント列属性を使用して、テーブルまたはフィールドの真の意味を記述する必要があります。列挙値の場合は、フィールドで使用されるコンテンツを定義することをお勧めします。 特に指定がない限り、テーブルの最初の id フィールドは主キーであり、自動的に増分される必要があります。トランザクション外でのデータ転送のコンテキストまたは条件としてこれを使用することは禁止されています。主キーステートメントの設計として varchar を使用しないでください。 特に指定がない限り、テーブルには create_time フィールドと modify_time フィールドが含まれている必要があります。つまり、テーブルには作成時刻と変更時刻を記録するフィールドが含まれている必要があります。 特に指定がない限り、テーブルにはデータが削除されたかどうかを示す is_del が含まれている必要があります。原則として、データベース データの物理的な削除は許可されません。
datetime と timestamp の違いは何ですか? 類似点: TIMESTAMP 列の表示形式は DATETIME 列の表示形式と同じです。表示幅は 19 文字に固定され、形式は YYYY-MM-DD HH:MM:SS です。 違い: タイムスタンプ
TIMESTAMP の自動割り当てプロパティを使用するにはどうすればよいでしょうか? ts のデフォルト値として現在の時刻を使用します: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP。行が更新されると、ts の値を更新します: ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP。 1 と 2 を組み合わせることができます: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。 INT UNSIGNED を使用して IP を保存するにはどうすればよいですか? IPv4 アドレスを保存するには、char(15) ではなく INT UNSIGNED を使用し、MySQL 関数 inet_ntoa および inet_aton を使用して変換します。現在、IPv6 アドレスの変換関数は存在せず、DECIMAL または 2 つの bigINT を使用して保存する必要があります。
INT[M]、Mの値は何を表していますか? 数値型の括弧の後の数字は幅のみを示し、ストレージ範囲とは関係がないことに注意してください。多くの人は、INT(4)とINT(10)の値の範囲はそれぞれ(-9999〜9999)と(-9999999999〜999999999999であると考えていますが、この理解は誤りです。実際、整数型のM値をZEROFILL属性と組み合わせて使用すると、列の値の幅を均等にすることができます。 INT[M]のMの値に関係なく、その値の範囲は(符号付きの場合-2147483648〜2147483647)、(符号なしの場合0〜4294967295)です。 表示幅は、列に保持できる値の範囲を制限するものではなく、指定された列の幅を超える値の表示を制限するものでもありません。オプションの拡張属性 ZEROFILL と組み合わせて使用すると、デフォルトでは追加のスペースがゼロに置き換えられます。たとえば、INT(5) ZEROFILLとして宣言された列の場合、値4は00004として取得されます。表示幅を超える値を整数列に格納すると、MySQL が複雑な結合の一時テーブルを生成するときに問題が発生する可能性があることに注意してください。これは、このような場合、MySQL はデータが元の列幅に収まると判断するためです。数値列に ZEROFILL を指定すると、MySQL は列に UNSIGNED 属性を自動的に追加します。 VARBINARY を使用して大文字と小文字を区別する可変長文字列を保存する CHAR と VARCHAR はいつ使用すればよいのでしょうか? CHAR 型と VARCHAR 型は似ていますが、保存方法と取得方法が異なります。また、最大長や末尾のスペースが保持されるかどうかという点でも異なります。 CHAR 型と VARCHAR 型に対して宣言された長さは、保存する文字の最大数を示します。たとえば、CHAR(30)は30文字を占めることができます。 CHAR 列の長さは、テーブルの作成時に宣言された長さに固定されます。長さは 0 から 255 までの任意の値にすることができます。 CHAR 値が格納される際、指定された長さまで右側にスペースが埋め込まれます。 CHAR値が取得されると、末尾のスペースは削除されます。保存または取得中に大文字と小文字の変換は実行されません。 VARCHAR 列の値は可変長文字列です。長さは 0 から 65,535 までの値として指定できます。 (VARCHAR の最大有効長は、最大行サイズと使用される文字セットによって決まります。全体の最大長は 65,532 バイトです)。 CHAR とは対照的に、VARCHAR 値は必要な文字数のみで保存され、長さを記録するための追加バイトが追加されます (列の宣言された長さが 255 を超える場合は 2 バイトが使用されます)。 VARCHAR値はパディングなしで保存されます。標準 SQL に準拠して、値が保存および取得されるときに末尾のスペースが保持されます。 char はユーザーのパスワードの MD5 ハッシュを保存するのに適しており、その長さは常に同じです。頻繁に変更される値の場合、固定長の行は断片化される可能性が低いため、char は varchar よりも適しています。非常に短い列の場合も、char は varchar よりも効率的です。 char(1) 文字列はシングルバイト文字セットでは 1 バイトしか占有しませんが、varchar(1) 文字列は長さ情報を格納するために 1 バイトが使用されるため 2 バイトを占有します。 インデックス設計仕様 MySQL のクエリ速度は適切なインデックス設計に依存するため、高パフォーマンスにはインデックスが不可欠です。適切なインデックスはクエリを高速化します (UPDATE および DELETE の速度も含む)。MySQL は行を含むページをメモリにロードしてから UPDATE または DELETE 操作を実行します。不適切なインデックスはクエリを低速化します。 MySQL のインデックス検索は、新華辞書のピンインと部首の検索に似ています。ピンインと部首のインデックスが存在しない場合は、ページを 1 つずつめくって検索するしかありません。 MySQL クエリがインデックスを使用できない場合、MySQL は完全なテーブルスキャンを実行し、大量の IO を消費します。インデックスの目的: 重複排除、高速ポジショニング、ソートの回避、カバーインデックス。 カバーインデックスとは何ですか? InnoDB ストレージ エンジンでは、セカンダリ インデックス (非主キー インデックス) に行アドレスが直接格納されるのではなく、主キーの値が格納されます。ユーザーがセカンダリ インデックスに含まれていないデータ列をクエリする必要がある場合、ユーザーは最初にセカンダリ インデックスを通じてプライマリ キー値を見つけ、次にプライマリ キーを通じて他のデータ列をクエリする必要があるため、クエリを 2 回実行する必要があります。カバーリング インデックスの概念は、クエリを 1 つのインデックスで完了できることです。カバーリング インデックスの効率はより高くなり、主キー クエリは自然なカバーリング インデックスです。カバーリング インデックスを使用する場合、インデックスを適切に作成し、クエリ ステートメントを適切に使用するとパフォーマンスが向上します。たとえば、SELECT email,uid FROM user_email WHERE uid=xx です。uid が主キーでない場合は、index(uid,email) としてインデックスを追加してパフォーマンスを向上させることができます。 基本的なインデックス仕様
テーブル内のインデックスが多すぎるのはなぜいけないのでしょうか? InnoDB のセカンダリ インデックスはストレージに b+tree を使用するため、UPDATE、DELETE、INSERT 中に b+tree を調整する必要があります。インデックスが多すぎると、更新プロセスが遅くなります。 文字列にはプレフィックス インデックスを使用します。プレフィックス インデックスの長さは 8 文字を超えてはなりません。プレフィックス インデックスを優先することをお勧めします。必要に応じて、疑似列を追加してインデックスを作成します。 BLOB/テキスト フィールドをインデックスしないでください。また、大きなフィールドをインデックスしないでください。インデックスによってストレージ領域が大量に消費されることになります。 プレフィックスインデックスとは何ですか? 簡単に言えば、プレフィックス インデックスとは、テキストの最初の数文字のインデックスを作成することです (インデックスを作成するときに、特定の文字数を指定します)。これにより、作成されるインデックスが小さくなるため、クエリが高速になります。プレフィックス インデックスを使用すると、インデックス ファイルのサイズを効果的に削減し、インデックス作成速度を向上させることができます。しかし、プレフィックス インデックスにも欠点があります。MySQL では、プレフィックス インデックスを ORDER BY または GROUP BY で使用することはできず、カバー インデックスとして使用することもできません。 プレフィックス インデックスを作成するための構文は次のとおりです: ALTER TABLE table_name ADD KEY(column_name(prefix_length)); 主キー基準
重要な SQL はインデックス化する必要があり、コア SQL にはインデックスをカバーする優先順位を与える必要があります。
最も特徴的なフィールドが最初に配置される
インデックスタブー
MYSQL のインデックスの制限 MYISAM ストレージ エンジン インデックスの合計長は 1000 バイトを超えることはできません。 ステートメントデザイン仕様 準備されたステートメントの使用
暗黙的な変換を避ける これによりインデックスが失敗する プレフィックスインデックスを活用する
not in/likeなどの否定的なクエリは使用しないでください。
ストアド プロシージャ、トリガー、UDF、イベントなどの使用は避けてください。
大きなテーブルでのJOINを避ける MySQLは単一テーブルの主キー/セカンダリインデックスクエリに最適です。 データベースで計算を行わないようにする
データベースとのやり取りの回数を減らす
ページングを適切に使用する ページネーションで表示されるページ数を制限します。前のページと次のページのみクリックできます。遅延関連付けが使用されます。 ページングを正しく使用するにはどうすればいいですか? 次のようなページング ステートメントがあるとします: SELECT * FROM table ORDER BY id LIMIT 10000, 10。MySQL が LIMIT OFFSET を処理する方法は、OFFSET+LIMIT のすべてのデータを取得し、次に OFFSET を削除して、一番下の LIMIT を返すことです。したがって、OFFSET 値が大きい場合、MySQL のクエリ パフォーマンスは非常に低下します。これは id > n を使用することで解決できます。 id > n を使用する方法には制限があります。ページをめくるときに最後の id を同時に渡すことで、不連続な id の問題は解決できます。 http://example.com/page.php?last=100 テーブルから * を選択、ID が 100 未満、ID で並べ替え、降順、制限 10 //前のページ http://example.com/page.php?first=110 テーブルから * を選択し、ID が 110 より大きい場合は、ID で並べ替え、降順で制限を 10 にします。 この方法の最大の欠点は、閲覧中に挿入/削除操作があった場合、ページが更新されず、ページの合計数が新しいカウント(*)に基づいて計算され、最終的に一部のレコードにアクセスできなくなる可能性があることです。この問題を解決するには、現在のページ番号と、最後のページめくり以降のレコードの合計数に影響する挿入/削除などの操作があったかどうかを引き続き入力し、それらをキャッシュします。 テーブルから * を選択、ID >= (テーブルから ID を選択、ID 制限 #offset#、1 で順序付け)
EXPLAIN ステートメント (MySQL クライアントで実行) は、MySQL が SELECT ステートメントを実行する方法に関する情報を取得できます。 SELECT ステートメントで EXPLAIN を実行すると、SELECT ステートメントの実行時に MySQL がインデックス、完全なテーブル スキャン、一時テーブル、ソートなどの情報を使用するかどうかを知ることができます。 MySQL による完全なテーブルスキャン、一時テーブルの使用、ソートなどの実行は避けてください。詳細については公式ドキュメントを参照してください。 unionの代わりにunion allを使用する union all と union の違いは何ですか? union キーワードと union all キーワードはどちらも 2 つの結果セットを 1 つに結合しますが、使用方法と効率の点で 2 つは異なります。 結合テーブルがリンクされた後、重複レコードは除外されるため、テーブルがリンクされた後、結果セットがソートされ、重複レコードが削除されてから結果が返されます。のように: test_union1 から * を選択 ユニオンはtest_union2から*を選択します この SQL を実行すると、まず 2 つのテーブルの結果が取得され、次にソート スペースを使用して重複レコードがソートおよび削除され、最後に結果セットが返されます。テーブル内のデータ量が多い場合は、ディスク ソートが行われる場合があります。 Union all は、単に 2 つの結果を結合して返します。この方法では、返された 2 つの結果セットに重複データがある場合、返された結果セットには重複データが含まれます。 効率の点では、union all の方が union よりもはるかに高速なので、2 つのマージされた結果セットに重複データが含まれていないことを確認できる場合は、次のように union all を使用します。 test_union1 から * を選択、union all から * を選択、test_union2 から * を選択
テーブル仕様 1~2年以内に単一テーブルのデータ量が500万を超える場合や、データ容量が10Gを超える場合は、テーブル分割を検討してください。履歴データの移行や履歴データのアプリケーションによる自己削除を事前に検討する必要があります。均等分割やバランス分割、ビジネスルールに従った分割などをご利用いただけます。分割するデータテーブルについては、DBAと分割戦略について話し合う必要があります。
行動規範
その他の仕様 ログ データを MySQL に保存することは推奨されません。Hbase または OceanBase を優先してください。ストレージが必要な場合は、DBA に依頼して、ストレージ用の圧縮テーブルの使用を評価してください。 以上が超詳細なMySQL使用仕様の詳細です。MySQL使用仕様の詳細については、123WORDPRESS.COMの他の関連記事に注目してください! 以下もご興味があるかもしれません:
|
<<: OpenLayersはポイントフィーチャーレイヤーの集約表示方法を実現します
目次1. MySQLのコンパイルとインストール: 2. 最初のマルチインスタンス3307を準備する3...
ここでは Ubuntu 16.04 システムを使用しています。 dockerを使用したインストールh...
この記事では、WeChatアプレットの計算機機能を実装するための具体的なコードを参考までに紹介します...
レスポンシブ レイアウト システムは、今日の一般的な CSS フレームワークではすでに非常に一般的で...
この記事では、WeChatアプレットの宝くじ番号ジェネレータの具体的なコードを参考までに紹介します。...
HTML でよく使用されるエスケープ文字をまとめると次のようになります。 改行...
目次1. 概要2. デジタル列挙2.1 逆マッピング3. 文字列の列挙4. const列挙5. まと...
目次CURRENT_TIMESTAMPの使用CURRENT_TIMESTAMPを使用したタイムスタン...
目次1. はじめに2. MVCC (マルチバージョン同時実行制御メカニズム) 2.1 繰り返し読み取...
例示するこの記事は、2017 年 5 月 20 日に MySQL-5.7.18 を使用して作成されま...
公式の Docker レジストリを使用して作成されたウェアハウスでは、イメージを削除してもデフォルト...
1. 冒頭の2つの単語みなさんこんにちは。私の名前はLin Zonglinです。私はテストエンジニア...
目次一般的な配列メソッドポップ()シフト解除()シフト()スライス()スプライス()配列から重複した...
序文Samba は、サーバー プログラムとクライアント プログラムで構成され、Linux システム上...
Ubuntu 15.04 は MySQL リモート ポート 3306 を開きます。以下の操作はすべて...