[関連する学習の推奨事項: mysql チュートリアル ]
最近、データベース関連の操作が多く含まれており、会社の既存の仕様は次のとおりです。あまり包括的ではありません。インターネット上のさまざまな専門家の関連基準に従って、私自身の使用のためにいくつかの標準的な使用方法をまとめました。修正していただければ幸いです。
#データベース環境
dev: 開発環境
開発は読み取り、書き込み、変更が可能テーブル構造。開発者はテーブル構造とその中のデータを自由に変更できますが、他の開発同僚に影響を与えないようにする必要があります。test: テスト環境
は開発者による読み取りと書き込みが可能であり、開発者はツールを使用してテーブル構造を変更できます。online: オンライン環境
開発者は、オンライン環境でデータベース操作を直接実行することはできません。操作が必要な場合は、操作する DBA を見つけて作成する必要があります。圧力試験は禁止されています。 重要な問題は、各環境の MySQL サーバーに対応するユーザー権限が明確に分割され、識別可能であり、ビジネス シナリオなどを具体的に区別できる必要があることです。#命名規則
基本的な命名規則意味のある英語の語彙、単語を使用するアンダースコアで区切られています。 (ピンインは使用しないでください)
MySQL では、データベースとテーブルはディレクトリとその配下のファイルに対応します。したがって、オペレーティング システムの区別によって、データベースとテーブルの名前付けの大文字と小文字の区別が決まります。
Windows では大文字と小文字は区別されません。
同じモジュール内のテーブルには、できる限り同じプレフィックスを使用し、テーブル名は次のような意味を表現する必要があります。できるだけ。すべてのログ テーブルは log で始まります__
フィールド名
実際の意味を表す英語の単語または略語。ブール値の意味を持つフィールドには、is_ という接頭辞が付けられ、その後に動詞の過去分詞が続きます。
一意でないインデックスには、「idx_フィールド名_フィールド名[_フィールド名]」に従って名前を付ける必要があります
#主キー制約: pk_テーブル名。
テーブル エンジンは実際のアプリケーションに依存します。シナリオ、ログとレポート クラス テーブルには 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 が含まれている必要があります。データベース データの物理的な削除は原則として許可されません。
と timestamp はどう違いますか?
類似点:
TIMESTAMP 列の表示形式は DATETIME 列の表示形式と同じです。表示幅は 19 文字固定で、形式は YYYY-MM-DD HH:MM:SS です。差異:
TIMESTAMP#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 を保存するにはどうすればよいですか?
char(15) の代わりに INT UNSIGNED を使用して ipv4 アドレスを保存し、MySQL 関数 inet_ntoa および inet_aton を通じて変換します。現在、IPv6 アドレスには変換機能がないため、DECIMAL または 2 つの bigINT を使用して格納する必要があります。
の代わりに INT が使用されます。 ##INT[M].M 値は何を意味しますか? 数値型括弧の後の数字は幅を示すだけであり、格納範囲とは関係がないことに注意してください。 INT(4) と INT(10) の値の範囲は、それぞれ (-9999 ~ 9999) と (-9999999999 ~ 9999999999) であると考えている人が多いですが、これは間違いです。実際、整数の 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 値は、必要な文字数と、長さを記録するための 1 バイトのみを保存します (宣言された列の長さが 255 を超える場合は、2 バイトが使用されます)。 VARCHAR 値はパディングなしで保存されます。標準 SQL に準拠して、値の保存および取得時に末尾のスペースが保持されます。
char は、ユーザー パスワードの MD5 ハッシュ値を保存するのに適しており、その長さは常に同じです。また、固定長の行は断片化が起こりにくいため、頻繁に変更される値の場合は varchar よりも char の方が適しており、非常に短い列の場合は varchar よりも char の方が効率的です。 char(1) 文字列は、シングルバイト文字セットの場合 1 バイトのみを占有しますが、varchar(1) 文字列は 2 バイトを占有します。これは、1 バイトが長さ情報の格納に使用されるためです。
インデックス設計仕様
MySQL のクエリ速度は適切なインデックス設計に依存するため、インデックスは高いパフォーマンスを実現するために重要です。適切なインデックスを使用するとクエリの速度が向上します (UPDATE および DELETE の速度を含みます。MySQL は行を含むページをメモリにロードしてから UPDATE または DELETE 操作を実行します)。一方、不合理なインデックスを使用すると速度が低下します。 MySQL のインデックス検索は、新華辞典のピンインと部首の検索に似ており、ピンインと部首のインデックスが存在しない場合は、ページをめくるしか検索できません。 MySQL クエリでインデックスを使用できない場合、MySQL はテーブル全体のスキャンを実行し、大量の IO を消費します。インデックスの目的: 重複排除、位置決めの高速化、ソートの回避、インデックスの上書き。
カバリング インデックスとは
InnoDB ストレージ エンジンでは、セカンダリ インデックス (非主キー インデックス) は行アドレスを直接格納せず、主キーの値を格納します。 。ユーザーがセカンダリ インデックスに含まれていないデータ列をクエリする必要がある場合は、まずセカンダリ インデックスを通じて主キー値を検索し、次に主キーを通じて他のデータ列をクエリする必要があります。 2回質問される。カバリング インデックスの概念は、クエリはインデックス内で完了でき、カバリング インデックスの方が効率的であり、主キー クエリは自然なカバリング インデックスであるということです。インデックスを合理的に作成し、クエリ ステートメントを合理的に使用すると、カバリング インデックスを使用する場合のパフォーマンスが向上します。たとえば、SELECT email,uid FROM user_email WHERE uid=xx の場合、uid が主キーでない場合は、パフォーマンスを向上させるために適切な場合にインデックスをindex(uid,email) として追加できます。
インデックスの基本仕様
なぜインデックスが多すぎてはいけないのかテーブル?
InnoDB のセカンダリ インデックスはストレージに b ツリーを使用するため、UPDATE、DELETE、INSERT 時に b ツリーを調整する必要があり、インデックスが多すぎると更新速度が遅くなります。
文字列にはプレフィックス インデックスを使用します。プレフィックス インデックスの長さは 8 文字を超えてはなりません。プレフィックス インデックスを優先することをお勧めします。必要に応じて、疑似列を追加してインデックスを作成できます。
BLOB/テキストおよびその他のフィールドのインデックスを作成しないでください。また、大きなフィールドのインデックスを作成しないでください。インデックスが多くの記憶領域を占有することになります。
プレフィックス インデックスとは何ですか?
率直に言うと、プレフィックス インデックスはテキストの最初の数文字 (具体的には、インデックスの作成時に指定された文字数) にインデックスを付けるため、作成されるインデックスが小さくなります。のほうが速いです。プレフィックス インデックスを使用すると、インデックス ファイルのサイズが効果的に削減され、インデックス作成速度が向上します。ただし、プレフィックス インデックスには欠点もあります。MySQL では、ORDER BY または GROUP BY でプレフィックス インデックスを使用できず、カバー インデックスとしても使用できません。
プレフィックス インデックスを確立するための構文: ALTER TABLE table_name ADD KEY(column_name(prefix_length));
主キーのガイドライン
最大の差別化フィールドを前面に配置します
#注文番号、ユーザー ID など、より適切なフィルタリング プロパティを持つフィールドを選択し、前面に配置します。一般に、タイプやステータスなどのフィルタリング プロパティを持つフィールドを先頭に置くことはお勧めできません##合計MYISAM ストレージ エンジンのインデックスの長さは 1000 バイトを超えることはできません BLOB および TEXT タイプの列はプレフィックス インデックスのみを作成できます
MYSQL は現在関数インデックスをサポートしていません等しくない (!= または <> を使用する場合) )、MYSQL はインデックスを使用できません。
関数操作 (abs (column) など) を使用してフィールドをフィルタリングした後、MYSQL はインデックスを使用できません。
JOIN ステートメント内の結合条件フィールドのタイプが一致しない場合、MYSQL はインデックスを使用できません。
LIKE 操作を使用する場合、条件がワイルドカード (「�c…」など) で始まる場合、MYSQL はインデックスを使用できません。索引。
非同等のクエリを使用する場合、MYSQL はハッシュ インデックスを使用できません。
プリコンパイルされたステートメントを使用します
パラメータのみを渡します。SQL を渡すよりも効率的です。ステートメント
インデックスの失敗の原因になります。
プレフィックス インデックスを最大限に活用してください
左端のプレフィックスである必要があります
インデックスを使用できないため、テーブル全体のスキャンが行われます
データベースに最適な機能を実行させます
ビジネスの結合を減らし、 sacle out とシャーディングMySQL が最も優れているのは、単一テーブルのプライマリ キー/セカンダリ インデックス クエリJOIN より多くのメモリを消費し、一時テーブルを生成します
データベースでの数学的演算を回避します
MySQL は数学的演算や論理的判断が苦手です。
インデックスが使用できません。INSERT … ON DUPLICATE KEY UPDATE
REPLACE INTO 、 INSERT IGNORE 、INSERT INTO VALUES(),(),()ページングによって表示されるページ数を制限します。遅延関連付けを使用すると、前のページと次のページのみをクリックできます
ページングを正しく使用するにはどうすればよいですか?次のようなページング ステートメントがあるとします。 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 select * from table where id<100 order by id desc limit 10 //上一页 http://example.com/page.php?first=110 select * from table where id>110 order by id desc limit 10
この方法の最大の欠点は、閲覧中に挿入/削除操作がある場合、ページめくりが更新されず、総ページ数が新しいカウントに基づいて計算される可能性があることです( *)、最後に、一部のレコードはアクセスできない可能性があります。この問題を解決するには、引き続き現在のページ番号を導入し、最後のページめくり以降のレコードの総数に影響を与える挿入/削除操作があるかどうかを確認し、それらをキャッシュします。
select * from table where id >= (select id from table order by id limit #offset#, 1)
select * from test_union1 union select * from test_union2
この SQL は、実行時に最初に 2 つのテーブルの結果を取り出し、次にソート スペースを使用して重複レコードを並べ替えて削除し、最後に結果セットを返します。テーブル データが大きい場合は、ディスクが処理に使用される可能性があります。
そして、union all は 2 つの結果を単純に結合して返します。このように、返された 2 つの結果セットに重複データがある場合、返された結果セットには重複データが含まれます。
从效率上说,union all要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用union all,如下:
select * from test_union1 union all select * from test_union2
分表规范
单表一到两年内数据量超过500w或数据容量超过10G考虑分表,需提前考虑历史数据迁移或应用自行删除历史数据,采用等量均衡分表或根据业务规则分表均可。要分表的数据表必须与DBA商量分表策略
行为规范
其他规范
日志类数据不建议存储在MySQL上,优先考虑Hbase或OceanBase,如需要存储请找DBA评估使用压缩表存储。
相关图文教程:mysql数据库图文教程
以上が史上最も包括的な MySQL 使用仕様の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。