MySQL 使用仕様の概要

MySQL 使用仕様の概要

1. InnoDBストレージエンジンを使用する必要があります

CPU と IO のパフォーマンスが向上し、バックアップとテーブル ロックのメカニズムが改善され、統計とデバッグの効率が向上しました。

さらに、システムとして、InnoDB はさまざまな主要機能をサポートしていますが、その中で最も重要なのはトランザクション ログと行レベルのロックです。トランザクション ログには実際のデータベース トランザクションが記録されますが、さらに重要なのは、データ クラッシュの回復とロールバックです。

InooDB ベースの IO は、より安全なデータ保護と優れたパフォーマンスを提供できます。さらに、ほとんどの場合、行レベルのロックでは、ユーザーが書き込むデータのみをロックし、データの読み取りはブロックされないため、より高い同時実行パフォーマンスを実現できます。

2. データテーブルとデータフィールドに中国語のコメントを追加する必要がある

将来、新規ユーザーがより早く理解して慣れるのに便利になり、さらに読みやすくなります。同時に、ステータス フィールドには、削除の場合は 0、正常の場合は 1 などの列挙値がマークされます。

3. UTF8mb4文字セットを使用する必要があります

UTF8 はユニバーサル文字セットです。MB4 は UTF8 の拡張であり、絵文字などの新しい文字をサポートします。

4. ストアド プロシージャ、ビュー、トリガー、イベント、結合などの使用を禁止します。

高同時実行ビッグデータ インターネット サービスの場合、アーキテクチャ設計の考え方は、「データベース CPU を解放し、コンピューティングをサービス層に移す」ことです。データベースはストレージとインデックス作成に適しており、ビジネス層では CPU コンピューティングの方が合理的です。

5. 大きなファイルや写真を保存しない

人物の写真が多いと、ページングクエリの速度が大幅に低下します。以前は 1 秒以内に応答していましたが、写真フィールドを追加してからは、応答に約 4 ~ 5 秒かかります。
大きなファイルや写真はファイルシステムに保存されるため、URIはデータベースに保存する方がよい

6. テーブルには、自動増分主キーなどの主キーが必要です。

a) 主キーの増分とデータ行の書き込みにより、挿入パフォーマンスが向上し、ページ分割が回避され、テーブルの断片化が軽減され、スペースとメモリの使用量が改善されます。
b) 数値の主キーを使用します。データ型が短いほど、インデックスのディスク領域を効果的に削減し、インデックスのキャッシュ効率を向上させることができます。
c) 主キーのないテーブルを削除すると、ROW モードのマスター/スレーブ アーキテクチャでスタンバイ データベースがブロックされます。
d) ビジネス主キーをより頻繁に使用すると、データベースとテーブルを分割するのがより便利になります。

7. 外部キーは禁止されています。外部キーの整合性制約がある場合は、アプリケーション制御が必要です。

外部キーはテーブル間の結合を引き起こします。更新および削除操作には関連するテーブルが関係するため、SQL のパフォーマンスに大きな影響を与え、デッドロックを引き起こすこともあります。

8. フィールドはNOT NULLとして定義され、デフォルト値が提供される必要があります。

a) NULL 値を持つ列により、インデックス/インデックス統計/値の比較がより複雑になり、MySQL による最適化が困難になります。
b) Null このタイプのデータは、MySQL 内で特別に処理する必要があり、データベース レコード処理の複雑さが増します。同じ条件下で、テーブルに空のフィールドが多数ある場合、データベース処理のパフォーマンスが大幅に低下します。
c) NULL 値は、テーブルでもインデックスでも、より多くのストレージ スペースを必要とし、NULL 列の各行を識別するために追加のスペースが必要になります。
d) null を扱う場合、is null または is not null のみが使用でき、=、in、<、<>、!=、not in などの演算記号は使用できません。

たとえば、name!='nx' の場合、name が null のレコードが存在すると、クエリ結果には name が null のレコードは含まれません。

9. TEXT型とBLOB型は使用しない

ディスクとメモリのスペースがさらに無駄になります。不必要な大規模フィールドのクエリによってホット データが削除され、メモリ ヒット率が急激に低下し、データベースのパフォーマンスに影響を及ぼします。

10. 通貨を保存するのに小数点を使用しない

小数点を使用すると金額が一致しなくなる可能性が高くなりますので、整数を使用してください。

11. 携帯電話番号を保存するにはvarchar(20)を使用する必要があります

a) 市外局番や国番号の場合、+-()が表示されることがあります。
b) 携帯電話番号で数学演算を実行できますか?
c) VARCHAR はあいまいクエリをサポートできます。例: "138%"

12. ENUMは禁止されています。代わりにTINYINTを使用できます。

a) 新しいENUM値を追加するにはDDL操作が必要です
b) ENUM の実際の内部ストレージは整数です。文字列を定義したと思いましたか?

13. インデックス設計について

(1)1つのテーブル内のインデックスの数は5未満に制限することをお勧めします。

インデックスの数が多いほど良いというわけではありません。インデックスは効率を向上させることができますが、効率を低下させることもできます。

インデックスはクエリの効率を高めることができますが、挿入と更新の効率、さらには場合によってはクエリの効率も低下させる可能性があります。

MySQL オプティマイザがクエリを最適化する方法を選択する際、統合された情報に基づいて利用可能な各インデックスを評価し、最適な実行プランを生成します。クエリに同時に多くのインデックスを使用できる場合、MySQL オプティマイザが実行プランを生成する時間が長くなり、クエリのパフォーマンスも低下します。

(2)頻繁に更新され、差別化の度合いが低い属性にはインデックスを作成しないでください。

a) 更新によりB+ツリーが変更され、頻繁に更新されるフィールドのインデックス作成によりデータベースのパフォーマンスが大幅に低下します。
b) 「性別」のようにあまり差別化されていない属性の場合、インデックスを作成しても意味がありません。これではデータを効果的にフィルタリングできず、パフォーマンスは完全なテーブルスキャンと同様になります。

(3)複合インデックスを作成する場合、識別力の高いフィールドを先頭に配置する必要があります。

理由: データをより効果的にフィルタリングできる

14. SQLの使用仕様について

(1) INSERT INTO t_xxx VALUES(xxx)は禁止されています。挿入する列属性を指定する必要があります。

理由: フィールドを追加または削除すると、プログラムにバグが発生しやすくなります。

(2)WHERE条件の属性に関数や式を使用することは禁止されています。

理由: SELECT uid FROM t_user WHERE from_unixtime(day)>='2019-10-09' を実行すると、テーブル全体がスキャンされます。正しい書き方は次のとおりです: SELECT uid FROM t_user WHERE day>= unix_timestamp('2019-10-09 00:00:00')

(3)%で始まる否定クエリやあいまいクエリは禁止されている

理由:
a) 否定的なクエリ条件: NOT、!=、<>、!<、!>、NOT IN、NOT LIKE などの場合、テーブル全体がスキャンされます。
b) %で始まるファジークエリは完全なテーブルスキャンになります

(4)大きなテーブルではJOINクエリとサブクエリは禁止されています。

理由: 一時テーブルが生成され、メモリとCPUの消費量が増え、データベースのパフォーマンスに大きな影響を与えます。

(5)OR条件は禁止されており、INクエリに変更する必要がある。

理由: MySQL の古いバージョンの OR クエリでは、インデックスにヒットできません。インデックスにヒットできたとしても、クエリの最適化を実装するためにデータベースがより多くの CPU を消費する必要があるのはなぜでしょうか?

(6)アプリケーションはSQL例外を捕捉し、それに応じて処理する必要がある

以上がMySQL使用仕様のまとめの詳細内容です。MySQL使用仕様の詳細については、123WORDPRESS.COMの他の関連記事にも注目してください!

以下もご興味があるかもしれません:
  • 超詳細なMySQL使用仕様の共有
  • MySQLデータベースの使用仕様の概要
  • 経験豊富な人が、プロフェッショナルで標準化されたMySQL起動スクリプトの開発方法を紹介します。
  • MySQL開発標準と使用スキルの概要
  • MySQL データベース開発仕様 [推奨]
  • MySQL データベースの命名標準と規則
  • Mysql テーブル作成とインデックス使用仕様の詳細な説明
  • MYSQL データベースの命名と設計仕様
  • プロフェッショナルなMySQL開発設計仕様とSQL記述仕様

<<:  Linux ディレクトリ切り替え実装コード例

>>:  この記事はVueのライフサイクルを理解するのに役立ちます

推薦する

DockerコンテナにNFS共有ディレクトリをマウントする実装

以前、https://www.jb51.net/article/205922.htm で、Docke...

CentOS7 環境で gcc (バージョン 10.2.0) をアップグレードする詳細な手順

目次簡単な紹介1. 現在のgccバージョンを確認する2. gccインストールパッケージ(バージョン1...

HTMLシールドの右クリックメニューと左クリック入力機能の例

右クリックメニューを無効にする <body oncontextmenu=self.event....

Linux netstatコマンドの詳細な説明

目次Linux netstat コマンド1. TCP接続ステータスの詳細な説明2. コマンド形式3....

MySQL データベース 8 - データベース内の関数の適用の詳細な説明

データベースの組み込み関数の使用この記事では、主に日付関数、文字列関数、数学関数など、データベースの...

Ubuntu 20.04 aptの国内ソースを変更する方法

UPD 2020.2.26 現在、Ubuntu 20.04 LTSはまだリリースされていないため、チ...

シンプルな CSS テキストアニメーション効果

成果を達成する 実装コードhtml <div id=コンテナ> いらっしゃいませ <...

Web ページの HTML コードの説明: 順序付きリストと順序なしリスト

このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...

Dockerfile echoは、指定されたファイル内の複数行のテキストを実装する方法を指定します。

Dockerfile内の指定されたファイルに複数の行を追加します。echoの後の「$」記号に注意し...

HTML ページの先頭に戻るいくつかの実装の概要

最近、ウェブサイトを開発する際にトップに戻るボタンを作成する必要がありますが、私は主にバックエンドの...

React Native の基本原則の深い理解 (Bridge of React Native)

この記事では、React Native の基本をすでに理解していることを前提とし、ネイティブと Ja...

Vue2は応答性を提供するためにprovide injectを実装しています

1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...

Vueカスタムディレクティブを使用してドラッグアンドドロッププラグインを構築する方法

HTML5 のドラッグ アンド ドロップ機能は誰もが知っていますが、これを使用するとドラッグ アンド...

ウェブ開発者やデザイナーにとって欠かせないオンラインウェブツールとアプリケーション

これまでの記事で、フロントエンド開発者にとって必須のツール、スクリプト、リソースのコレクションを紹介...

Tencent Cloudでhive3.1.2を構築する方法を教えます

環境の準備操作を開始する前に、hadoop バージョンがインストールされていることを確認してください...