mysql 存储引擎MyISAM和InnoDB(待完善)

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文件,文件名是”表名+分区名“,可以在创建分区的时候指定每个分区的数据文件的位置,以此来将表均匀分布在多个磁盘上。

你可能感兴趣的:(mysql 存储引擎MyISAM和InnoDB(待完善))