mysql 5.0支持的存储引擎包括:InnoDB、MEMORY、MERGE、BDB、MyISAM、CSV、NDB Cluster、ARCHIVE、BLACKHOLE、FEDERATED
查看当前默认存储引擎
mysql>SHOW VARIABLES LIKE 'table_type'; //5.0
mysql> SHOW VARIABLES LIKE 'default_storage_engine'; //5.7以上的话,用这个查看
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
查看当前数据库支持的存储引擎
mysql> SHOW ENGINES \G;
InnoDB 与 MyISAM存储引擎的对比
特点 | MyISAM | InnoDB |
---|---|---|
存储限制 | 有 | 64TB |
事务安全 | 支持 | |
锁机制 | 表锁 | 行锁 |
B树索引 | 支持 | 支持 |
哈希索引 | ||
全文索引 | 支持 | |
集群索引 | 支持 | |
数据缓存 | 支持 | |
索引缓存 | 支持 | 支持 |
数据可压缩 | 支持 | |
空间使用 | 低 | 高 |
内存使用 | 低 | 高 |
批量插入速度 | 高 | 低 |
支持外键 | 支持 |
MyISAM
MyISAM不支持事务、也不支持外键,其优势是访问速度快,对事务完整性没有要求或者SELECT、INSERT为主的应用基本上都可以使用这个已经来创建表。
每个MyISAM表在磁盘上存储成3个文件,其文件名都和表名相同,但扩展名分别是:
- .frm(存储表定义)
- .MYD(MYData,存储数据)
- .MYI(MYIndex,存储索引)
InnoDB
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间已保留数据和索引。
InnoDB存储引擎的特点:######
自动增长列
InnoDB表的自动增长列可以手工插入,但是插入的值如果是0或者是NULL,则实际插入的将是自动增长后的值。
可以通过ALTER TABLE table_name AUTO_INCREMENT = n;语句强制设置自动增长列的初值,默认从1开始,但是该强制的默认值是保留在内存中的,如果该值在使用之前数据库重新启动过,那么这个强制的默认值就会丢失,就需要在数据库启动后重新设置。
可以使用SELECT LAST_INSERT_ID();查询当前线程最后插入记录使用的值。如果一次插入了多条记录,那么返回的是第一条记录使用的自动增长值。外键约束
MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,字表在创建外检的时候也会自动添加对应的索引
语法
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)
示例
CREATE TABLE country(
country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
country VARCHAR(9) 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_fk_country_id(country_id),
CONSTRAINT fk_city_country FOREIGN KEY(country_id) REFERENCES 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。选择后两种方式的时候需谨慎,可能会因为错误的操作导致数据的丢失。
简单的操作示例
mysql> insert into country values(null,'china',NOW());
mysql> insert into city values(null,'beijing',1,NOW());
//尝试删除 contry表的记录 --因为子表有对相应记录不允许删除
mysql> delete from country where country_id =1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`city`, CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE)
//更新country表记录的id
mysql> update country set country_id=1000 where country_id=1;
//查看子表情况 -----也已经被更新过了
mysql> select * from city;
+---------+---------+------------+---------------------+
| city_id | city | country_id | last_update |
+---------+---------+------------+---------------------+
| 1 | beijing | 1000 | 2017-03-17 10:05:44 |
+---------+---------+------------+---------------------+
在导入多个表的数据时,如果需要忽略表之前的导入顺序,可以暂时关闭外键约束的检查
//关闭命令
mysql> set foreign_key_checks=0;
//开启
mysql> set foreign_key_checks=1;
对于 InnoDB 类型的表,外键的信息通过使用 show create table 或者 show table status 命令都可以显示。
- 存储方式
InnoDB存储表和索引有一下两种方式
1.使用共享表空间存储,这种方式创建的表的表结构保存在.frm文件中,数据和索引存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以使多个文件。
2.使用多表空间,这种方式创建的表的表结构仍然保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。如果是分区表,则每个分区对应单独的.idb文件,文件名是”表名+分区名“,可以在创建分区的时候指定每个分区的数据文件的位置,以此来将表均匀分布在多个磁盘上。