MySql(一)表类型(存储引擎)
MySql(一)表类型(存储引擎)
一、MYSQL存储引擎概述
MYSQL支持的存储引擎包括:MyISAM、InnoDB、BDB、MERGE、EXAMPLE、NDB Cluster、CSV等。
其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。
查看当前的默认存储引擎:
mysql> show variables like 'table_type';
查询当前数据库支持的存储引擎:
mysql> show varuables like 'hava%';
在创建新表的时候,可以通过增加ENGINE关键字设置新建表的存储引擎,例如:
create table ai (
i bigint(20) not null AUTO_INCREMENT,
PRIMART kEY(i)
)ENGINE=MyISAM DEAFULT CHARSET=gbk;
create table country(
country_id smallint unsigned not null auto_increment,
country varchar(50) not null,
last_update timestamp not null default current_timestamp on update current_timestamp,
primary key (country id)
)engine=InnoDB deafult charset=gbk;
也可以使用Alter table,将一个已经存在的表修改成其他的存储引擎,例如:
mysql> alter table ai engine = innodb;
二、存储引擎的特性对比
| 特点 | MyISAM | InnoDB |
|---|---|---|
| 存储限制 | 有 | 64TB |
| 事务安全 | 支持 | |
| 锁机制 | 表锁 | 行锁 |
| B树索引 | 支持 | 支持 |
| 哈希索引 | ||
| 全文索引 | 支持 | |
| 集群索引 | 支持 | |
| 数据缓存 | 支持 | |
| 索引缓存 | 支持 | 支持 |
| 数据可压缩 | 支持 | |
| 空间使用 | 低 | 高 |
| 内存使用 | 低 | 高 |
| 批量插入的速度 | 高 | 低 |
| 支持外键 | 支持 |
2.1 MyISAM
MyISAM不支持事务,也不支持外键,优势是访问速度快,对事务完整性没有要求或者以select、insert为主的应用基本都可以使用这个引擎来建表。
每个MyISAM在磁盘上存储成3个文件,其文件名和表明相同,扩展名分别是:
- .frm(存储表定义);
- .MYD(MYData,存储数据);
- .MYI(MYIndex,存储索引);
数据文件和索引文件可放在不同的目录,平均分布IO,获得更快的速度。
2.2 InnoDB
InnoDB存储引擎提供了具有体积、回滚和崩溃恢复能力的事务安全,但对比MyISAM的存储引擎,其写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
2.2.1 自动增长列
InnoDB表的字段增长列可以手工插入,若插入的值是空或者0,则实际插入的是自动增长后的值。
mysql> create table autoincre_demo
->(i smallint not null auto_increment,
name varchar(10),primary key(i)
)engine=innodb;
mysql> insert into autoincre_dem values(1,'1'),(0,'2').(null,'3');
mysql> select * from autoincre_demo;
| i | name |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列。
2.2.2 外键约束
MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须由对应的索引,子表在创建外键的时候也会自动创建对应的索引。
例如:country表是父表,country_id为主键索引,city表是子表,country_id字段是外键,对应于country表的主键country_id。
create table country(
country_id smallint unsigned not null auto_increment,
country varchar(50) not null,
last_update timestamp not null default current_timestamp on update current_timestamp,
primary key (country_id)
)engine=InnoDB default charset=utf8;
create table city(
city_id smallint unsigned not null auto_increment,
city varchar(50) not null,
country_id smallint unsigned not null,
last_update timestamp not null default current_timestamp on update current_timestamp,
primary key (city_id),
key idx_fx_country_id(country_id),
constraint 'fk_city_country' foreign key (country_id) regerences country (country_id) on delete restrict on update cascade
)engine=InnoDB default charset=utf8;
在创建索引时,可以指定在删除、更新父表时,对子表进行的相应操作,包括Restrict、cascade、set null和No action。
其中Restrict和no_action相同,是指限制在子表有关联记录的情况下父表不能更新;
CASCADE表示父表在更新或删除时,更新或者删除子表对应记录;
SET NULL则表示父级在更新或删除的时候,子表的对应字段被SET NULL。
例如,对于上面创建的两个表,子表的外键指定的是ON DELETE RESTRICT ON UPDATE CASCADE方式的,那么是在主表删除记录的时候,如果子表有对应记录,则不允许删除,主表在更新记录的时候,如果子表有对应记录,则子表对应更新;
当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。
在导入多个表的数据时,如果需要忽略表之前的导入顺序,可以暂时关闭外键的检查;同样,在执行LOAD DATA和ALTER TABLE操作的时候,可以通过暂时关闭外键约束来加快处理的速度,关闭的命令是
set foreign_key_checks=0;
执行完成后,通过执行:
set foreign_key_checks=1;
改回原来的状态。
对于InnoDB类型的表,外键的信息通过使用show create table或者show table status命令来显示。
mysql> show table status like 'city' \G
2.2.3 存储方式
InnoDB存储表和索引有以下两种方式:
- 使用共享表空间存储,这种方式创建的表的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件。
- 使用多表空间存储,这种方式创建的表的表结构仍然保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。若果是个分区表,则每个分区对应单独的.ibd文件,文件名是“表名+分区名”,可以在创建分区的时候制定每个分区的数据文件的位置,以此来将表的IO均匀分布在多个磁盘上。
三、如何选择合适的存储引擎
- MyISAM:若应用以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,则选择此存储引擎。MyISAM是在Web、数据仓储和其他应用环境下常用的存储引擎之一。
- InnODB:用于事务处理应用程序,支持外键。若应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么InnoDB存储引擎应该是比较合适的选择。对于计费系统或者财务系统等数据准确性比较高的系统,推荐使用。
MySql(一)表类型(存储引擎)的更多相关文章
- mysql修改表的存储引擎(myisam<=>innodb)【转】
修改表的存储引擎myisam<=>innodb 查看表的存储引擎mysql> show create table tt7;+-------+--------------------- ...
- Mysql表类型(存储引擎)的比较
面试官问:你知道mysql有哪些存储引擎,区别是啥? 我:一脸闷逼,于是乎下来补一补,以作备查 1.和大多数数据库不同,MySQL 中有一个存储引擎的概念,针对不同的存储需求可以选择最优的存储引擎. ...
- mysql 数据表操作 存储引擎介绍
一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...
- mysql修改表的存储引擎(myisam<=>innodb)
查看当前数据库的所支持的数据库引擎以及默认数据库引擎 mysql> show engines; +--------------------+---------+----------------- ...
- MySQL改变表的存储引擎
MySQL提供了多种数据库存储引擎,存储引擎负责MySQL数据库中的数据的存储和提取.不同的存储引擎具有不同的特性,有时可能须要将一个已经存在的表的存储引擎转换成另外的一个存储引擎.有非常多方法能够完 ...
- MySQL更改表的存储引擎
MySQL它提供了多种数据库存储引擎,存储引擎负责MySQL存储和检索数据的数据库.不同的存储引擎具有不同的特性,能须要将一个已经存在的表的存储引擎转换成另外的一个存储引擎.有非常多方法能够完毕这样的 ...
- mysql转换表的存储引擎方法
如果转换表的存储引擎,将会丢失原存储引擎的所有特性. 例如:如果将innodb转换成myisam,再转回innodb,原innodb表的的外键将丢失. 假设默认存储引擎是MyISAM转为InnoDB ...
- MySQL开发篇(4)表类型(存储引擎)的选择
一.查看支持的存储引擎以及设置修改存储引擎 1.查看默认存储引擎:show variables like '%storage_engine%'; 2.查看当前数据库支持的存储引擎:show ENGIN ...
- mysql 库操作、存储引擎、表操作
阅读目录 库操作 存储引擎 什么是存储引擎 mysql支持的存储引擎 如何使用存储引擎 表操作 创建表 查看表结构 修改表ALTER TABLE 复制表 删除表 数据类型 表完整性约束 回到顶部 一. ...
- MySQL更改数据库表的存储引擎
MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...
随机推荐
- JQuery特点:
轻量级 强大的选择器 出色的DOM封装 可靠的事件处理机制 完善的Ajax 出色的浏览器兼容性 丰富的插件支持 完善的文档 支持链式操作
- python安装库报错的处理方法
在安装python map库时遇到了还多问题,找了好的方法都没有安装成功,最后改安装basemap库参考了了:https://www.jb51.net/article/147780.htm一文操作,最 ...
- 【ASP.NET Core】Blazor 服务器端的 Base Path
提到 Blazor,没准就会有人问:选用 Server 端还是 WebAssembly(客户端)?其实这个不用纠结,老周个人的原则是:Server 端优先.理由很单纯:服务器端虽然消耗服务器上的资源, ...
- 巧用 Lazy 解决.NET Core中的循环依赖关系
原文作者: Thomas Levesque 原文链接:https://thomaslevesque.com/2020/03/18/lazily-resolving-services-to-fix-ci ...
- Linux服务器下安装Composer 并使用Composer安装Thinkphp5.0
Composer官方文档:https://docs.phpcomposer.com/00-intro.htmlComposer是一个php的包管理器.要求php版本在5.3以上. 一.安装Compos ...
- fastjson反序列化漏洞原理及利用
重要漏洞利用poc及版本 我是从github上的参考中直接copy的exp,这个类就是要注入的类 import java.lang.Runtime; import java.lang.Process; ...
- oracle坚决不挂2(SQLPLUS基础命令)
继续复习!!SQLplus基础命令,其实这个应该是第一个要复习的.因为基础,你懂得..要想学会跑,你先得知道该怎么走吧. win+R 输入cmd ,我们开始启动SQLplus sqlplus user ...
- 十二:SQL注入之简要注入
SQL注入漏洞将是重点漏洞,分为数据库类型,提交方法,数据类型等方式.此类漏洞是WEB漏洞中的核心漏洞,学习如何的利用,挖掘,和修复是重要的. SQL注入的危害 SQL注入的原理 可控变量,带入数据库 ...
- pandas数据分析API常用操作
1.导入数据 df = pd.read_csv( # 该参数为数据在电脑中的路径,可以不填写 filepath_or_buffer='/Users/Weidu/Desktop/sz000002.csv ...
- Python3.9的http.client.py下的HTTPMessage类中的方法getallmatchingheaders的bug修复建议
在官方网站已经提交相关issue,不过目前看好像还没有修复.具体的bug位置为: http文件夹下的client.py文件,代码位置为:类HTTPMessage下的方法getallmatchinghe ...