吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1074|回复: 12
收起左侧

[讨论] 关于mysql存储引擎请教

[复制链接]
大侠在路上 发表于 2021-4-3 10:22
本帖最后由 大侠在路上 于 2021-4-3 10:24 编辑

请问各位大佬们,有没有在生产环境mysql数据库里混用Myisam和innodb引擎的经验,是否会对性能或者稳定性等产生意料不到的影响?

为什么同样是商城类型的网站,有些使用Myisam,而另外一些却使用innodb?


仅仅是从事务、性能、读写差异、高并发、安全等上来进行选择的吗?(其实就想知道实际项目中选择mysql存储引擎常用决定性的条件是啥)

坐等各位大佬解惑。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

chang8888 发表于 2021-4-3 10:36
不懂 帮顶一下
fuckgm 发表于 2021-4-3 10:41
两种类型最主要的差别就是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、从接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个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表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

  当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。
 楼主| 大侠在路上 发表于 2021-4-3 10:58
本帖最后由 大侠在路上 于 2021-4-3 11:28 编辑
fuckgm 发表于 2021-4-3 10:41
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认 ...

感谢大佬热心解答。

大佬的回答很棒,大部分观点跟我的想法不谋而合,也有几个特别棒的观点给了我很多新的启发。

如果抛开事务和锁机制而言,我个人也比较喜欢使用MyISAM引擎。

但是奇怪的是,我从网上查阅资料时,很多文章又推荐应该首选Innodb引擎,因为崩溃后数据会比较安全等之类的。

而且网上有很多文章有这样的观点,说如果数据表涉及的存储数据多、查询多,用myisam,如文章表。如果数据表涉及业务逻辑多,增删改操作多,就用innodb,如订单表、会员表。

所以我产生了一个疑惑,貌似我没有看到过同一个库里把两种引擎混用的项目,理论上来说不是为同一个库里面的不同表选择对应的存储引擎会更加实用吗?
lovnie 发表于 2021-4-3 11:02
5.7以上主推 Innodb 性能已经跟上了
 楼主| 大侠在路上 发表于 2021-4-3 11:15
本帖最后由 大侠在路上 于 2021-4-3 11:21 编辑
lovnie 发表于 2021-4-3 11:02
5.7以上主推 Innodb 性能已经跟上了

感谢热心解答。

查阅过网上对于mysql5.7两种引擎相关的性能测评,单从性能来上说,除开单线程的写入速度差异比较明显之外,其他的读写差异几乎可以忽略。并且mysql官方5.7之后推荐使用innodb为默认引擎。

请问大佬有没有看到或者自己试过同一个库里把两种引擎混用的项目,理论上来说不是为同一个库里面的不同表选择对应的存储引擎会更加实用吗?
xiajin 发表于 2021-4-3 11:34
记得以前有人说,表引擎就选innodb就对了,以前一般根据实际情况、场景选择,现在都是默认选择innodb了
skyyihong 发表于 2021-4-3 11:34
虽然平时也在做开发工作,但只是在用用mysql和redis,细节也不是很懂。学习了
 楼主| 大侠在路上 发表于 2021-4-3 11:53
xiajin 发表于 2021-4-3 11:34
记得以前有人说,表引擎就选innodb就对了,以前一般根据实际情况、场景选择,现在都是默认选择innodb了

感谢热心解答。

网上的这样的观点不在少数,但是也有人测试在即使mysql8下,myisam引擎的查询效率仍然远胜Innodb。

我就是好奇,为啥没有项目把两种引擎结合在同一库内使用的呢?理论上来说,不是把两者结合起来使用会让每个表的都能发挥自己的长处吗?
samnew 发表于 2021-4-3 17:23
大侠在路上 发表于 2021-4-3 11:53
感谢热心解答。

网上的这样的观点不在少数,但是也有人测试在即使mysql8下,myisam引擎的查询效率仍然 ...

不同的表不同的引擎不好维护吧,另外如果要联表的话,问题就会非常大,从底层来看 Myisam的索引和 InnoDB 的索引结构差距很大 MyISAM 数据和索引是独立分开的文件 InnoDB 数据和索引是一起的 存储时候就已经按主键排序的 查询的时候速度非常快,索引优化好千万行的表都不是事。从数据安全性的角度来看  redolog  binlog(这个MySIAM也有 是数据库层面的)  二次读写 数据恢复 这些都是MyISAM 所没有的 现在的WEB 架构系统 选择 InnoDB 是个明智的选择 硬件的便宜也不需要为了节省点空间而和MyISAM 引擎混合了 所以 MySQL 也默认InnoDB 为默认引擎 MySQL 8开始也不允许建立 MyISAM 分区表了 至于你说的测试快 不知道是哪里的资料 我没有搜索到 可否给原文链接 参考资料 https://www.percona.com/blog/2016/10/11/mysql-8-0-end-myisam/  

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
大侠在路上 + 1 + 1 用心讨论,共获提升!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 05:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表