数据库
mysql数据库引擎myisam和innerdb的区别?
一、mysql数据库引擎myisam和innerdb的区别?
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
以下是一些细节和具体实现的差别:
◆1.InnoDB不支持FULLTEXT类型的索引。
◆2.InnoDB中不保存表的具体行数,也就是说,执行selectcount(*)fromtable时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时,两种表的操作是一样的。
◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
◆4.DELETEFROMtable时,InnoDB不会重新建立表,而是一行一行的删除。
◆5.LOADTABLEFROMMASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如updatetablesetnum=1wherenamelike“%aaa%”
两种类型最主要的差别就是Innodb支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。
我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选。
原因如下:
1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。
2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。
4、从我接触的应用逻辑来说,selectcount(*)和orderby是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些selectcount(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
当然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。
另外,可能有人会说你MyISAM无法抗太多写操作,但是我可以通过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿pv的动态页面,还有几个大项目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。
二、myisam是否支持索引?
是的。
myisam支持的索引有:
1.B-Tree索引
B-Tree索引,顾名思义,就是所有的索引节点都按照balance tree的数据结构来存储,所有的索引数据节点都 在叶节点;
2.R-Tree索引
R-Tree索引的存储方式和B-Tree索引有一些区别,主要设计用于存储空间和多维数据的字段做索引,目前的MySQL版本仅支持geometry类型的字段作索引.
3.Full-text索引
Full-text索引就是我们常说的全文索引,它的存储结构也是B-Tree,主要是为了解决当须要用like查询时的低效问题。
三、MySQL数据库引擎详解:InnoDB与MyISAM对比分析
MySQL数据库引擎概述
在使用MySQL数据库时,数据库引擎是一个非常重要的因素。数据库引擎决定了数据的存储方式、事务处理能力、并发性能等特性。MySQL常见的数据库引擎有InnoDB和MyISAM,在实际应用中需要根据具体情况选择合适的引擎。
InnoDB数据库引擎
InnoDB是MySQL的默认存储引擎,它支持事务、行级锁、外键等特性,适合于需要高并发、事务安全性要求高的应用。InnoDB的表由共享表空间和多个表组成,支持事务的提交和回滚,并且具备较好的崩溃恢复能力。
MyISAM数据库引擎
MyISAM是MySQL早期的默认存储引擎,其表以文件形式存储,不支持事务和行级锁,但对于查询性能较高。MyISAM适合于读密集型的应用,比如新闻、博客等网站的数据存储。
InnoDB与MyISAM对比
从上述介绍可以看出,InnoDB和MyISAM各有优势,具体选择取决于应用的实际需求。一般来说,对于大部分业务适合选择InnoDB,而对于特定的读密集型应用可以考虑选择MyISAM。鉴于InnoDB的高并发性能、事务支持,以及对数据一致性和完整性的保障,目前在实际应用中使用较为广泛。
总的来说,对于数据库引擎的选择需要综合考虑查询性能、事务处理能力、数据一致性等因素。在实际应用中,根据具体的业务场景来进行合理的选择,才能更好地发挥数据库的作用。
感谢您阅读本文,希望对您理解MySQL数据库引擎有所帮助。
四、myisam可以做主从吗?
是的,MyISAM 可以做主从复制。MyISAM 是 MySQL 数据库的一种存储引擎,主从复制是 MySQL 数据库的一种数据备份方式,可以将主数据库的数据同步到从数据库中,保证数据的可靠性和可用性。MyISAM 支持 MySQL 的主从复制功能,可以通过配置 MySQL 的主从复制参数,将主数据库的数据复制到从数据库中。在实际应用中,MyISAM 主从复制可以用于数据备份、读写分离等场景,提高数据库的性能和可靠性。
五、mysql myisam有没缓冲池?
有的。mysql myisam有缓冲池。
MyISAM设计了一个在存放在内存中的索引缓冲池Key Cache。Key Cache只缓存索引数据,通过LRU算法将读取频繁的索引加载到Key Cache中来。
通过系统变量 key_buffer_size 来控制Key Cache的大小,这个变量关乎到缓存的性能。
六、为什么myisam是非聚簇索引?
你好,MyISAM是非聚簇索引的原因主要有以下几点。
首先,MyISAM存储引擎不支持事务,如果使用聚簇索引,则在单个事务中更新一个记录时必须按页锁定。
其次,MyISAM存储引擎通常用于一些读多写少的情况,此时使用聚簇索引反而会降低性能。最后,MyISAM使用非聚簇索引的额外好处是,可以从任意位置开始扫描索引,不一定要从第一个索引开始。但是,也需要注意到MyISAM使用非聚簇索引的缺点,例如无法利用硬件缓存和磁盘预读取来高效读取数据。
七、MySQL数据库引擎全面解析:InnoDB、MyISAM、Memory等引擎对比及选择指南
引言
在MySQL数据库中,选择合适的数据库引擎对于数据库性能和功能的发挥至关重要。不同的数据库引擎有着各自的特点和适用场景。本文将对MySQL常用的数据库引擎(InnoDB、MyISAM、Memory等)进行全面解析,比较它们的特性和性能,帮助读者更好地选择合适的数据库引擎。
InnoDB引擎
首先我们来看InnoDB引擎。InnoDB是MySQL数据库默认的事务型存储引擎,支持事务处理和行级锁等特性。这使得它在处理大量数据时表现出色,尤其适合于需要高并发和数据完整性要求较高的应用场景。
MyISAM引擎
与InnoDB相比,MyISAM是MySQL的另一种常见存储引擎。它不支持事务处理,但在读密集型操作和空间占用上表现优异,适合于数据仓库和只读应用等场景。
Memory引擎
除了InnoDB和MyISAM,我们还有Memory引擎。Memory引擎将数据存储在内存中,因此读写速度非常快,但同时也有数据持久性差的缺点。它适用于缓存表和临时表的场景。
其他引擎对比及选择指南
除了上述三种引擎,MySQL还有诸如Archive、CSV和Blackhole等其他引擎。这些引擎各有特点,适用于不同的场景。在选择合适的数据库引擎时,我们需要结合自身应用的特点和需求,比较各引擎的特性(如事务支持、锁机制、数据持久性等),从而做出最佳选择。
结语
通过本文的介绍,相信读者对于MySQL中常见的数据库引擎有了更深入的了解,能够更好地根据实际情况选择合适的引擎,从而提升数据库的性能和稳定性。
感谢您阅读本文,希望本文可以帮助您更好地理解和选择MySQL数据库引擎。
八、为什么myisam不支持事务?
首先要了解数据库里的事务是什么意思。事务在计算机数据库里:在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。简单的讲举例来说:A汇100块钱给B,A减少100,B增加100,这是一个事务,只要中间有任何错误,这个事务的所有操作都要撤销。所以MyISAM不支持事务就是这个意思,需要程序进行撤销操作。Innodb是支持事务的。 mysql的存储引擎包括:MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDBCluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。 最常使用的2种存储引擎: 1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD(MYData,存储数据)、.MYI(MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。 2.InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
九、MYSQL中MyISAM和InnoDB索引的区别?
1、存储方式不同:MyISAM将索引和数据分别存储在两个不同的文件中,而InnoDB则将索引和数据存储在同一个文件中。
2、支持事务:MyISAM不支持事务处理,而InnoDB支持事务处理。
3、锁定方式不同:MyISAM在进行写操作时会锁住整张表,而InnoDB则支持行级锁定,可以避免表级锁定对并发性能的影响。
4、外键约束:MyISAM不支持外键约束,而InnoDB支持外键约束。
5、缓存方式不同:MyISAM使用的是key_buffer缓存索引数据,而InnoDB使用的是innodb_buffer_pool缓存表数据和索引数据。
6、数据恢复方式不同:MyISAM的数据恢复较为简单,而InnoDB的数据恢复较为复杂,需要进行日志回滚等操作。总的来说,如果需要支持事务处理、外键约束等高级功能,建议使用InnoDB存储引擎;如果需要进行大量的查询操作,MyISAM的查询效率更高。
十、mysql中的myisam和innodb的区别?
MyISAM 和 InnoDB 都是 MySQL 数据库的数据库引擎,其中 MyISAM 是 5.5 版本之前的默认引擎,而 5.5 版本之后,MySQL 引入了InnoDB 并且作为其默认的数据库引擎。
01. 锁
MyISAM 只支持表级锁(table-level locking),也就是任何 CRUD 的操作都会给表加上锁,而 InnoDB 则支持表级锁和行级锁(row-level locking),默认是行级锁。
Innodb 的行级锁又分几种:共享锁(S),排它锁(X),意向共享锁(IS),意向排他锁(IX);如果 SQL 语句没有使用索引,并且又不能确定操作的行,这个时候就会锁表;即使在查询条件中使用了索引字段,但是如果 MySQL 认为全表扫描的效率更高,这时候也会使用表锁,所以还是要通过执行计划确认是否真正使用到了索引。
02. 事务
MyISAM 强调的是性能,但是不支持事务;
Innodb 是支持事务的,事务级别包括未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),可序列化(Serializable);
而不支持事务可能会导致:数据更新丢失、脏读、不可重复读等等;另外事务可以保障数据库崩溃后的安全恢复。
03. 外键
MyISAM 不支持外键,Innodb 支持外键。
04. 数据库文件
MyISAM 的数据库文件属于堆表,每个表在磁盘上都有三个文件,frm(存储表定义)、myd(存储表数据)、myi(存储表索引);
InnoDB 分为表空间数据文件和日志文件;其中数据文件用于保存数据和索引,它又有两种存储方式,共享表空间存储和多表空间存储;如果是共享表空间,那么所有表的数据文件和索引文件都保存在同一个表空间中,如果是多表空间,那么每个表都有一个表空间文件,用于存储数据和索引。
05. 索引
MyISAM 使用非聚集索引,也就是索引和数据分开存储,索引保存的是数据文件的指针;也就是说,主键索引和非主键索引的叶子节点都是数据文件的指针。
InnoDB 使用聚集索引,也就是索引和数据存在一个文件中;必须要有主键;不过如果使用非主键索引的话,需要两次查询,先查询到主键,然后再通过主键查询到数据;也就是说,主键索引的叶子节点是数据文件,非主键索引的叶子节点是主键的值。
另外着重指出,InnoDB 必须有主键,MyISAM 可以没有。
06. count()
MyISAM 保存有表的总行数,如果使用 select count(*) from table,直接取出该值,效率更高;
InnoDB 没有保存表的总行数,如果使用 select count(*) from table,需要遍历整个表;
当然如果是加了 where 条件的话,两种引擎都需要进行扫描。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...