innodb和myisam的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了innodb和myisam的区别相关的知识,希望对你有一定的参考价值。

InnoDBMyISAM使用mysql用两表类型各优缺点视具体应用定基本差别:MyISAM类型支持事务处理等高级处理InnoDB类型支持MyISAM类型表强调性能其执行数度比InnoDB类型更快提供事务支持InnoDB提供事务支持已经外部键等高级数据库功能  MyIASMIASM表新版本扩展:  二进制层移植性  NULL列索引  变行比ISAM表更少碎片  支持文件  更索引压缩  更键统计布  更更快auto_increment处理  些细节具体实现差别:  1.InnoDB支持FULLTEXT类型索引  2.InnoDB保存表具体行数说执行select count(*) from tableInnoDB要扫描遍整表计算少行MyISAM要简单读保存行数即注意count(*)语句包含where条件两种表操作  3.于AUTO_INCREMENT类型字段InnoDB必须包含该字段索引MyISAM表其字段起建立联合索引  4.DELETE FROM tableInnoDB重新建立表行行删除  5.LOAD TABLE FROM MASTER操作InnoDB起作用解决首先InnoDB表改MyISAM表导入数据再改InnoDB表于使用额外InnoDB特性(例外键)表适用  另外InnoDB表行锁绝执行SQL语句MySQL能确定要扫描范围InnoDB表同锁全表例update table set num=1 where name like %aaa%  任何种表都万能用恰针业务类型选择合适表类型才能发挥MySQL性能优势.    MySQLMyISAM引擎与InnoDB引擎性能简单测试  [硬件配置]  CPU : AMD2500+ (1.8G)  内存: 1G/现代  硬盘: 80G/IDE  [软件配置]  OS : Windows XP SP2  SE : php5.2.1  DB : MySQL5.0.37  Web: IIS6  [MySQL表结构]  CREATE TABLE `myisam` (  `id` int(11) NOT NULL auto_increment,  `name` varchar(100) default NULL,  `content` text,  PRIMARY KEY (`id`)  ) ENGINE=MyISAM DEFAULT CHARSET=gbk;  CREATE TABLE `innodb` (  `id` int(11) NOT NULL auto_increment,  `name` varchar(100) default NULL,  `content` text,  PRIMARY KEY (`id`)  ) ENGINE=InnoDB DEFAULT CHARSET=gbk;  [数据内容]  $name = "heiyeluren";  $content = "MySQL支持数存储引擎作同表类型处理器MySQL存储引擎包括处理事务安全表引擎处理非事务安全表引擎:· MyISAM管理非事务表提供高速存储检索及全文搜索能力MyISAM所MySQL配置支持默认存储引擎除非配置MySQL默认使用另外引擎 ·MEMORY存储引擎提供内存表MERGE存储引擎允许集合处理同MyISAM表作单独表像MyISAMMEMORYMERGE存储引擎处理非事务表两引擎都默认包含MySQL 释:MEMORY存储引擎式确定HEAP引擎· InnoDBBDB存储引擎提供事务安全表BDB包含支持操作系统发布MySQL-Max二进制发版InnoDB默认包括所MySQL 5.1二进制发版按照喜通配置MySQL允许或禁止任引擎·EXAMPLE存储引擎存根引擎做用引擎创建表没数据存储于其或其检索引擎目服务MySQL源代码例演示说明何始编写新存储引擎同主要兴趣发者";  [插入数据-1] (innodb_flush_log_at_trx_commit=1)  MyISAM 1W:3/s  InnoDB 1W:219/s  MyISAM 10W:29/s  InnoDB 10W:2092/s  MyISAM 100W:287/s  InnoDB 100W:没敢测试  [插入数据-2] (innodb_flush_log_at_trx_commit=0)  MyISAM 1W:3/s  InnoDB 1W:3/s  MyISAM 10W:30/s  InnoDB 10W:29/s  MyISAM 100W:273/s  InnoDB 100W:423/s  [插入数据3] (innodb_buffer_pool_size=1024M)  InnoDB 1W:3/s  InnoDB 10W:33/s  InnoDB 100W:607/s  [插入数据4] (innodb_buffer_pool_size=256M, innodb_flush_log_at_trx_commit=1, set autocommit=0)  InnoDB 1W:3/s  InnoDB 10W:26/s  InnoDB 100W:379/s  [MySQL 配置文件] (缺省配置)  # MySQL Server Instance Configuration File  [client]  port=3306  [mysql]  default-character-set=gbk  [mysqld]  port=3306  basedir="C:/mysql50/"  datadir="C:/mysql50/Data/"  default-character-set=gbk  default-storage-engine=INNODB  sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"  max_connections=100  query_cache_size=0  table_cache=256  tmp_table_size=50M  thread_cache_size=8  myisam_max_sort_file_size=100G  myisam_max_extra_sort_file_size=100G  myisam_sort_buffer_size=100M  key_buffer_size=82M  read_buffer_size=64K  read_rnd_buffer_size=256K  sort_buffer_size=256K  innodb_additional_mem_pool_size=4M  innodb_flush_log_at_trx_commit=1  innodb_log_buffer_size=2M  innodb_buffer_pool_size=159M  innodb_log_file_size=80M  innodb_thread_concurrency=8  【总结】  看MySQL 5.0面MyISAMInnoDB存储引擎性能差别并针InnoDB说影响性能主要 innodb_flush_log_at_trx_commit 选项设置1每插入数据候都自提交导致性能急剧降应该跟刷新志关系设置0效率能够看明显提升同SQL提交SET AUTOCOMMIT = 0设置达性能另外听说通设置innodb_buffer_pool_size能够提升InnoDB性能我测试发现没特别明显提升  基本我考虑使用InnoDB替代我MyISAM引擎InnoDB自身良特点比事务支持、存储程、视图、行级锁定等等并发情况相信InnoDB表现肯定要比MyISAM强相应my.cnf配置比较关键良配置能够效加速应用  复杂Web应用非关键应用继续考虑MyISAM具体情况自斟酌Mysql InnoDBMyISAM区别 参考技术A MyISAM和InnoDB的七大区别:
1、MySQL默认采用的是MyISAM。MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。
2、InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
3、InnoDB支持外键,MyISAM不支持。
4、InnoDB的主键范围更大,最大是MyISAM的2倍。
5、InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
6、MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。
7、没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。本回答被提问者采纳

以上是关于innodb和myisam的区别的主要内容,如果未能解决你的问题,请参考以下文章

myisam和innodb的区别

myisam和innodb的区别 mysql5.6

innodb和myisam的区别

MySql InnoDB 和MyISAM的区别

mysql中myisam,innodb和memory三个存储引擎的区别

MyISAM和InnoDB的主要区别和应用场景