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文件,文件名是”表名+分区名“,可以在创建分区的时候指定每个分区的数据文件的位置,以此来将表均匀分布在多个磁盘上。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,332评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,930评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,204评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,348评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,356评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,447评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,862评论 3 394
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,516评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,710评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,518评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,582评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,295评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,848评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,881评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,121评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,737评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,280评论 2 341

推荐阅读更多精彩内容