真实存取数据的功能为存储引擎的功能。因此在MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取数据后返回客户端即可。
功能:接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
- 查看存储引擎
show engines;或者show engines \G;
1、设置表的存储引擎
c
CREATE TABLE 表名{
建表语句;
}ENGINE=存储引擎名称;
eg:create table emp(id int) engine=innodb; # 创建表的时候指定其存储引擎
修改表的存储引擎:ALTER TABLE 表名 ENGINE =存储引擎名称;eg:alter table emp4 engine=myisam; # 修改数据表的存储引擎
2、存储引擎的特点
2.1、 InnoDB 引擎的特点(具备外键支持功能的事务存储引擎)
InnoDB是MySQL的 默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback);InnoDB支持外键;InnoDB是 为处理巨大数据量的最大性能设计 。
MySQL InnoDB 外键 :只有 InnoDB 支持外键;外键列、被引用列数据类型必须完全一致;被引用列必须是主键 / 唯一索引;外键列建议建索引。
1.父表(主表,被别人引用)
c
`CREATE TABLE 父表名 (
父主键列 INT NOT NULL AUTO_INCREMENT,
-- 其他字段
PRIMARY KEY (父主键列)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`
2.子表(从表,持有外键)
c
CREATE TABLE 子表名 (
子表主键 INT NOT NULL AUTO_INCREMENT,
外键列 INT NOT NULL, -- 和父主键类型一模一样
-- 其他业务字段
PRIMARY KEY(子表主键),
-- 【必写】给外键建立索引,InnoDB推荐,避免性能问题
KEY idx_子表_外键列 (外键列),
-- ========== 外键核心语句 ==========
CONSTRAINT 外键约束名
FOREIGN KEY (外键列)
REFERENCES 父表名(父主键列)
ON DELETE 行为
ON UPDATE 行为
-- =================================
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
eg
c
-- 1. 父表:部门表 department(主表,被引用)
DROP TABLE IF EXISTS employee;
DROP TABLE IF EXISTS department;
CREATE TABLE department (
dept_id INT NOT NULL AUTO_INCREMENT COMMENT '部门主键',
dept_name VARCHAR(50) NOT NULL COMMENT '部门名称',
PRIMARY KEY (dept_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门父表';
-- 2. 子表:员工表 employee,外键关联部门
CREATE TABLE employee (
emp_id INT NOT NULL AUTO_INCREMENT COMMENT '员工主键',
emp_name VARCHAR(30) NOT NULL COMMENT '员工姓名',
dept_id INT NOT NULL COMMENT '外键,所属部门id',
PRIMARY KEY (emp_id),
-- 外键字段建立索引
KEY idx_emp_deptid (dept_id),
-- 外键核心约束
CONSTRAINT fk_emp_dept
FOREIGN KEY (dept_id) REFERENCES department(dept_id)
ON DELETE RESTRICT -- 子表有员工,则禁止删除部门
ON UPDATE CASCADE -- 修改部门主键dept_id,员工表dept_id自动同步更新
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工子表';
2.2、MyISAM 引擎(主要的非事务处理存储引擎)
- MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM 不支持事务、行级锁、外键 ,有一个毫无疑问的缺陷就是崩溃后无法安全恢复 。 优点是访问的速度快。
3、 InnoDB和MyISAM的对比
- MYISAM不支持外键和事务,但INNOB支持。
- MYISAM表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作,但INNOB行锁,操作时只锁某一行,不对其它行有影响, 适合高并发的操作。
- MYISAM只缓存索引,不缓存真实数据,但INNOB不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。