MySQL チュートリアル コラムでは、高度な MySQL を理解するために 47 枚の図を紹介します。
MySQL 入門の章では、主に基本的な SQL コマンド、データ型、関数を紹介します。上記の知識があれば、MySQL を開発できます。資格のある開発者になりたい場合は、より高度なスキルも必要です。MySQL に必要な高度なスキルについて説明しましょう
データベースの核心はデータを保存することであり、データ ストレージではディスクの処理を避けることはできません。したがって、データをどのようにどのように保存するかがストレージの鍵となります。したがって、ストレージ エンジンはデータ ストレージのエンジンと同等であり、データをディスク レベルで保存します。
MySQL のアーキテクチャは 3 層モデルに従って理解できます
ストレージ エンジンも MySQL のコンポーネントですこれはソフトウェアの一種で、実行およびサポートできる主な機能は次のとおりです。
MySQL は、さまざまなデータベース アプリケーションに合わせて、デフォルトで複数のストレージ エンジンをサポートしています。ユーザーは、ニーズに応じて適切なストレージ エンジンを選択できます。以下は MySQL Storage Engine でサポートされています
作成者デフォルト、ストレージ エンジンを指定せずにテーブルが作成された場合、デフォルトのストレージ エンジンが使用されます。デフォルトのストレージ エンジンを変更したい場合は、パラメータ ファイルで default-table-type
を設定して、現在のストレージ エンジン
show variables like 'table_type';复制代码
奇妙なことに、なぜなくなってしまったのでしょうか?オンラインで確認したところ、このパラメーターは 5.5.3 でキャンセルされたことがわかりました。
次の 2 つの方法で、現在のデータベースでサポートされているストレージ エンジンをクエリできます。
show engines \g复制代码
新しいテーブルを作成するときに、ENGINE
キーワードを追加することで、新しいテーブルのストレージ エンジンを設定できます。
create table cxuan002(id int(10),name varchar(20)) engine = MyISAM;复制代码
上の図では、MyISAM
のストレージ エンジンを指定しました。
テーブルのストレージ エンジンがわからない場合はどうすればよいでしょうか? show create table
ストレージ エンジンが指定されていない場合、MySQL 5.1 バージョン以降では、MySQL で表示できます。デフォルトの組み込みストレージ エンジンはすでに InnoDB です。テーブルを作成して見てみましょう
上の図に示すように、デフォルトのストレージ エンジンは指定されていません。 table
ご覧のとおり、デフォルトのストレージ エンジンは InnoDB
です。
ストレージ エンジンを交換したい場合は、
alter table cxuan003 engine = myisam;复制代码
を使用して交換できます。交換が完了すると、0 行が影響を受けましたが表示されますが、操作が成功したという事実
show create tableを使用してテーブルのSQLをチェックすると、それがわかります
バージョン 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 データ ファイルは簡単に破損し、回復が困難になります。
MVCC (同時バージョン管理)
を通じて実装されます。 汚い読書
と再現不可能な読書
の問題を解決できます。
InnoDB は外部キー操作をサポートしています。
MyISAM と同様、InnoDB ストレージ エンジンにも
InnoDB には安全なログ ファイルがあり、このログ ファイルは、データベースのクラッシュやその他の状況によって発生したデータ損失を回復し、データの一貫性を確保するために使用されます。 です。 MEMORY タイプのテーブルは、データがメモリに保存されるため、非常に高速にアクセスされます。 HASH インデックス
がデフォルトで使用されます。 MERGE
ファイルで、もう 1 つは MERGE テーブルの構成を保存する .MRG
ファイルです。 、など。 適切なストレージ エンジンの選択
よく遭遇する問題は、テーブルを構築するときに適切なデータ型を選択する方法です。一般に、適切なデータ型を選択するとパフォーマンスが向上します。不要なトラブルを減らすために、適切なデータ型を選択する方法について説明します。
char と varchar は、文字列を格納するためによく使用される 2 つのデータ型です。char は通常、固定長の文字列を格納し、固定長です。次のような文字型です。次の
char(5) | ストレージ バイト | |
---|---|---|
' ' | 5 バイト | |
' cx ' | 5 バイト | |
'cxuan' | 5 バイト | |
'cxuan' | 5 バイト |
ここで注意してください: MySQL が非varchar 文字タイプが使用されている場合の例を見てみましょうstrict モード
を使用する場合、上記のテーブルの最後の行を保存できます。 MySQL が
strict モードを使用している場合、テーブルの最後の行を保存するときにエラーが報告されます。
varchar(5) | ストレージバイト | |
---|---|---|
'' | 1バイト | |
'cx ' | 3 バイト | |
' cxuan' | 6 バイト | |
'cxuan' | 6 バイト |
##ASCII | ||
---|---|---|
ISO-8859-1 | is | |
GBK | is | |
UTF-8 | No | |
UTF-16 | いいえ | |
UTF-32 | はい | |
对数据库来说,字符集是很重要的,因为数据库存储的数据大多数都是各种文字,字符集对数据库的存储、性能、系统的移植来说都非常重要。 MySQL 支持多种字符集,可以使用 或者使用 select character_set_name, default_collate_name, description, maxlen from information_schema.character_sets;复制代码 ログイン後にコピー 来查看。 使用 索引的设计和使用我们上面介绍到了索引的几种类型并对不同的索引类型做了阐述,阐明了优缺点等等,下面我们从设计角度来聊一下索引,关于索引,你必须要知道的一点就是:索引是数据库用来提高性能的最常用工具。 索引概述所有的 MySQL 类型都可以进行索引,对相关列使用索引是提高 前缀索引顾名思义就是对列字段的前缀做索引,前缀索引的长度和存储引擎有关系。MyISAM 前缀索引的长度支持到 1000 字节,InnoDB 前缀索引的长度支持到 767 字节,索引值重复性越低,查询效率也就越高。 在 MySQL 中,主要有下面这几种索引
索引可以在创建表的时候进行创建,也可以单独创建,下面我们采用单独创建的方式,我们在 cxuan004 上创建前缀索引 我们使用 如果不想使用索引,可以删除索引,索引的删除语法是 索引设计原则创建索引的时候,要尽量考虑以下原则,便于提升索引的使用效率。
视图MySQL 从 5.0 开始就提供了视图功能,下面我们对视图功能进行介绍。 什么是视图视图的英文名称是 视图相对于普通的表来说,优势包含下面这几项
对视图的操作视图的操作包括创建或者修改视图、删除视图以及查看视图定义。 创建或修改视图使用 为了演示功能,我们先创建一张表 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");复制代码 ログイン後にコピー 插入完成后的表结构如下 然后我们创建视图 create view v1 as select * from product;复制代码 ログイン後にコピー 然后我们查看一下 v1 视图的结构 可以看到我们把 product 中的数据放在了视图中,也相当于是创建了一个 product 的副本,只不过这个副本跟表无关。 视图使用 show tables;复制代码 ログイン後にコピー 也能看到所有的视图。 删除视图的语法是 drop view v1;复制代码 ログイン後にコピー 能够直接进行删除。 视图还有其他操作,比如查询操作 你还可以使用 describe v1;复制代码 ログイン後にコピー 查看表结构 更新视图 update v1 set name = "grape" where id = 1;复制代码 ログイン後にコピー 存储过程MySQL 从 5.0 开始起就支持存储过程和函数了。 那么什么是存储过程呢? 存储过程是在数据库系统中完成一组特定功能的 SQL 语句集,它存储在数据库系统中,一次编译后永久有效。那么使用存储过程有什么优点呢?
使用存储过程有什么缺点?
存储过程使用存储过程创建在认识到存储过程是什么之后,我们就来使用一下存储过程,这里需要先了解一个小技巧,也就是 delimiter ?复制代码 ログイン後にコピー 的话,那么你在 sql 语句末使用 可以看到,我们在 SQL 语句的行末使用了 delimiter ;复制代码 ログイン後にコピー 恢复默认的执行条件再来看下 我们创建存储过程首先要把 mysql> delimiter ? mysql> create procedure sp_product() -> begin -> select * from product; -> end ?复制代码 ログイン後にコピー 存储过程实际上是一种函数,所以创建完毕后,我们可以使用 因为我们上面定义了使用 delimiter ? 来结尾,所以这里也应该使用。 存储过程也可以接受参数,比如我们定义一种接收参数的情况 然后我们使用 可以看到,当我们调用 id = 2 的时候,存储过程的 SQL 语句相当于是 select * from product where id = 2;复制代码 ログイン後にコピー 所以只查询出 id = 2 的结果。 存储过程删除一次只能删除一个存储过程,删除存储过程的语法如下 drop procedure sp_product ;复制代码 ログイン後にコピー 直接使用 sp_product 就可以了,不用加 存储过程查看存储过程创建后,用户可能需要需要查看存储过程的状态等信息,便于了解存储过程的基本情况 我们可以使用 show create procedure proc_name;复制代码 ログイン後にコピー 变量的使用在 MySQL 中,变量可分为两大类,即 用户变量用户变量是基于 set @myId = "cxuan";复制代码 ログイン後にコピー 然后使用 用户变量是和客户端有关系,当我们退出后,这个变量会自动消失,现在我们退出客户端 exit复制代码 ログイン後にコピー 现在我们重新登陆客户端,再次使用 发现已经没有这个 局部变量MySQL 中的局部变量与 Java 很类似 ,Java 中的局部变量是 Java 所在的方法或者代码块,而 MySQL 中的局部变量作用域是所在的存储过程。MySQL 局部变量使用 会话变量服务器会为每个连接的客户端维护一个会话变量。可以使用 show session variables;复制代码 ログイン後にコピー 显示所有的会话变量。 我们可以手动设置会话变量 set session auto_increment_increment=1; 或者使用 set @@session.auto_increment_increment=2;复制代码 ログイン後にコピー 然后进行查询,查询会话变量使用 或者使用 全局变量当服务启动时,它将所有全局变量初始化为默认值。其作用域为 server 的整个生命周期。 可以使用 show global variables;复制代码 ログイン後にコピー 查看全局变量 可以使用下面这两种方式设置全局变量 set global sql_warnings=ON; -- global不能省略 /** 或者 **/ set @@global.sql_warnings=OFF;复制代码 ログイン後にコピー 查询全局变量时,可以使用 或者是 MySQL 流程语句介绍MySQL 支持下面这些控制语句
IF 用于实现逻辑判断,满足不同条件执行不同的 SQL 语句 IF ... THEN ...复制代码 ログイン後にコピー
CASE 实现比 IF 稍微复杂,语法如下 CASE ... WHEN ... THEN... ... END CASE复制代码 ログイン後にコピー CASE 语句也可以使用 IF 来完成
LOOP 用于实现简单的循环 label:LOOP ... END LOOP label;复制代码 ログイン後にコピー 如果
用来表示从标注的流程构造中退出,通常和 BEGIN...END 或者循环一起使用
ITERATE 语句必须用在循环中,作用是跳过当前循环的剩下的语句,直接进入下一轮循环。
带有条件的循环控制语句,当满足条件的时候退出循环。 REPEAT ... UNTIL END REPEAT;复制代码 ログイン後にコピー
WHILE 语句表示的含义和 REPEAT 相差无几,WHILE 循环和 REPEAT 循环的区别在于:WHILE 是满足条件才执行循环,REPEAT 是满足条件退出循环; 触发器MySQL 从 5.0 开始支持 举个例子来认识一下触发器:比如你有一个日志表和金额表,你每录入一笔金额就要进行日志表的记录,你会怎么样?同时在金额表和日志表插入数据吗?如果有了触发器,你可以直接在金额表录入数据,日志表会自动插入一条日志记录,当然,触发器不仅只有新增操作,还有更新和删除操作。 创建触发器我们可以用如下的方式创建触发器 create trigger triggername triggertime triggerevent on tbname for each row triggerstmt复制代码 ログイン後にコピー 上面涉及到几个参数,我知道你有点懵逼,解释一下。
所以,可以创建六种触发器 BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE、BEFORE DELETE、AFTER DELETE 上面的 下面我们通过一个例子来演示一下触发器的操作 我们还是用上面的 procuct 表做例子,我们创建一个 product_info 产品信息表。 create table product_info(p_info varchar(20)); 复制代码 ログイン後にコピー 然后我们创建一个 我们在 product 表中插入一条数据 insert into product values(4,"pineapple",15.3);复制代码 ログイン後にコピー 我们进行 select 查询,可以看到现在 product 表中有四条数据 我们没有向 product_info 表中插入数据,现在我们来看一下 product_info 表中,我们预想到是有数据的,具体来看下 这条数据是什么时候插入的呢?我们在创建触发器 删除触发器触发器可以使用 drop trigger tg_pinfo;复制代码 ログイン後にコピー 和删除表的语法是一样的 查看触发器我们经常会查看触发器,可以通过执行 另一种查询方式是查询表中的 触发器的作用
|
以上がMySQL の進歩をガイドする 47 枚の図の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。