MySQLデータベース(アリババのJava開発マニュアルを参照してください)

  • テーブル規程を構築するには
    • 名前
      • 執行
        • 式は、フィールド名がやり方をis_xxx必要があるかどうかの概念であり、データ型は、符号なしtinyint型(1が表現され、ノー0)です。
          • 注:フィールドの任意の非負場合は、である必要があります符号なし
          • 注:任意のブール変数でPOJOクラス、プレフィックスを追加しないです、そのため、XXXの者へのis_xxxから<このresultMap>セットのマッピングに必要。データベースの表現は、その意味と価値の範囲を明確にするかどうかを値、使用tinyint型タイプ、is_xxx命名に準拠しています。
          • 正例:削除する墓石、1をis_deleted式フィールド名、0は削除されませんを示しています。
        • テーブル名、フィールド名が唯一の真ん中の2つの数字が表示される下線付きの禁止禁止番号で始まり、小文字または数字でなければなりません。彼らはプレリリースを行うことができないため、大規模なデータベースのフィールド名のコストを変更し、そのフィールド名は慎重に検討する必要があります。
          • 経験:小文字のみ、位置リミット番号、アンダースコア、より多くの数字を使用します。
          • 説明:MySQLはWindowsで大文字と小文字の区別はありませんが、Linuxでは、デフォルトでは大文字と小文字が区別されます。そのため、データベース名、テーブル名、フィールド名は、任意の更なる合併症を避けるために、任意の大文字を許可していません。
          • 正例:aliyun_admin、rdc_config、level3_name
          • 反例:AliyunAdmin、rdcConfig、level_3_name
        • テーブル名は複数名詞を使用していません。
          • 説明:表名はクラス名に対応するDO、エンティティの数を表してはならない、内部コンテンツの専用エンティティテーブルを表すべきで、慣用特異です。
          • 経験:データの表は、通常の作品、もちろん、それは名前を必要としないとき、複数の名詞を使用し、複数です。
        • このようDESC、範囲、マッチ、遅れなどの予約語を、無効にする、公式のMySQLの予約語を参照してください。
          • 経験:postgresqlの異なる、ユーザ名などをテーブルとして使用することはできません
        • PK_フィールド名という名前のプライマリキーインデックス、ユニークインデックスがuk_フィールド名を呼ばれ、通常のインデックス名はidx_フィールド名でした。
          • PK_すなわち、プライマリーキー、uk_すなわちユニークキー、idx_すなわち短いインデックス。
      • 勧告
        • 最高のは、名前のテーブルに従うことです「事業名_テーブルの役割を。」
          • 正例:alipay_task / force_project / trade_config
        • 可能な限り一貫として、ライブラリ名とアプリケーション名。
    • フィールドタイプを選択します
      • 執行
        • decimal型は、10進数ですfloatとdoubleの使用を禁止します。
          • 説明:保存されたときの値を比較する場合、単精度と倍精度の損失の問題は、おそらく、誤った結果を取得します。格納されたデータが範囲の小数の範囲を超えた場合、それは整数と小数データに分割することをお勧めし、別々に格納されています。
        • 文字列の長さは、固定長の文字列char型の使用ほぼ等しい場合。
        • VARCHAR変数の長さの文字列ではなく、事前に割り当てられた記憶領域、長さ以上5000、メモリ長は、他のフィールドの効率指標への影響を回避するために、対応する主キーを持つ、フィールドタイプテキスト、独立したリストとして定義され、この値よりも大きい場合。
      • 参照
        • 適した文字記憶長、検索速度を向上するために、より重要なのは、インデックスストレージを節約する、空間データベースのテーブルを保存していないだけ。
          • 正例:符号なしの値が誤っ陰性を避けるためにどので、以下の表に、および拡張範囲を示します。
            オブジェクト|年齢間隔|タイプ|バイト|の範囲を表し
            | - | - | - | - | - |
            人間を| 150歳| tinyint型符号なし| 1つの|符号なし値:0〜255
            カメ|ナンバー百分の| SMALLINT符号なし| 2 |符号なし値:0〜65535の
            恐竜の化石|何千年| int型符号なし| 4 |符号なし値:00億4.29〜約
            |5000万年について|太陽符号なしのbigint | 8 |なしシンボル値:19〜約10 0番目
    • 他の
      • 執行
        • ID、CREATE_TIME、UPDATE_TIME:表の3つのフィールドを持っている必要があります。
          • 説明:IDを主キー、タイプ1のステップでは、符号なしの、自己増力単一テーブルをBIGINTなければならないことを特徴とします。CREATE_TIME、UPDATE_TIMEが日時タイプですと入力します。
      • 勧告
        • あなたは、フィールドの意味を変更したり、ステータス・フィールドは、コメントフィールドを更新するための追加の必要性を示している場合。
        • フィールドは、クエリのパフォーマンスを向上させるために、適切な冗長性を可能にするが、一貫性のあるデータを考慮しなければなりません。冗長フィールドに従ってください。
          • 1)頻繁なフィールドの変更はありません。
          • 2)ないLONG VARCHARフィールドは、それがテキストフィールドにすることはできません。
          • 3)のみインデックスフィールドではありません。
          • 正例:高周波、短いフィールド長、実質的に一定の名前、カテゴリ名を使用して商品カテゴリ名は、関連する冗長テーブルに格納することができるリレーショナルクエリを回避します
        • 500万ラインまたは2GB以上の単一テーブルの容量を超えるシングルテーブルの行は、それがサブライブラリーサブテーブルをお勧めします。
          • 注:3年後に予想されるデータの量がこのレベルに到達するために失敗した場合は、テーブルを作成するときに、あなたがいないサブライブラリーサブテーブルを行います。
  • インデックス規程
    • 執行
      • フィールドは、複数のフィールドの組み合わせは、一意のインデックスが完了しなければならない場合でも、独自の動作特性を持っています。
        • 注:Doがユニークインデックスが挿入速度に影響、スピードの損失は無視できる程度であると思いますが、検索速度を向上させることは明白ではありません。また、でも、アプリケーション層である限り何も一意のインデックスが存在しないとして、非常に包括的なチェック制御を行うために、マーフィーの法則によると、生成されたダーティデータが存在しなければなりません。
      • 以上の3つのテーブルが参加禁止しています。フィールドに参加する必要があり、データ型は絶対に一致している必要があります。クエリに関連付けられたマルチテーブル、フィールドはインデックスを持つ必要性と関連していることを確認してください。
        • 注:2-テーブルはテーブルインデックス、SQLパフォーマンスに参加する場合でも、ということにも注意してください。
      • varchar型のフィールドにインデックスを作成するとき、あなたは、インデックスの長さを指定する必要があり、フィールド全体をインデックス化する必要は、あなたが差別の実際のテキストに基づいて、インデックスの長さを決定することはできません。
        • 説明:識別インデックスの長さは、矛盾、インデックス20の列データ長の一般的なタイプであり、判別が90%以上となり、(別個の左側(列名、インデックス長))をカウントすることができます/分化の程度を決定するために(*)カウント。
      • 検索ページは厳密に必要であれば、漠然とまたは全部ファジー左禁止され、解決するために検索エンジンをご利用ください。
        • 説明:最も左接頭辞とインデックスファイルには、Bツリーの特性に合わせて、値が未定のままにすると、それはこのインデックスを使用することはできません。
    • 勧告
      • シーンによって順序がある場合は、インデックスの秩序の使用に注意してください。フィールドによる最終順位は、複合インデックスの一部であり、外観を避けるために、最終的な順位の組み合わせのインデックスは、クエリのパフォーマンスに影響を与えるfile_sort。
        • 正例:Cによる=かつb =ため、インデックス:?? A_b_c
        • 抗例:インデックス範囲クエリがある場合、インデックスのような整然とした使用することはできません:Bが> 10 ORDER; A_Bインデックスをソートしません。
      • テーブルに戻って避けるために、クエリをカバーするインデックスを使用してください。
        • 注:第11章のタイトルは何を知っている書籍が必要な場合は、それに対応する第11章でそのページを開きますか?このディレクトリのようなディレクトリの外観は、インデックスをカバーする役割を果たしています。
        • 正例:サブインデックス、主キーのインデックスの種類を確立する能力は、インデックスのみ、3の一般的な指標であり、カバーインデックスは効果の一種類のみのクエリで、結果は使用を説明し、余分な列が表示されます:インデックスを使用します。
      • またはサブクエリの最適化、超マルチページシーンの使用に伴う遅延。
        • 説明:MySQLはオフセット行をスキップではなく、オフセット+ Nラインを取り、その後、オフセット行の前にあきらめるN行を返すために返す返されたページの合計数を、オフセットが特に大きい場合、効率が非常に低いこと、または制御ページ数が超えた上または特定のしきい値は、SQLを書き換えられます。
        • 正例:最初のセグメントIDをすばやく見つけるために取得する必要があり、その後、準:
          • SELECT *表1 Aから、(選択IDを表1条件LIMIT 100000,20から)B a.id = b.id
      • SQLパフォーマンスの最適化目標:あなたは最高のconstsをすることができた場合に、少なくともレベル範囲に到達するために、要件は、参照レベルです。
        • 説明:
        • 1)単一のテーブルのみ一致する行(主キーまたは一意のインデックス)を有することができるconsts、データは、最適化段階で読み取ることができます。
        • 2)refは、通常のインデックス(ノーマルインデックス)の使用を指します。
        • 3)インデックス範囲検索の範囲を。
        • 反例:結果テーブルを説明する、タイプ=インデックス、スキャン完全な物理ファイルのインデックスは、速度が非常に遅く、インデックスレベルも比較的低い範囲である、フルテーブルスキャンが自明です。
      • 時間の複合インデックス、一番左の差別で最高をビルドします。
        • 正例:もしここでa = aとb = ,? ? ほとんど近い列の一意の値にした場合、その後、あなただけの単一idx_aインデックスが構築できる必要があります説明:非等号等号と混合し、インデックスの構築時には、等号の列事前条件。例えば:C>とdは= Cその後分化のより高い度合いは、Dは指数、そのインデックスidx_d_c ??の最前線にしなければならない場合。
      • 防止暗黙的な変換は、インデックスの故障をもたらすために、異なるフィールドタイプ引き起こさ。
    • 参照
      • あなたは極端な誤解を避けるために、インデックスを作成するときは、次のとおりです。
        • 1)かなり短い乱用しないでください。私は、クエリがインデックスを構築するために必要だと思います。
        • 2)数量前。私は、インデックスは、スペースを消費し、新しいレコードのスピードダウン遅く深刻と行を更新すると思います。
        • 3)ボイコット一意のインデックス。唯一のアプローチ「最初の後にプラグをチェック」を介してアプリケーション層で対処するビジネスニーズのすべてだと思います。
  • SQL文
    • 執行
      • (代わりに、カウントのカウント(列名)またはカウント(定数)を使用しないでください(カウント)構文はSQL92標準的な統計行の数、データベースとは何の関係も、NULLと非NULLとは何の関係によって定義されます)。
        • 説明:数(列名)は、このコラムで行をカウントしていない間** COUNT(*)は、値NULLの行をカウントがNULL値です。**
      • カウント(異なるCOL)NULLが満杯である場合、他の列は異なる値を持っているだけでなく、ゼロに戻っても、NULL列、ノート数(別個COL1、COL2)より重なり他のない行の数を計算します。
      • NPEは、全体のカラムの値がNULLの場合)、カウント数(COL)が0の値を返しますが、合計(COL)がNULLの値を返しますので、合計の使用(問題に注意を払う必要があります。
        • 正例:使用の方法回避問題にNPE合計:SELECT IFNULLを(SUM(カラム)、0)テーブルから。
      • ISNULL()を使用すると、NULL値かどうかを判断します。
        • 説明:任意の値とNULL直接比較はNULLになります。
        • 1)NULL <> NULL返される結果はNULL、偽ではありません。
        • 2)NULL = NULL返される結果NULLであり、真実ではありません。
        • 3)NULL返さ<> 1つの結果はNULLであり、真実ではありません。
      • コードのページング照会ロジックを記述する場合は、カウントがゼロの場合、ページネーション文バックの実装を避けるために直接返されるべきです。
      • カスケード、アプリケーション層で対処しなければならないすべての外部キーコンセプトと外部キーを使用していません。
        • 説明:生徒の成績と例の関係は、学生STUDENT_IDテーブルには、結果テーブルSTUDENT_ID外部キーだった、主キーです。あなたが学生のテーブルSTUDENT_IDを更新した場合、結果テーブルをトリガしながら、することは、更新をカスケード接続する、あるアップデートを、STUDENT_ID。分散、並行性の高いクラスタに適していないスタンドアロンの低い同時実行のためのアップデートをカスケード接続すると外部キー、カスケード更新が強いブロッカーでは、リスクのデータベース更新の嵐があり、外部キーはデータベースの速度に影響を与える挿入します。
      • ストアドプロシージャ、ストアドプロシージャ、デバッグおよび拡張することは困難、無移植の使用を禁止します。
      • データリビジョンが(特に、削除、記録動作を変更する)、最初に選択した場合は、更新ステートメントを実行するために、誤って削除の確認を避けるために。
    • 勧告
      • それは慎重に1000人の中に、セットバック制御の要素数を評価する必要性を避けることができない場合は、操作中に、回避、回避することができます。
    • 参照
      • 国際的必要性がある場合は、すべての文字が格納されていると表現し、UTF-8エンコーディングされ、統計関数の文字の違いに注意しています。
        • 説明:
          • SELECT LENGTH( "軽い仕事");リターン12
          • SELECT CHARACTER_LENGTH( "軽い仕事"); 4への復帰
          • あなたは、店舗の外観、そして選択に必要がある場合utf8mb4それへのストレージ、注意を払うと、UTF-8エンコードの違いについて。
      • TRUNCATE TABLEはDELETEの速度よりも高速で、少ないシステムおよびトランザクションログのリソースが使用されるが、TRUNCATEはトランザクションがトリガートリガーをしないん、事故を引き起こす可能性があり、それはコードの開発では、このステートメントを使用することは推奨されません。
        • 説明:句が機能的に同一であるなしでTRUNCATE表およびDELETEステートメント。
  • ORMマッピング
    • 執行
      • テーブルのクエリでは、常にフィールドは明記する必要がある、お問い合わせのフィールドのリストとして*を使用しないでください。
        • 説明:
        • 1)クエリアナライザ、分析コストを増大させます。
        • 2)フィールドと容易このresultMap矛盾して変化します。
        • 3)特にタイプテキストのフィールドに、フィールドネットワークの無駄な消費を増加させます。
        • 経験:さらに数(*)の外側には?
      • POJOクラスブール属性を追加することはできませんが、データベースフィールドis_に追加する必要があり、それは属性このresultMapのフィールド間のマッピングが必要です。
        • 注:データベースのフィールド定義POJOクラスの定義を参照し、マッピング内の所定の増加<このresultMap>で必要とされます。MyBatisの発生に必要な変更に対応するコードを生成しました。
      • 定義する必要があり、すべてのクラス名や属性データベースフィールドが一致した場合でも、リターンパラメータとしてresultClassを使用しないでください;順番に、各テーブルにバインドされている対応するPOJOクラスがあります。
        • 解説:フィールドとDOのクラス間のコンフィギュレーション・マッピングはデカップリングとメンテナンスが容易。
      • sql.xml設定パラメータ:#{}は、#のparam#このようにSQLインジェクションの傾向がある$ {}を使用しないでください。
      • iBATISのはqueryForList(文字列statementName、int型開始、int型のサイズ)が推奨されていませんしています。
        • 説明:これは達成されstatementNameは、データベース内のSQL文に対応するすべてのレコードを取る、その後のsubList、サブセットのサイズを取ることによって開始することです。
        • 正例:地図<文字列、オブジェクト>マップ=新しいHashMapの<>(); map.put( "スタート" 開始); map.put( "サイズ"、サイズ);
      • ダイレクト出力は、クエリの結果セットとしてのHashMapとHashtableのを取ることを許可しないでください。
        • 説明:resultClassを=「ハッシュテーブル」は、フィールド名と値に入れられますが、値が制御型ではありません
      • データテーブルのレコードを更新する場合、更新レコードは、現在の時刻に対応するフィールドの値をgmt_modified必要があります。
    • 勧告
      • 大規模かつ包括的なデータ更新インタフェースを記述しないでください。それらの標的更新フィールドは、更新テーブルセットC1 =値1、C2 =値2、C3 = VALUE3を行ったか否か、POJOクラスの着信;それは適切ではありません。SQLの実装は、あるエラーが発生しやすい、変更せずにフィールドを更新しない。第二は、低効率であり、第三は、バイナリログストレージを増加させることです。
    • 参照
      • @Transactional業務を乱用しないでください。トランザクションはロールバックキャッシュ、検索エンジンのロールバック、メッセージ補償、およびその他の統計的補正を含むプログラムのすべての側面を、検討するトランザクションのロールバックの場所を使用することに加えて、QPSデータベースに影響を与えます。
        • 経験:オペレーション・サポート・ロールバックの内側なければなりません。
      • <ISEQUAL> compareValueは数典型的には、属性値に比べて一定であり、等しいもたらすために、この条件を示し、<isNotEmpty>空でない表現は行われないヌルである<isNotNull>手段は値がnullでないこと。

おすすめ

転載: www.cnblogs.com/wyp1988/p/11958290.html