MySQL の進歩をガイドする 47 枚の図

coldplay.xixi
リリース: 2020-10-14 17:27:20
転載
2386 人が閲覧しました

MySQL チュートリアル コラムでは、高度な MySQL を理解するために 47 枚の図を紹介します。

MySQL の進歩をガイドする 47 枚の図

MySQL 入門の章では、主に基本的な SQL コマンド、データ型、関数を紹介します。上記の知識があれば、MySQL を開発できます。資格のある開発者になりたい場合は、より高度なスキルも必要です。MySQL に必要な高度なスキルについて説明しましょう

MySQL ストレージ エンジン

ストレージ エンジンの概要

データベースの核心はデータを保存することであり、データ ストレージではディスクの処理を避けることはできません。したがって、データをどのようにどのように保存するかがストレージの鍵となります。したがって、ストレージ エンジンはデータ ストレージのエンジンと同等であり、データをディスク レベルで保存します。

MySQL のアーキテクチャは 3 層モデルに従って理解できます

MySQL の進歩をガイドする 47 枚の図

ストレージ エンジンも MySQL のコンポーネントですこれはソフトウェアの一種で、実行およびサポートできる主な機能は次のとおりです。

  • 同時実行性
  • サポート トランザクション
  • 整合性制約
  • 物理的storage
  • サポート インデックス
  • パフォーマンス ヘルプ

MySQL は、さまざまなデータベース アプリケーションに合わせて、デフォルトで複数のストレージ エンジンをサポートしています。ユーザーは、ニーズに応じて適切なストレージ エンジンを選択できます。以下は MySQL Storage Engine でサポートされています

  • MyISAM
  • InnoDB
  • BDB
  • MEMORY
  • MERGE
  • NDB クラスター
  • アーカイブ
  • CSV
  • ブラックホール
  • フェデレーテッド

作成者デフォルト、ストレージ エンジンを指定せずにテーブルが作成された場合、デフォルトのストレージ エンジンが使用されます。デフォルトのストレージ エンジンを変更したい場合は、パラメータ ファイルで default-table-type を設定して、現在のストレージ エンジン

show variables like 'table_type';复制代码
ログイン後にコピー
MySQL の進歩をガイドする 47 枚の図

奇妙なことに、なぜなくなってしまったのでしょうか?オンラインで確認したところ、このパラメーターは 5.5.3 でキャンセルされたことがわかりました。

次の 2 つの方法で、現在のデータベースでサポートされているストレージ エンジンをクエリできます。

show engines \g复制代码
ログイン後にコピー
MySQL の進歩をガイドする 47 枚の図

新しいテーブルを作成するときに、ENGINE キーワードを追加することで、新しいテーブルのストレージ エンジンを設定できます。

create table cxuan002(id int(10),name varchar(20)) engine = MyISAM;复制代码
ログイン後にコピー
MySQL の進歩をガイドする 47 枚の図

上の図では、MyISAM のストレージ エンジンを指定しました。

テーブルのストレージ エンジンがわからない場合はどうすればよいでしょうか? show create table

MySQL の進歩をガイドする 47 枚の図

ストレージ エンジンが指定されていない場合、MySQL 5.1 バージョン以降では、MySQL で表示できます。デフォルトの組み込みストレージ エンジンはすでに InnoDB です。テーブルを作成して見てみましょう

MySQL の進歩をガイドする 47 枚の図

上の図に示すように、デフォルトのストレージ エンジンは指定されていません。 table

MySQL の進歩をガイドする 47 枚の図

ご覧のとおり、デフォルトのストレージ エンジンは InnoDB です。

ストレージ エンジンを交換したい場合は、

alter table cxuan003 engine = myisam;复制代码
ログイン後にコピー

を使用して交換できます。交換が完了すると、0 行が影響を受けましたが表示されますが、操作が成功したという事実

MySQL の進歩をガイドする 47 枚の図

show create tableを使用してテーブルのSQLをチェックすると、それがわかります

MySQL の進歩をガイドする 47 枚の図
##ストレージ エンジンの機能

次に、一般的に使用されるいくつかのストレージ エンジンとその基本機能を紹介します。これらのストレージ エンジンは **MyISAM、 InnoDB、MEMORY、MERGE **

MyISAM

バージョン 5.1 より前は、MyISAM が MySQL のデフォルトのストレージ エンジンでした。MyISAM は同時実行性が低く、使用されるシナリオは限られていました。その主な機能は次のとおりです。

  • transaction 操作がサポートされていない場合、ACID 機能は存在しません。この設計は、パフォーマンスと効率を考慮したものです。

  • 外部キー操作はサポートされていません。外部キーを強制的に追加した場合、MySQL はエラーを報告しませんが、外部キーは機能しません。

  • MyISAM のデフォルトのロック粒度は テーブル レベル ロック であるため、同時実行パフォーマンスは比較的低く、ロックは高速で、ロックの競合は少なく、デッドロックも少なくなります。発生する可能性が高いケース。

  • MyISAM はディスク上に 3 つのファイルを保存します。ファイル名はテーブル名と同じで、拡張子は .frm (ストレージ テーブル定義) です。 .MYD(MYData,ストレージ データ),MYI(MyIndex,ストレージ インデックス).ここで特別な注意が必要なのは、MyISAM は インデックス ファイル のみをキャッシュし、データ ファイルはキャッシュしないことです。

  • MyISAM でサポートされるインデックス タイプは、グローバル インデックス (フルテキスト)B ツリー インデックス R-Tree です。インデックス

    フルテキスト インデックス: テキストに対するファジー クエリの効率が低いという問題を解決するようです。

    B ツリー インデックス: すべてのインデックス ノードはバランス ツリーのデータ構造に従って格納され、すべてのインデックス データ ノードはリーフ ノードにあります。

    R ツリー インデックス: その格納方法は次のとおりです。 B ツリー インデックスと同じですが、いくつかの違いがあります。これらは主に、空間データおよび多次元データを格納するフィールドのインデックスを作成するように設計されています。現在の MySQL バージョンでは、インデックス作成にジオメトリ タイプのフィールドのみがサポートされています。BTREE と比較した場合、RTREE の利点は範囲検索です。

  • データベースが配置されているホストがダウンすると、MyISAM データ ファイルは簡単に破損し、回復が困難になります。

  • #追加、削除、変更、クエリのパフォーマンスの観点: SELECT はパフォーマンスが高く、クエリが多数ある状況に適しています

  • # #InnoDB

MySQL 5.1 以降、デフォルトのストレージ エンジンは InnoDB ストレージ エンジンになりました。MyISAM と比較して、InnoDB ストレージ エンジンは大幅に変更されました。その主な機能は

トランザクション操作をサポートし、トランザクション ACID 分離機能を備えています。デフォルトの分離レベルは
    repetable-read(repetable-read)
  • で、MVCC (同時バージョン管理) を通じて実装されます。 汚い読書再現不可能な読書の問題を解決できます。 InnoDB は外部キー操作をサポートしています。
  • InnoDB のデフォルトのロック粒度
  • 行レベル ロック
  • は同時実行パフォーマンスが優れていますが、デッドロックが発生する可能性があります。 MyISAM と同様、InnoDB ストレージ エンジンにも
  • .frm ファイル ストレージ テーブル構造
  • 定義がありますが、異なる点は、InnoDB のテーブル データとインデックス データが両方ともリーフ上に一緒に保存されることです。 B番号のノードでは、MyISAMのテーブルデータとインデックスデータが分離されています。 InnoDB には安全なログ ファイルがあり、このログ ファイルは、データベースのクラッシュやその他の状況によって発生したデータ損失を回復し、データの一貫性を確保するために使用されます。
  • InnoDB と MyISAM は同じインデックス タイプをサポートしますが、ファイル構造が異なるため、具体的な実装は大きく異なります。
  • 追加、削除、変更、クエリのパフォーマンスの観点から、大量の追加、削除、変更操作を実行する場合は、削除中に行を削除する InnoDB ストレージ エンジンを使用することをお勧めします。操作を実行し、テーブルを再構築しません。
  • MEMORY

MEMORY ストレージ エンジンは、メモリ内に存在するコンテンツを使用してテーブルを作成します。各 MEMORY テーブルは実際には 1 つのディスク ファイルにのみ対応し、形式は

.frm

です。 MEMORY タイプのテーブルは、データがメモリに保存されるため、非常に高速にアクセスされます。 HASH インデックス がデフォルトで使用されます。 MERGE

MERGE ストレージ エンジンは、一連の MyISAM テーブルの組み合わせです。MERGE テーブル自体にはデータがありません。MERGE タイプのテーブルに対するクエリ、更新、および削除の操作は、実際には内部 MyISAM です。テーブル。 MERGE テーブルはディスク上に 2 つのファイルを保持します。1 つはテーブル定義を保存する

.frm

ファイルで、もう 1 つは MERGE テーブルの構成を保存する .MRG ファイルです。 、など。 適切なストレージ エンジンの選択

実際の開発プロセスでは、アプリケーションの特性に基づいて適切なストレージ エンジンを選択することがよくあります。

  • MyISAM: アプリケーションが通常は取得指向で、挿入、更新、削除の操作が少なく、整合性と同時実行性がそれほど高くない場合は、通常、 MyISAM ストレージ エンジン。
  • InnoDB: 外部キーが使用され、高度な同時実行性が必要であり、データの一貫性要件が高い場合、通常は InnoDB エンジンが選択されます。一般に、大手インターネット企業では同時実行性とデータの整合性に対する要件が高くなります。 、そのため、通常は InnoDB ストレージ エンジンを使用します。
  • MEMORY: MEMORY ストレージ エンジンはすべてのデータをメモリに保存し、迅速な場所の特定が必要な場合に非常に高速なアクセスを提供します。 MEMORY は通常、更新頻度が低い小さなテーブルや、結果に素早くアクセスするために使用されます。
  • MERGE: MERGE は MyISAM テーブルを内部的に使用します。MERGE テーブルの利点は、単一の MyISAM テーブルのサイズ制限を突破できることと、異なるテーブルを複数のディスクに分散することで、アクセス効率が効果的に向上します。

適切なデータ型の選択

よく遭遇する問題は、テーブルを構築するときに適切なデータ型を選択する方法です。一般に、適切なデータ型を選択するとパフォーマンスが向上します。不要なトラブルを減らすために、適切なデータ型を選択する方法について説明します。

CHAR と VARCHAR の選択

char と varchar は、文字列を格納するためによく使用される 2 つのデータ型です。char は通常、固定長の文字列を格納し、固定長です。次のような文字型です。次の

# valuechar(5)ストレージ バイト''' '5 バイト'cx'' cx '5 バイト'cxuan''cxuan'5 バイト'cxuan007 ''cxuan'5 バイト
は、どんな値が書かれていても表示されますか? char の長さが一定になると、文字数を指定した場合、指定した文字数に満たない場合はスペースで埋められ、文字列長を超える場合は指定した文字長の文字のみが格納されます。

ここで注意してください: MySQL が非

strict モード を使用する場合、上記のテーブルの最後の行を保存できます。 MySQL が strict モード を使用している場合、テーブルの最後の行を保存するときにエラーが報告されます。

varchar 文字タイプが使用されている場合の例を見てみましょう

Valuevarchar(5)ストレージバイト''''1バイト'cx''cx '3 バイト'cxuan'' cxuan'6 バイト'cxuan007''cxuan'6 バイト

varchar を使用すると、格納されたバイトが実際の値に従って格納されることがわかります。なぜ varchar の長さが 5 であるのに、3 バイトまたは 6 バイトを格納する必要があるのか​​疑問に思われるかもしれませんが、これは、格納に varchar データ型を使用する場合、デフォルトで文字列の長さが末尾に追加され、1 ワードを占有するためです。 (列宣言が 255 より長い場合は 2 バイトが使用されます)。 varchar は空の文字列を埋めません。

通常、 ID 番号、携帯電話番号、電子メールなどの固定長文字列を格納するには char を使用します。; 可変長文字列を格納するには varchar を使用します。 char は長さが固定されているため、処理速度は VARCHAR よりもはるかに高速ですが、ストレージ領域を無駄に消費するという欠点があります。ただし、MySQL のバージョンの継続的な進化に伴い、varchar データ型のパフォーマンスも向上し続けています。多くのアプリケーションで使用されるため、VARCHAR 型の方が一般的に使用されます。

MySQL では、ストレージ エンジンごとに CHAR と VARCHAR の使用原則が異なります

  • MyISAM: 可変長データ列の代わりに固定長データ列を使用することをお勧めします。 CHAR
  • MEMORY: 処理には固定長を使用します。CHAR および VARCHAR は CHAR
  • InnoDB として扱われます。VARCHAR タイプ

TEXT を使用することをお勧めします。 BLOB

一般に、少量のテキストを保存する場合は、CHAR と VARCHAR を選択します。大量のテキストを保存する場合は、TEXT と BLOB を選択することがよくあります。TEXT と BLOB の主な違いは、BLOB は保存できることです。 バイナリ データ; TEXT は 文字データ しか保存できませんが、TEXT は

  • TEXT
  • MEDIUMTEXT
  • に分割されます。 LONGTEXT

BLOB は

  • BLOB
  • MEDIUMBLOB
  • LONGBLOB

3 つに細分されます。それらの主な違いは、保存されるテキストの長さとストレージバイトの違いです。ユーザーは、実際の状況に応じてニーズを満たす最小のストレージタイプを選択する必要があります。以下では、主に BLOB と TEXT

TEXT に関するいくつかの問題を紹介しますデータを削除すると、BLOB のパフォーマンスに問題が発生します。パフォーマンスを向上させるために、OPTIMIZE TABLE 関数を使用してテーブルを最適化することをお勧めします。

合成インデックスを使用して、テキスト フィールド (BLOB および TEXT) のクエリ パフォーマンスを向上させることもできます。合成インデックスは、ラージ テキスト (BLOB および TEXT) フィールドの内容に基づいてハッシュ値を作成し、この値を対応する列に格納します。これにより、ハッシュ値に基づいて対応するデータ行を見つけることができます。一般的には、md5() や SHA1() などのハッシュ アルゴリズムが使用されます。ハッシュ アルゴリズムによって生成された文字列の末尾にスペースがある場合は、CHAR や VARCHAR に格納しないでください。この使用法を見てみましょう

まず、BLOB フィールドとハッシュ値を記録するテーブルを作成します。

MySQL の進歩をガイドする 47 枚の図

データを cxuan005 に挿入します。ここで、ハッシュ値は情報ハッシュ値として使用されます。

MySQL の進歩をガイドする 47 枚の図

次に、さらに 2 つのデータを挿入します。

MySQL の進歩をガイドする 47 枚の図

挿入1 つの情報は cxuan005 のデータです

MySQL の進歩をガイドする 47 枚の図
#info が cxuan005 であるデータをクエリする場合は、ハッシュ列をクエリすることでクエリできます

MySQL の進歩をガイドする 47 枚の図
これは合成インデックスの例です。BLOB に対してファジー クエリを実行する場合は、プレフィックス インデックスを使用する必要があります。

BLOB と TEXT を最適化するその他の方法:

    必要な場合を除き、BLOB インデックスと TEXT インデックスを取得しないでください。
  • BLOB 列または TEXT 列を別のテーブルに分離します。
浮動小数点数と固定小数点数の選択

浮動小数点数とは、小数点を含む値を指しますが、浮動小数点数が指定された列に挿入され、指定された精度を超えた後、 MySQL 浮動小数点数は

float および double を参照し、固定小数点数は Decimal を参照します。 -ポイント番号により、データをより正確に保存および表示できます。例を使用して浮動小数点数の精度を説明しましょう。

最初に、浮動小数点数の問題をテストするために、テーブル cxuan006 を作成します。そのため、ここで選択するデータ型は float

## です。
MySQL の進歩をガイドする 47 枚の図
#次に 2 つのデータをそれぞれ挿入します
MySQL の進歩をガイドする 47 枚の図
#次にクエリを実行すると、クエリされた 2 つのデータが異なる方法で丸められていることがわかります。

MySQL の進歩をガイドする 47 枚の図
##浮動小数点数と固定小数点数の間の精度の問題を明確に理解するために、もう一度例を見てみましょう

MySQL の進歩をガイドする 47 枚の図
最初にedit cxuan006 2 つのフィールドの長さと小数点以下の桁数が同じです

次に 2 つのデータを挿入します

MySQL の進歩をガイドする 47 枚の図
クエリを実行します操作を実行すると、固定小数点数と比較すると、浮動小数点数ではエラーが発生することがわかります。

MySQL の進歩をガイドする 47 枚の図
#日付型の選択

MySQL では、

DATE、TIME、DATETIME、TIMESTAMP

などの日付型を表すために使用されます。MySQL の使用を開始する方法を示す

138 枚の図では、日付型の違いについてはすでに紹介しましたが、ここでは詳しく説明しません。以下では、主に

TIMESTAMP の選択を紹介します。タイム ゾーンに関連しており、現在時刻をより適切に反映できます。記録された日付を異なるタイム ゾーンの人々が使用する必要がある場合は、次のようにするのが最善です。タイムスタンプを使用します。
  • DATE は、年、月、日を表すために使用されます。実際のアプリケーション値に年、月、日を保存する必要がある場合は、DATE を使用できます。
  • TIME は、時、分、秒を表すために使用されます。実際のアプリケーションの値で時間、分、秒を保存する必要がある場合は、TIME を使用できます。
  • YEAR は年を表すために使用されます。YEAR には 2 桁 (できれば 4 桁) と 4 桁の年の形式があります。デフォルトは 4 桁です。実際のアプリケーションが年のみを保存する場合は、YEAR 型を保存するために 1 バイトを使用してもまったく問題ありません。保管スペースを節約できるだけでなく、テーブルの操作効率も向上します。
  • MySQL キャラクタ セット

MySQL キャラクタ セットについて理解しましょう。簡単に言うと、キャラクタ セットとは、テキスト シンボル、エンコーディング、および比較ルールのセットです。 1960 年に、アメリカ標準化機構 ANSI は、有名な

ASCII (American Standard Code for Information Interchange)

である最初のコンピューター文字セットをリリースしました。 ASCII エンコード以来、各国や国際機関は ISO-8859-1GBK などの独自の文字セットを開発してきました。 しかし、各国は独自の文字セットを使用しているため、移植性に大きな困難が生じています。したがって、文字エンコーディングを統一するために、

国際標準化機構 (ISO)

は、ほぼすべての文字エンコーディングに対応する統一文字標準である Unicode エンコーディングを指定しました。以下は、一般的な文字エンコーディングの一部です。

#文字セット##負の長さですか##エンコーディング方法 は シングルバイト 7 ビット エンコードですシングルバイト 8 ビット エンコーディングダブルバイト エンコーディング1 - 4 バイトのエンコード2 バイトまたは 4 バイトのエンコード4 バイトのエンコード
##ASCII
ISO-8859-1 is
GBK is
UTF-8 No
UTF-16 いいえ
UTF-32 はい

对数据库来说,字符集是很重要的,因为数据库存储的数据大多数都是各种文字,字符集对数据库的存储、性能、系统的移植来说都非常重要。

MySQL 支持多种字符集,可以使用 show character set; 来查看所有可用的字符集

MySQL の進歩をガイドする 47 枚の図

或者使用

select character_set_name, default_collate_name, description, maxlen from information_schema.character_sets;复制代码
ログイン後にコピー

来查看。

使用 information_schema.character_set 来查看字符集和校对规则。

索引的设计和使用

我们上面介绍到了索引的几种类型并对不同的索引类型做了阐述,阐明了优缺点等等,下面我们从设计角度来聊一下索引,关于索引,你必须要知道的一点就是:索引是数据库用来提高性能的最常用工具

索引概述

所有的 MySQL 类型都可以进行索引,对相关列使用索引是提高 SELECT 查询性能的最佳途径。MyISAM 和 InnoDB 都是使用 BTREE 作为索引,MySQL 5 不支持函数索引,但是支持 前缀索引

前缀索引顾名思义就是对列字段的前缀做索引,前缀索引的长度和存储引擎有关系。MyISAM 前缀索引的长度支持到 1000 字节,InnoDB 前缀索引的长度支持到 767 字节,索引值重复性越低,查询效率也就越高。

在 MySQL 中,主要有下面这几种索引

  • 全局索引(FULLTEXT):全局索引,目前只有 MyISAM 引擎支持全局索引,它的出现是为了解决针对文本的模糊查询效率较低的问题,并且只限于 CHAR、VARCHAR 和 TEXT 列。
  • 哈希索引(HASH):哈希索引是 MySQL 中用到的唯一 key-value 键值对的数据结构,很适合作为索引。HASH 索引具有一次定位的好处,不需要像树那样逐个节点查找,但是这种查找适合应用于查找单个键的情况,对于范围查找,HASH 索引的性能就会很低。默认情况下,MEMORY 存储引擎使用 HASH 索引,但也支持 BTREE 索引。
  • B-Tree 索引:B 就是 Balance 的意思,BTree 是一种平衡树,它有很多变种,最常见的就是 B+ Tree,它被 MySQL 广泛使用。
  • R-Tree 索引:R-Tree 在 MySQL 很少使用,仅支持 geometry 数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种,相对于 B-Tree 来说,R-Tree 的优势在于范围查找。

索引可以在创建表的时候进行创建,也可以单独创建,下面我们采用单独创建的方式,我们在 cxuan004 上创建前缀索引

MySQL の進歩をガイドする 47 枚の図

我们使用 explain 进行分析,可以看到 cxuan004 使用索引的情况

MySQL の進歩をガイドする 47 枚の図

如果不想使用索引,可以删除索引,索引的删除语法是

MySQL の進歩をガイドする 47 枚の図

索引设计原则

创建索引的时候,要尽量考虑以下原则,便于提升索引的使用效率。

  • 选择索引位置,选择索引最合适的位置是出现在 where 语句中的列,而不是 select 关键字后的选择列表中的列。
  • 选择使用唯一索引,顾名思义,唯一索引的值是唯一的,可以更快速的确定某条记录,例如学生的学号就适合使用唯一性索引,而学生的性别则不适合使用,因为不管搜索哪个值,都差不多有一半的行。
  • 为经常使用的字段建立索引,如果某个字段经常用作查询条件,那么这个字段的查询速度在极大程度上影响整个表的查询速度,因此为这样的字段建立索引,可以提高整个表的查询速度。
  • 不要过度索引,限制索引数目,索引的数目不是越多越好,每个索引都会占据磁盘空间,索引越多,需要的磁盘空间就越大。
  • 尽量使用前缀索引,如果索引的值很长,那么查询速度会受到影响,这个时候应该使用前缀索引,对列的某几个字符进行索引,可以提高检索效率。
  • 利用最左前缀,在创建一个 n 列的索引时,实际上是创建了 MySQL 可利用的 n 个索引。多列索引可以起到几个索引的作用,利用索引最左边的列来匹配行,这样的列称为最左前缀。
  • 对于使用 InnoDB 存储引擎的表来说,记录会按照一定的顺序保存。如果有明确的主键定义,那么会按照主键的顺序进行保存;如果没有主键,但是有唯一索引,那么就按照唯一索引的顺序进行保存。如果既没有主键又没有唯一索引,那么表中会自动生成一个内部列,按照这个列的顺序进行保存。一般来说,使用主键的顺序是最快的
  • 删除不再使用或者很少使用的索引

视图

MySQL 从 5.0 开始就提供了视图功能,下面我们对视图功能进行介绍。

什么是视图

视图的英文名称是 view,它是一种虚拟存在的表。视图对于用户来说是透明的,它并不在数据库中实际存在,视图是使用数据库行和列动态组成的表,那么视图相对于数据库表来说,优势体现在哪里?

视图相对于普通的表来说,优势包含下面这几项

  • 使用视图可以简化操作:使用视图我们不用关注表结构的定义,我们可以把经常使用的数据集合定义成视图,这样能够简化操作。
  • 安全性:用户对视图不可以随意的更改和删除,可以保证数据的安全性。
  • 数据独立性:一旦视图的结构 确定了, 可以屏蔽表结构变化对用户的影响, 数据库表增加列对视图没有影响;具有一定的独立性

对视图的操作

视图的操作包括创建或者修改视图、删除视图以及查看视图定义。

创建或修改视图

使用 create view 来创建视图

为了演示功能,我们先创建一张表 product 表,有三个字段,id,name,price,下面是建表语句

create table product(id int(11),name varchar(20),price float(10,2));复制代码
ログイン後にコピー

然后我们向其中插入几条数据

insert into product values(1, "apple","3.5"),(2,"banana","4.2"),(3,"melon","1.2");复制代码
ログイン後にコピー

插入完成后的表结构如下

MySQL の進歩をガイドする 47 枚の図

然后我们创建视图

create view v1 as select * from product;复制代码
ログイン後にコピー

然后我们查看一下 v1 视图的结构

MySQL の進歩をガイドする 47 枚の図

可以看到我们把 product 中的数据放在了视图中,也相当于是创建了一个 product 的副本,只不过这个副本跟表无关。

视图使用

show tables;复制代码
ログイン後にコピー

也能看到所有的视图。

删除视图的语法是

drop view v1;复制代码
ログイン後にコピー
MySQL の進歩をガイドする 47 枚の図

能够直接进行删除。

视图还有其他操作,比如查询操作

你还可以使用

describe v1;复制代码
ログイン後にコピー
MySQL の進歩をガイドする 47 枚の図

查看表结构

更新视图

update v1 set name = "grape" where id = 1;复制代码
ログイン後にコピー
MySQL の進歩をガイドする 47 枚の図

存储过程

MySQL 从 5.0 开始起就支持存储过程和函数了。

那么什么是存储过程呢?

存储过程是在数据库系统中完成一组特定功能的 SQL 语句集,它存储在数据库系统中,一次编译后永久有效。那么使用存储过程有什么优点呢?

  • 使用存储过程具有可封装性,能够隐藏复杂的 SQL 逻辑。
  • 存储过程可以接收参数,并返回结果
  • 存储过程性能非常高,一般用于批量执行语句

使用存储过程有什么缺点?

  • 存储过程编写复杂
  • 存储过程对数据库的依赖性比较强,可移植性比较差

存储过程使用

存储过程创建

在认识到存储过程是什么之后,我们就来使用一下存储过程,这里需要先了解一个小技巧,也就是 delimiter 的用法,delimiter 用于自定义结束符,什么意思呢,如果你使用

delimiter ?复制代码
ログイン後にコピー

的话,那么你在 sql 语句末使用 ; 是不能使 SQL 语句执行的,不信?我们可以看下

MySQL の進歩をガイドする 47 枚の図

可以看到,我们在 SQL 语句的行末使用了 ; 但是我们却没有看到执行结果。下面我们使用

delimiter ;复制代码
ログイン後にコピー

恢复默认的执行条件再来看下

MySQL の進歩をガイドする 47 枚の図

我们创建存储过程首先要把 ; 替换为 ?,下面是一个存储过程的创建语句

mysql> delimiter ?
mysql> create procedure sp_product()
    -> begin
    -> select * from product;
    -> end ?复制代码
ログイン後にコピー
MySQL の進歩をガイドする 47 枚の図

存储过程实际上是一种函数,所以创建完毕后,我们可以使用 call 方法来调用这个存储过程

MySQL の進歩をガイドする 47 枚の図

因为我们上面定义了使用 delimiter ? 来结尾,所以这里也应该使用。

存储过程也可以接受参数,比如我们定义一种接收参数的情况

MySQL の進歩をガイドする 47 枚の図

然后我们使用 call 调用这个存储过程

MySQL の進歩をガイドする 47 枚の図

可以看到,当我们调用 id = 2 的时候,存储过程的 SQL 语句相当于是

select * from product where id = 2;复制代码
ログイン後にコピー

所以只查询出 id = 2 的结果。

存储过程删除

一次只能删除一个存储过程,删除存储过程的语法如下

drop procedure sp_product ;复制代码
ログイン後にコピー

直接使用 sp_product 就可以了,不用加 ()

存储过程查看

存储过程创建后,用户可能需要需要查看存储过程的状态等信息,便于了解存储过程的基本情况

我们可以使用

show create procedure proc_name;复制代码
ログイン後にコピー

变量的使用

在 MySQL 中,变量可分为两大类,即系统变量用户变量,这是一种粗略的分法。但是根据实际应用又被细化为四种类型,即局部变量、用户变量、会话变量和全局变量。

用户变量

用户变量是基于会话变量实现的,可以暂存,用户变量与连接有关,也就是说一个客户端定义的变量不能被其他客户端使用看到。当客户端退出时,链接会自动释放。我们可以使用 set 语句设置一个变量

set @myId = "cxuan";复制代码
ログイン後にコピー

然后使用 select 查询条件可以查询出我们刚刚设置的用户变量

MySQL の進歩をガイドする 47 枚の図

用户变量是和客户端有关系,当我们退出后,这个变量会自动消失,现在我们退出客户端

exit复制代码
ログイン後にコピー

现在我们重新登陆客户端,再次使用 select 条件查询

MySQL の進歩をガイドする 47 枚の図

发现已经没有这个 @myId 了。

局部变量

MySQL 中的局部变量与 Java 很类似 ,Java 中的局部变量是 Java 所在的方法或者代码块,而 MySQL 中的局部变量作用域是所在的存储过程。MySQL 局部变量使用 declare 来声明。

会话变量

服务器会为每个连接的客户端维护一个会话变量。可以使用

show session variables;复制代码
ログイン後にコピー

显示所有的会话变量。

我们可以手动设置会话变量

set session auto_increment_increment=1;

或者使用

set @@session.auto_increment_increment=2;复制代码
ログイン後にコピー

然后进行查询,查询会话变量使用

MySQL の進歩をガイドする 47 枚の図

或者使用

MySQL の進歩をガイドする 47 枚の図

全局变量

当服务启动时,它将所有全局变量初始化为默认值。其作用域为 server 的整个生命周期。

可以使用

show global variables;复制代码
ログイン後にコピー

查看全局变量

可以使用下面这两种方式设置全局变量

set global sql_warnings=ON;        -- global不能省略

/** 或者 **/

set @@global.sql_warnings=OFF;复制代码
ログイン後にコピー

查询全局变量时,可以使用

MySQL の進歩をガイドする 47 枚の図

或者是

MySQL の進歩をガイドする 47 枚の図

MySQL 流程语句介绍

MySQL 支持下面这些控制语句

  • IF

IF 用于实现逻辑判断,满足不同条件执行不同的 SQL 语句

IF ... THEN ...复制代码
ログイン後にコピー
  • CASE

CASE 实现比 IF 稍微复杂,语法如下

CASE ...
	WHEN ... THEN...
	...
END CASE复制代码
ログイン後にコピー

CASE 语句也可以使用 IF 来完成

  • LOOP

LOOP 用于实现简单的循环

label:LOOP
     ...
END LOOP label;复制代码
ログイン後にコピー

如果 ... 中不写 SQL 语句的话,那么就是一个简单的死循环语句

  • LEAVE

用来表示从标注的流程构造中退出,通常和 BEGIN...END 或者循环一起使用

  • ITERATE

ITERATE 语句必须用在循环中,作用是跳过当前循环的剩下的语句,直接进入下一轮循环。

  • REPEAT

带有条件的循环控制语句,当满足条件的时候退出循环。

REPEAT
   ...
   UNTIL
END REPEAT;复制代码
ログイン後にコピー
  • WHILE

WHILE 语句表示的含义和 REPEAT 相差无几,WHILE 循环和 REPEAT 循环的区别在于:WHILE 是满足条件才执行循环,REPEAT 是满足条件退出循环;

触发器

MySQL 从 5.0 开始支持触发器,触发器一般作用在表上,在满足定义条件时触发,并执行触发器中定义的语句集合,下面我们就来一起认识一下触发器。

举个例子来认识一下触发器:比如你有一个日志表和金额表,你每录入一笔金额就要进行日志表的记录,你会怎么样?同时在金额表和日志表插入数据吗?如果有了触发器,你可以直接在金额表录入数据,日志表会自动插入一条日志记录,当然,触发器不仅只有新增操作,还有更新和删除操作。

创建触发器

我们可以用如下的方式创建触发器

create trigger triggername triggertime triggerevent on tbname for each row triggerstmt复制代码
ログイン後にコピー

上面涉及到几个参数,我知道你有点懵逼,解释一下。

  • triggername:这个指的就是触发器的名字
  • triggertime:这个指的就是触发器触发时机,是 BEFORE 还是 AFTER
  • triggerevent: 这个指的就是触发器触发事件,一共有三种事件:INSERT、UPDATE 或者 DELETE
  • tbname:这个参数指的是触发器创建的表名,在哪个表上创建
  • triggerstmt: 触发器的程序体,也就是 SQL 语句

所以,可以创建六种触发器

BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE、BEFORE DELETE、AFTER DELETE

上面的 for each now 表示任何一条记录上的操作都会触发触发器。

下面我们通过一个例子来演示一下触发器的操作

我们还是用上面的 procuct 表做例子,我们创建一个 product_info 产品信息表。

create table product_info(p_info varchar(20)); 
复制代码
ログイン後にコピー

然后我们创建一个 trigger

MySQL の進歩をガイドする 47 枚の図

我们在 product 表中插入一条数据

insert into product values(4,"pineapple",15.3);复制代码
ログイン後にコピー

我们进行 select 查询,可以看到现在 product 表中有四条数据

MySQL の進歩をガイドする 47 枚の図

我们没有向 product_info 表中插入数据,现在我们来看一下 product_info 表中,我们预想到是有数据的,具体来看下

MySQL の進歩をガイドする 47 枚の図

这条数据是什么时候插入的呢?我们在创建触发器 tg_pinfo 的时候插入了的这条数据。

删除触发器

触发器可以使用 drop 进行删除,具体删除语法如下

drop trigger tg_pinfo;复制代码
ログイン後にコピー

和删除表的语法是一样的

查看触发器

我们经常会查看触发器,可以通过执行 show triggers 命令查看触发器的状态、语法等信息。

另一种查询方式是查询表中的 information_schema.triggers 表,这个可以查询指定触发器的指定信息,操作起来方便很多

触发器的作用

  • 在添加一条数据前,检查数据是否合理,例如检查邮件格式是否正确
  • 删除数据后,相当于数据备份的作用
  • 可以记录数据库的操作日志,也可以作为表的执行轨迹

注意:触发器的使用有两个限制

  1. 触发程序不能调用将数据返回客户端的存储程序。也不能使用 CALL 语句的动态 SQL 语句。
  2. 不能在触发器中开始和结束语句,例如 START TRANSACTION
MySQL の進歩をガイドする 47 枚の図

更多相关免费学习推荐:mysql教程(视频)

以上がMySQL の進歩をガイドする 47 枚の図の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.im
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート