问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请论述下mysql中innodb和myisam的区别和优劣

发布网友 发布时间:2022-04-30 02:08

我来回答

3个回答

懂视网 时间:2022-04-30 06:29

IO优化的原则:尽可能能缓存,减少读对数据库的随机IO的请求;同时减少写的随机IO的随时发生,利用各种buffer去缓存。





本文出自 “dba天空” 博客,请务必保留此出处http://9425473.blog.51cto.com/9415473/1671215

innodb配置优化原则

标签:mysql

热心网友 时间:2022-04-30 03:37

  InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。
  下面是已知的两者之间的差别,仅供参考。
  
  innodb
  InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力
  (crash recovery capabilities)的事务安全
  (transaction-safe (ACID compliant))型表。InnoDB 提供了行锁
  (locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking
  read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。
  在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level
  locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY
  constraints)的表引擎。
  
  InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库
  引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,
  InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存
  放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放
  在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。
  InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的
  表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,
  或者用 mysqlmp。
  
  MyISAM
  MyISAM 是MySQL缺省存贮引擎 .
  
  每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。
  索引文件是MYI (MYIndex) 引伸。
  
  因为MyISAM相对简单所以在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.
  
  MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦
  
  MyISAM是ISAM表的新版本,有如下扩展:
  
  ·二进制层次的可移植性。
  ·NULL列索引。
  ·对变长行比ISAM表有更少的碎片。
  ·支持大文件。
  ·更好的索引压缩。
  ·更好的键吗统计分布。
  ·更好和更快的auto_increment处理。
  
  以下是一些细节和具体实现的差别:
  
  ◆1.InnoDB不支持FULLTEXT类型的索引。
  ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,
  InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。
  注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
  ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM
  表中,可以和其他字段一起建立联合索引。
  ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
  ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成
  MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的
  表不适用。
  
  ◆MyISAM类型的二进制数据文件可以在不同操作系统中迁移。
  
  另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的
  范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
  
  再另外,使用两种的选择:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,
  应该使用InnoDB表。如果执行大量的SELECT,MyISAM是更好的选择。若需要使用事务处理,
  但是原来的数据表使用的是myisam,就需要改为bdb或者innodb,这样基于myisam的程序,
  将类型改为innodb后,其程序不用改动……
  
  综上所述,任何一种表都不是万能的,只有恰当的针对业务类型来选择合适的表类型,才能
  最大的发挥MySQL的性能优势。
  
  MyISAM和InnoDB优化:
  key_buffer_size - 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置
  为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 -- 记住,MyISAM表会
  使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大
  多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了 -- .MYI 文件只有 1GB
  ,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用
  MyISAM表,那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引
  所需。
  innodb_buffer_pool_size - 这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更
  为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,然而Innodb在默认的
  innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,
  无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的
  可用内存。一些应用于 key_buffer 的规则有 -- 如果你的数据量不大,并且不会暴增,那
  么无需把
  innodb_additional_pool_size - 这个选项对性能影响并不太多,至少在有差不多足够内存
  可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大),因此就需要看一下
  Innodb其他需要分配的内存有多少。
  innodb_log_file_size 在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相
  对越高,但是要注意到可能会增加恢复时间。我经常设置为 64-512MB,跟据服务器大小而异。
  innodb_log_buffer_size 默认的设置在中等强度写入负载以及较短事务的情况下,服务器性
  能还可以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置
  太高了,可能会浪费内存 -- 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。
  通常 8-16MB 就足够了。越小的系统它的值越小。
  innodb_flush_logs_at_trx_commit 是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘
  了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)
  都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是
  从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,
  而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-
  2次更新的消耗。如果设置为 0 就快很多了,不过也相对不安全了 -- MySQL服务器崩溃时
  就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。
  table_cache -- 打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用
  中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度地缓存打
  开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。
  如果你有200多个表的话,那么设置为 1024 也许比较合适(每个线程都需要打开表),
  如果连接数比较大那么就加大它的值。我曾经见过设置为 100,000 的情况。
  thread_cache -- 线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。
  我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created 的值
  也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。
  query_cache -- 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有
  用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置
  为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,
  如果缓存命中率太低了,就启用它。
  sort_buffer_size --如果你只有一些简单的查询,那么就无需增加它的值了,尽管你有
  64GB 的内存。搞不好也许会降低性能

热心网友 时间:2022-04-30 04:55

MYISAM 表是典型的数据与索引分离存储,主键和二级索引没有本质区别。比如在 MYISAM 表里主键、唯一索引是一样的,没有本质区别。
MYISAM 表的索引存储方式最大的缺点没有按照物理数据行顺序存储,这样无论对主键的检索还是对二级索引的检索都需要进行二次排序。
INNODB 表本身是索引组织表,也就是说索引就是数据。下图表T1的数据行以聚簇索引的方式展示,非叶子节点保存了主键的值,叶子节点保存了主键的值以及对应的数据行,并且每个页有分别指向前后两页的指针。
INNODB 表不同于 MYISAM,INNODB 表有自己的数据页管理,默认 16KB。MYISAM 表数据的管理依赖文件系统,比如文件系统一般默认 4KB,MYISAM 的块大小也是 4KB,MYISAM 表的没有自己的一套崩溃恢复机制,全部依赖于文件系统。
INNODB 表这样设计的优点有两个:
1. 数据按照主键顺序存储。主键的顺序也就是记录行的物理顺序,相比指向数据行指针的存放方式,避免了再次排序。
2. 两个叶子节点分别含有指向前后两个节点的指针,这样在插入新行或者进行页*时,只需要移动对应的指针即可。
但是也有缺点:
1. 二级索引由于同时保存了主键值,体积会变大。特别是主键设计不合理的时候,比如用 UUID 做主键。
2. 对二级索引的检索需要检索两次索引树。第一次通过检索二级索引叶子节点,找到过滤行对应的主键值;第二次通过这个主键的值去聚簇索引中查找对应的行。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
水利水电工程单元工程施工质量验收评定标准——土石方工程(SL 631... 关于水利水电工程项目划分的规程有哪些?划分的越细越好,感谢大家的帮 ... 水利水电工程的单位工程包括哪些工程? 尖子生学案:生物高中选修3目录 U盘传了数据怎么删除电脑记录如何清除电脑上U盘使用记录 把u盘插电脑怎么删掉记忆如何删掉电脑上插过U盘的记录 win7清除u盘记录 如何清理win7电脑u盘痕迹如何清除电脑上U盘使用记录 麦当劳和华莱士的外卖电话是什么? 一文详解ISO/IEC20000信息技术服务管理体系认证好处、材料、流程 中国电信橙分期 用花呗支付了2456.得到两千的东西是不是受骗了? 橙分期没交话费扣了花呗算还款吗 你好,我办理了一个99档的电信橙分期花呗,不是说电信还吗?怎么自己还要每个月到花呗款那扣钱 橙分期冻结的花呗额度会有利息产生吗 洗脸皂和洗面奶哪个好 iphone4 HDR 关闭 iphone12hdr怎么关 梦见才火还有两个亲人胳膊出血是什么意思? 梦见手臂流血不止是什么意思? 梦见别人快生了下面都是水和血 淘宝卖家怎么交运费险 微信好友被删了,自己又不知道他的了。怎么找回? 冬季小米和什么一起煮粥更好 将相和的学习资料 求高中理科学习法要详细。如用什么资料书,如何合理安排时间,考试技巧,各科学习技巧。3q了! 中国饮食文化的学习资料 CFA是需要报名才可以看学习资料吗? 司马光勤奋学习的资料 寻找《珍贵的教科书》原文 工地没活干,想学一门技术,有没有好的推荐? 中国汽研股票配股什么时候到 有人了解中国汽研吗? 中国汽研(601965)股票怎么样 你好,请问在该建设银行办理了车贷,车贷还清后应该需要怎么处理? 中国汽研是蓝筹股吗? 中国汽研这只股票好不好 601965是什么股票 上汽集团股票分红派息后卖掉要交税吗 恒逸石化的后市怎么样?股票恒逸石化主力控盘一览?恒逸石化哪年买给分红? 长线股票哪个好 中国汽研股票发行价是多少 中国汽研属创业板还是中小板 请问 高中物理和数学的全部公式 谁能给我高中所有物理,数学公式和例子? 谁有高中数学公式,和物理公式,给我发一下,全部,谢谢哈, 游戏人生qq上的登录在那? 手机下载腾讯游戏人生登录选择的微信登录,登陆以后奖励的物品不能QQ POP海报里的赢字怎么写?? 手机怎么玩qq游戏人生 那位贤德之人知道甲骨文里的"赢"字怎么写