﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-seagar-文章分类-数据库</title><link>http://www.blogjava.net/seagar/category/35876.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 30 Sep 2009 03:10:08 GMT</lastBuildDate><pubDate>Wed, 30 Sep 2009 03:10:08 GMT</pubDate><ttl>60</ttl><item><title>[转]mysql中InnoDB和MyISAM的区别</title><link>http://www.blogjava.net/seagar/articles/239618.html</link><dc:creator>seagar</dc:creator><author>seagar</author><pubDate>Mon, 10 Nov 2008 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/seagar/articles/239618.html</guid><wfw:comment>http://www.blogjava.net/seagar/comments/239618.html</wfw:comment><comments>http://www.blogjava.net/seagar/articles/239618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/seagar/comments/commentRss/239618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/seagar/services/trackbacks/239618.html</trackback:ping><description><![CDATA[InnoDB和MyISAM是在使用MySQL最常用的两个表类型，各有优缺点，视具体应用而定。基本的差别为：MyISAM类型不支持事务处理等高级处理，而InnoDB类型支持。MyISAM类型的表强调的是性能，其执行数度比InnoDB类型更快，但是不提供事务支持，而InnoDB提供事务支持已经外部键等高级数据库功能。<br />
<br />
MyIASM是IASM表的新版本，有如下扩展：<br />
二进制层次的可移植性。<br />
NULL列索引。<br />
对变长行比ISAM表有更少的碎片。<br />
支持大文件。<br />
更好的索引压缩。<br />
更好的键吗统计分布。<br />
更好和更快的auto_increment处理。<br />
<br />
以下是一些细节和具体实现的差别：<br />
<br />
1.InnoDB不支持FULLTEXT类型的索引。<br />
2.InnoDB 中不保存表的具体行数，也就是说，执行select count(*) from table时，InnoDB要扫描一遍整个表来计算有多少行，但是MyISAM只要简单的读出保存好的行数即可。注意的是，当count(*)语句包含 where条件时，两种表的操作是一样的。<br />
3.对于AUTO_INCREMENT类型的字段，InnoDB中必须包含只有该字段的索引，但是在MyISAM表中，可以和其他字段一起建立联合索引。<br />
4.DELETE FROM table时，InnoDB不会重新建立表，而是一行一行的删除。<br />
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的，解决方法是首先把InnoDB表改成MyISAM表，导入数据后再改成InnoDB表，但是对于使用的额外的InnoDB特性（例如外键）的表不适用。<br />
<br />
另外，InnoDB表的行锁也不是绝对的，如果在执行一个SQL语句时MySQL不能确定要扫描的范围，InnoDB表同样会锁全表，例如update table set num=1 where name like &#8220;%aaa%&#8221;<br />
<br />
任何一种表都不是万能的，只用恰当的针对业务类型来选择合适的表类型，才能最大的发挥MySQL的性能优势。 <!-- Added by RelatedTopic, plugin for Bo-Blog 2.0.0 -->
  <img src ="http://www.blogjava.net/seagar/aggbug/239618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/seagar/" target="_blank">seagar</a> 2008-11-10 11:07 <a href="http://www.blogjava.net/seagar/articles/239618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>