ホームページ  >  記事  >  バックエンド開発  >  長年の経験をもとにまとめた「インターネットMySQL開発仕様書」

長年の経験をもとにまとめた「インターネットMySQL開発仕様書」

WBOY
WBOYオリジナル
2016-07-25 08:46:53783ブラウズ
表面に書かれています:ルールのないサークルはありません。インターネットに参加したばかりの人にとって、MySQLMySQLは、インターネット上で最も人気のあるリレーショナル データベース製品であるため、必ず触れることになりますが、これには長所と短所があります。 、その特性に基づいて、インターネット上のほとんどのアプリケーションの特性と組み合わせて、インターネット企業でMySQL DBAとしての私の長年の経験に基づいて、著者はインターネットのためのいくつかの開発仕様を要約しました MySQL、参照のみ。
1. 基本仕様
(1) ストレージエンジンINNODBを使用
(2) キャラクターセットutf8
(3)を使用するすべてのテーブルがコメントを追加する必要があります(4)
5000Wで単一のテーブルのデータボリュームを制御することをお勧めします(5) データベース
、ファイルおよびその他のビッグデータに保存しないでください(6) ) ですデータベースのストレス テストをオンラインで行うことは禁止されています
(7) 禁止
テストおよび開発環境からデータベースへの直接接続
2.命名条約(1)
library名、テーブル名、およびフィールド名には、命名長が固定されている必要があります。
ライブラリ名、テーブル名、フィールド名は禁止されています
32文字以上に制限されています。名前の意味は必見(3) ライブラリ名、テーブル名、フィールド名禁止
Disabled を使用するMySQL 予約語
(4) 一時ライブラリ名とテーブル名には、接頭辞としてtmp⽇を付ける必要があります 日付は末尾です
(5) バックアップライブラリとテーブルには、接頭辞としてbakを付け、接尾辞としてdate
を付ける必要があります。 3. ライブラリ、テーブル、フィールド開発および設計仕様
(1) 禁止パーティションテーブルを使用する
(2) 大きなフィールドを分割し、アクセスを制限する周波数フィールド、ホット データとコールド データの分離
(3) HASHを使用してを入力します。テーブル名のサフィックスはです ⽤⼗基本番号、添え字は 0
(4) から始まります日付と時刻によるテーブルはYYYY[MM][DD][HH]形式に準拠する必要があります
(5) 適切なデータベースとテーブルのシャーディング戦略を採用します。たとえば、Qianku Ten Tables、Ten Databases Hundred Tables などです。
(6) TEXTBLOBタイプは使用しないようにしてください。
(7) 正確な浮動小数点数を格納するには、FLOATDOUBLEの代わりにDECIMALを使用してください
(8) よりシンプルより良い: 文字を変換する 数値の場合、ENUMtype(9) の代わりに を使用します。
すべてのフィールドは次のように定義されます。 NULLではありません (10) 非負の整数を格納するには
UNSIGNEDを使用します(11) INT型の固定職業
4 バイトストレージ (12)
timestampを使用して時間を保存します (13) Use
UNSIGNEDSとらげIPV4(14)
VARBINARYを使用大文字と小文字を区別する可変長文字列を保存します
(15) 平文のパスワードをデータベースに保存することは禁止されており、パスワードは暗号化されて保存されます
(16) 数値型フィールドを使用します
Tinyint (1Byte) )
smallint (2Byte)
mediumint (3Byte)
int (4Byte)
bigint (8Byte)
エド255SMALLINT2-3276832767無署名65535MEDIUMINT3-83886088388607なし記号16777215INT4-21474836482147483647署名なしBIGINT-9223372036854775808
数値フィールドがそれほど大きくない場合は、 bigint を使用しないでください
(17) Storageip int を使用するストレージ char(15)
(18) の代わりに ENUM
(19) を使用することはできませんNULLを使用して無効化します フィールド NULL
フィールドはクエリの最適化が困難です。NULLフィールドのインデックスには追加のスペースが必要です。NULLフィールドの複合インデックスは無効な(20)
使用量を減らす text/blobvarcharのパフォーマンスはtextよりもはるかに高くなります、それは本当に避けられないblob、テーブルを分解してください (21)
大きなファイルや写真をデータベースに保存することはできません。大きなオブジェクトをディスクに配置し、そのパスを保存することができます。データベース
4. インデックスの仕様 1
、インデックスの数を制御する必要があります (1)
の数単一テーブル内のインデックスは 5 (2)
単一インデックス内のフィールド数は 5 を超えてはなりません( 3)
文字列にはプレフィックスインデックスを使用し、プレフィックスインデックスの長さは8文字(4) 必要に応じてプレフィックスインデックスを優先することをお勧めします。 、疑似列を追加してインデックスを作成できます2
、主キーのガイドライン (1)
テーブルには主キーが必要です
頻繁に更新される列を主キーとして使用しないでください(3)
文字列列を主キーとして選択しないようにしてください (4)
UUID MD5 HASHを使用しないでください
これらは主キーとして使用されます
(値が離散的すぎます)
(5) デフォルトでは、空でない一意のキーが主キーとして使用されます
(6) 自動インクリメントを選択することをお勧めしますまたは発行者
3、重要な SQL は、次のようにインデックス付けされる必要があります:
(1) UPDATE 削除ステートメント WHERE条件列
(2) ORDER BY GROUP BYDISTINCT フィールド
4 、複数のテーブルJOIN のフィールドは次のように注意する必要があります:
(1) 最大の特徴を持つフィールドは前に配置されます
(2) core SQL インデックスのカバーを優先する
(3) 冗長で重複したインデックスを避ける
(4) インデックスはデータの密度と分布を包括的に評価する必要があります。クエリと更新率を考慮する
5、インデックスのタブー
(1) 「性別」などのカーディナリティの低い列にはインデックスを作成しないでください
(2) インデックス列に対して数学的な演算や関数を実行しないでください。操作
6、外部キーを使用しないようにしてください
(1) 外部キーは、参照整合性を保護するために使用され、ビジネス側で実装可能
(2) 親テーブルと子テーブルの操作は相互に影響し、可用性が低下します
7、インデックスの命名: 非一意のインデックス idx_field1_field 2nameで始まる必要があるため、uniq_に基づいて名前を付ける必要がありますフィールド1_フィールド2、インデックス名はすべて小文字でなければなりません
8 新しく作成された一意のインデックスは主キー
と重複してはなりません。
9、インデックスフィールドのデフォルト値はNULLにすることはできません。他のdefaultまたは空に変更する必要があります。 NULLはインデックスのクエリ効率に非常に影響します
10、テーブルに関連するSQLSQL
を繰り返し確認し、インデックスを構築します並んで一番左のプレフィックスの特徴を備えています。複数の繰り返しフィールドがあるステートメントの場合、ステートメント条件フィールドの順序を変更し、インデックスの数を減らすために結合インデックスを作成する必要があります
11
一意のインデックスを使用できる場合は、クエリ効率を向上させるには一意のインデックスを使用する必要があります
12。インデックスの選択性が低いことがわかった場合、研究開発者は ヒントを頻繁に使用する必要があります。
五、 SQL より小さな部分に分割する方法を見つける sql ステートメント (
クエリキャッシュをフル活用します
とマルチコア
CPU)を最大限に活用しています(2) トランザクションはシンプルであるべきであり、トランザクション全体の長さは長すぎない必要があります (3) トリガー、関数、ストアド プロシージャの使用を避ける(4) ビジネス カップリングと サックアウトを減らす
シャーディングのための余地を残す
(5 )
数学的演算 (MySQLは数学的演算と論理的判断が苦手です) (4)
ドン' select *は使用せず、select これらのフィールドを使用してください (5) SQLでのOR
の使用として書き換えられますIN() (またはin ほど効率的ではありません)
(6) の数字の数は1000
(7)の制限内に制御することをお勧めします ページネーションの際は効率に注意してください。 限界大きくなるほど効率は低くなります。たとえば、limitを次のように書き換えることができます。 ( 9 )
union
(10) の代わりに union all を使用してください
の使用は避けてください 大きな時計なら 参加 (11) グループごとにグループ化と自動並べ替えを使用します
(12) データをバッチで更新し、一度にあまりにも多くのデータを更新しないでください (13) )
データベースとの対話の数を減らす(13)
パフォーマンス分析ツールの使用に注意するSql Explain / showprofile
(14) SQL ステートメントの要件 すべての R&D、
SQL
キーワードはすべて大文字で、各単語にスペースを 1 つだけ使用できます
(15) SQL ステートメントには select id from table
where id='1'(16) IN 条件内のデータの数は少ないはずです。 500以内、使い方を学ぶ必要があります
existinexistを置き換えます一部のシナリオでは、クエリは よりも高速になりますin (17) は使用できません必要はありませんは使用できません
、多すぎます落とし穴。 。 null と NULL(18) を検出します。 SQL ステートメントでは、禁止されているプレフィックスは %
いいね
(19) not in/like
(19) ページングクエリについて: プログラムは効率を向上させるためにページングの合理的な使用を推奨しています limit offset は大きいため、サブクエリと一緒に使用する必要があります
(20) データベース内で大規模なクエリを実行することは禁止されています
(21) make パラメータを渡すだけのプリコンパイル済みステートメントは、SQL ステートメントを 1 回解析して複数回使用するよりも効率的です。 注射確率( 22)
使用禁止ランドで注文()(23)
シングル SQLステートメント 複数のテーブルを同時に更新
6. プロセス仕様
(1)すべてのテーブル作成操作はクエリに通知する必要があります事前にテーブルに関与するsql
(2) テーブルをオンラインで構築する前に、どのインデックスを構築するかを決定する必要があります (3) )
すべてのテーブル構造の変更とインデックス追加操作を実行する必要があります。変更されたテーブルを含むクエリ sql
を送信して、
DBA およびその他の関連担当者に通知する必要があります。 (4) は新しいテーブルにフィールドを追加する前に研究開発が必要です dbaに評価と最適化のための時間を与えるために、メールは少なくとも
3日前に送信する必要がありますおよびレビュー(5)データの一括インポートおよびエクスポートは事前に通知する必要があります DBA観察の補助
(6) 禁止
ライブラリからオンラインでバックグラウンド管理と統計クエリを実行
(7) 禁止
superを備えたアプリアカウント権限が存在します
(8) プロモーション活動または新機能は事前に通知する必要がありますDBAEnterトラフィック評価
(9) には入っていないビジネス ピーク時のバッチ更新とデータベース クエリ
Brothers IT Education のオリジナル Linux 運用保守エンジニア ビデオ/詳細な Linux チュートリアルを無料で受信できます。詳細については、公式 Web サイトのカスタマー サービス: http://www.lampbrother を参照してください。 net/linux/
PHP、Linux、HTML5、UI、Android、その他のビデオチュートリアル (コースウェア + ノート + ビデオ) を学びましょう!連絡先 Q2430675018
参加へようこそlinuxコミュニケーショングループ 478068715

バイト
最小値
最大値
(符号付き/符号なし)
(署名/未署名) シンボリック)
TINYINT
1
-128
127
0
0
0
8
9223372036854775807
無署名
0
18446744073709551615


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。