今天撸数据库代码时,刚开始使用那会并没有注意到自己使用数据库时的存储类型(我的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设置为默认的引擎如下。
查看Mysql存储引擎情况,执行命令语句: show engines;
看到 InnoDB | YES,说明此Mysql数据库服务器支持InnoDB引擎。设置InnoDB为默认引擎:
在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
重启Mysql服务器
登录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%”