一、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(一)表类型(存储引擎)的更多相关文章

  1. mysql修改表的存储引擎(myisam<=>innodb)【转】

    修改表的存储引擎myisam<=>innodb 查看表的存储引擎mysql> show create table tt7;+-------+--------------------- ...

  2. Mysql表类型(存储引擎)的比较

    面试官问:你知道mysql有哪些存储引擎,区别是啥? 我:一脸闷逼,于是乎下来补一补,以作备查 1.和大多数数据库不同,MySQL 中有一个存储引擎的概念,针对不同的存储需求可以选择最优的存储引擎. ...

  3. mysql 数据表操作 存储引擎介绍

    一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...

  4. mysql修改表的存储引擎(myisam<=>innodb)

    查看当前数据库的所支持的数据库引擎以及默认数据库引擎 mysql> show engines; +--------------------+---------+----------------- ...

  5. MySQL改变表的存储引擎

    MySQL提供了多种数据库存储引擎,存储引擎负责MySQL数据库中的数据的存储和提取.不同的存储引擎具有不同的特性,有时可能须要将一个已经存在的表的存储引擎转换成另外的一个存储引擎.有非常多方法能够完 ...

  6. MySQL更改表的存储引擎

    MySQL它提供了多种数据库存储引擎,存储引擎负责MySQL存储和检索数据的数据库.不同的存储引擎具有不同的特性,能须要将一个已经存在的表的存储引擎转换成另外的一个存储引擎.有非常多方法能够完毕这样的 ...

  7. mysql转换表的存储引擎方法

    如果转换表的存储引擎,将会丢失原存储引擎的所有特性. 例如:如果将innodb转换成myisam,再转回innodb,原innodb表的的外键将丢失. 假设默认存储引擎是MyISAM转为InnoDB ...

  8. MySQL开发篇(4)表类型(存储引擎)的选择

    一.查看支持的存储引擎以及设置修改存储引擎 1.查看默认存储引擎:show variables like '%storage_engine%'; 2.查看当前数据库支持的存储引擎:show ENGIN ...

  9. mysql 库操作、存储引擎、表操作

    阅读目录 库操作 存储引擎 什么是存储引擎 mysql支持的存储引擎 如何使用存储引擎 表操作 创建表 查看表结构 修改表ALTER TABLE 复制表 删除表 数据类型 表完整性约束 回到顶部 一. ...

  10. MySQL更改数据库表的存储引擎

    MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...

随机推荐

  1. 关于HashSet

    HashSet存储数据原理: 当HashSet调用add方法时,有返回值,返回值是boolean类型,表示是否添加成功(如果对象不存在,则添加成功,否则添加失败) 但是,添加的过程并不是一个个去遍历去 ...

  2. 解决使用Navicat等工具进行连接登录mysql的1130错误,无法使用Ip远程连接的问题(mysql为8.0版本)

    错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL serve 错误1130:主机192.168.1.3& ...

  3. PHPExcel-Helper快速构建Excel

    项目介绍 PHPExcel-Helper是什么? PHPExcel辅助开发类,帮助开发者快速创建各类excel. github PHPExcel-Helper存在的意义? 官方phpexcel库功能全 ...

  4. wdCP V3.2

    wdCP是什么?关于wdCP更多的介绍,可看http://www.wdlinux.cn/wdcp/安装前先去体验下,看演示站吧http://www.wdlinux.cn/bbs/thread-5285 ...

  5. 风炫安全WEB安全学习第二十二节课 DOM型XSS讲解

    风炫安全WEB安全学习第二十二节课 DOM型XSS讲解 Dom型XSS演示 通过Javascript,可以重构整个HTML文档,你可以添加.移除.改变或重排页面上的项目 要改变页面的某个东西,Java ...

  6. PHP将数据集转换成树状结构

    /** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * @param string $l ...

  7. Centos镜像国内最全下载地址

    CentOS 官方下载地址:https://www.centos.org/download/Centos国内下载源http://man.linuxde.net/download/CentOShttp: ...

  8. MVC和MVVM的差别

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...

  9. 剑指Offer58-左转字符串

    题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=" ...

  10. (二)数据源处理1-configparser读取.ini配置文件

    import osimport configparsercurrent_path =os.path.dirname(__file__)#获取config当前文件路径config_file_path = ...