|- mysql -| MySQL中数据存储引擎MyISAM和InnoDB

今天撸数据库代码时,刚开始使用那会并没有注意到自己使用数据库时的存储类型(我的MySQL默认是使用类型是MyISAM ),所以当我在设置外键的级联更新的时候,突然发现数据并不能进行级联更新操作,刚开始还以为是自己语句的书写出问题的,回去检查了一边,发现确实是没有问题的。那么奇怪的是为什么我的数据操作会不成功呢?检查了好久,都发现所有语句都是没问题的(话说,有问题的话,貌似也执行不了~.~),后来才发现在创建表时,默认的存储类型是MyISAM,百度了一下MyISAM相关的内容,才知道原来是MyISAM类型不支持事务处理等一些高级处理,而InnoDB类型则是支持的。 MyISAM类型的表比较强调性能方面,其执行数度也就比InnoDB类型更快,但是遗憾的是不提供事务支持,而InnoDB类型的表是提供事务支持事务,外部键等高级数据库功能的,也就是说MyISAM类型的表是不支持外键操作的!好吧,终于查出了原因所在~


如果你想查询表的存储引擎类型,可以这样:

show create table tableName; 

举个栗子:

然后直接执行下面的语句就能将其修改成InnoDB类型的了

alter table tableName type=innodb;

这里写图片描述

如果你不想每次建表都去修改表的储存引擎,那么你可以直接创建指定存储引擎的表,比如:

CREATE TABLE tableName (
...
...
...
) ENGINE=INNODB DEFAULT CHARSET=utf8;

如果呢,你比较经常用到InnoDB表的话,你还可以将Mysql 默认引擎设为 InnoDB步骤如下:

Mysql默认是关闭InnoDB存储引擎的使用的,将InnoDB设置为默认的引擎如下。

  1. 查看Mysql存储引擎情况,执行命令语句: show engines;
    这里写图片描述
    看到 InnoDB | YES,说明此Mysql数据库服务器支持InnoDB引擎。

  2. 设置InnoDB为默认引擎:
    在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
    这里写图片描述

  3. 重启Mysql服务器

  4. 登录Mysql数据库,再次执行命令:show engines;
    这里写图片描述
    如果出现 InnoDB |DEFAULT,那么恭喜你~跟我一样成功啦~此时已经将InnoDB设置为默认引擎了。

这样子的的话,你创建出来的表的存储引擎类型就是InnoDB类型的啦~


好了,那么接下来我们就稍稍来讨论他们两者的区别吧

总的来说,InnoDB和MyISAM应该是MySQL中最常用到的两个表类型了,两种表类型各有其适用情况,并不能说哪种类型更好,这得视具体应用而定~

MyISAM:

  • MySQL默认采用的是MyISAM。与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具,
    MyISAM表格可以被压缩,而且它们支持全文搜索。但它们不是事务安全的,而且也不支持外键
  • 如果你的数据执行大量的SELECT语句的,MyISAM是更好的选择。

InnoDB:

  • 这种类型是事务安全的。它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.
  • 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。

就我目前所知,来做一下小结:

  • InnoDB支持外键,MyISAM不支持。
  • InnoDB的主键范围更大,最大是MyISAM的2倍。
  • 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  • InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
  • InnoDB 中不保存表的具体行数,也就是说,执行select count( * ) from tableName时,InnoDB必须扫描全表计算有多少行,但是MyISAM只要简单的读出保存好的行数即可(因为MyISAM内置了一个计数器,count( * )时它直接从计数器中读)。但是值得注意的是,当count( * ) 语句包含 where条件时,两种表的操作是一样的。
  • InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如:update table set id=1 where name like“%a%”
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值