MyISAM和InnoDB

MyISAM

1.1. 什么是mylSAM引擎

MyISAM引擎是MySQL关系数据库管理系统的默认存储引擎(MySQL5.5版本以前)。这种MySQL
表存储结构从旧的ISAM代码扩展出许多有用的功能。在新版本的MySQL中,InnoDB引擎由于其对事物参照完整性,以及更高的并发性等优点开始逐步的取代MyISAM引擎。

小结:事物参照完整性可理解为数据的一致性。

1.2. mylSAM引擎的特点:

1、不支持事务(事务就是逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全部成功,要么全部失败)
2、表级锁定(更新是锁整个表):其锁定机制是表级锁定,虽然可以让锁定的实现成本很小,但是大大的降低了其并发性能。
小结:MyISAM锁定的范围太大
3、读写互相堵塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
4、只会缓存索引:MyISAM可以通过key_buffer_size缓存索引,大大提高访问性能,减少磁盘的I/O,但是缓存区只会缓存索引,不会缓存数据。
5、读取速度较快,占用资源相对少。
6、不支持外键约束,但支持全文索引。
7、MyISQM引擎是mysql_5.5.5之前的索引。

1.3. MyISAM引擎使用的场景

1、不需要事务支持的业务(转账、充值、付款这种就不行)。
2、一般为读数据比较多的应用。读写都频繁的不适合,读多或写多都适合。
3、并发访问相对低的业务(纯读、纯写高并发也可以)。
4、数据修改相对较少的业务(阻塞问题)。
5、以读为主的业务,例如:www,blog,图片信息数据库,用户数据库,商品库等业务。
6、对数据一致性要求不是很高的业务。
7、硬件资源比较差的机器可以用MyISAM。
小结:单一对数据库的操作都可以使用MyISAM引擎

1.4 MyISAM引擎调优精要

1、设置合适的索引(缓存机制)。

2、调整读写优先级,根据实际需求确保操作更优先执行。

mysql> help select

SELECT

    [ALL | DISTINCT | DISTINCTROW ]

      [HIGH_PRIORITY]

      [STRAIGHT_JOIN]

      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]

      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]

3、启动延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)。

4、尽量顺序操作让insert数据都写入到尾部,较少阻塞。

5、分解大的时间长的操作,降低单个操作的阻塞时间。

6、降低并发数(降低对mysql访问),某些高并发场景通过应用进行排队对列机制。

7、对于相对静态(更改不频繁)的数据库数据,充分利用query cache 或memcached缓存服务可以极大的提高访问效率。

  • 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.

  • 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.

  • 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.

  • 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,查询缓冲也许引起性能下降而不是性能提升.

    query_cache_size = 128M

  • 只有小于此设定值的结果才会被缓存,此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.

    query_cache_limit = 4M

InnoDB

2.1 什么是InnoDB引擎?

InnoDB引擎是MySQL数据库的另一个重要的存储引擎,正成为目前MySQL所发行新版本的标准,被包含在所有二进制安装包里。和其它的存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数的完整性(即对外键的支持)。

mysql> select version();

+-----------+

| version() |

+-----------+

| 5.6.17    |

+-----------+

1 row in set (0.00 sec)

2.2 InnoDB引擎特点

1、支持事务:支持事务的四个级别(ACID)。

  • 拓展:ACID(Aiomicity,Consistency,Isolation,Durability)
    原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    一致性(Consistency)
    事务前后数据的完整性必须保持一致。
    隔离性(Isolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
    持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

2、行级锁定:通过索引实现,全表扫描仍然是表锁。

3、读写阻塞与事务隔离级别相关。

4、具有非常高效的缓存特性:能缓存索引,也能缓存数据。

5、整个表和主键以cluster方式存储,组成一颗平衡树。

6、所有secondary index都会保存主键信息。

7、支持分区,表空间,类似oracle数据库。

8、支持外键约束,不支持全文索引。5.5版本以前不支持全文索引,5.5版本之后支持。

9、和MyISAM相比对硬件的资源要求比较高。

2.3 InnoDB引擎适用的生产应用场景

1、需要事务支持的业务(具有较好的事务特性)。

2、行级锁定对高并发有很好的适用能力,但需要确保查询是通过索引来来完成的。

3、数据读写及更新都较为频繁的场景,如:BBS、SNS、微博等。

4、数据一致性要求较高的业务,如:充值转账。

5、硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存使用率,尽可能的较少磁盘的I/O。

2.4 生产环境InnoDB配置参数详解

  • 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,使用此选项会节省内存以及磁盘空间,并且加速某些部分

    skip-innodb

  • 附加的内存池被InnoDB用来保存 metadata 信息

    • 拓展:metadata(元数据)
      什么是元数据
      任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode…)等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。

      元数据管理方式
      元数据管理有两种方式。集中式管理和分布式管理。集中式管理是指在系统中有一个节点专门司职元数据管理,所有元数据都存储在该节点的存储设备上。所有客户端对文件的请求前,都要先对该元数据管理器请求元数据。分布式管理是指将元数据存放在系统的任意节点并且能动态的迁移。对元数据管理的职责也分布到各个不同的节点上。大多数集群文件系统都采用集中式的元数据管理。因为集中式管理实现简单,一致性维护容易,在一定的操作频繁度内可以提供较满意的性能。缺点是单一失效点问题,若该服务器失效,整个系统将无法正常工作。而且,当对元数据的操作过于频繁时,集中的元数据管理成为整个系统的性能瓶颈。
      分布式元数据管理的好处是解决了集中式管理的单一失效点问题, 而且性能不会随着操作频繁而出现瓶颈。其缺点是,实现复杂,一致性维护复杂,对性能有一定影响。

  • 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存. 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.SHOW INNODB STATUS 命令会显示当先使用的数量.

    innodb_additional_mem_pool_size = 64M

  • InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%.不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,所以不要设置的太高.

    innodb_buffer_pool_size = 6G

  • InnoDB 将数据保存在一个或者多个数据文件中成为表空间.如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.其他情况下.每个设备一个文件一般都是个好的选择.你也可以配置InnoDB来使用裸盘分区 – 请参考手册来获取更多相关内容

    innodb_data_file_path = ibdata1:10M:autoextend

  • 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.默认保存在MySQL的datadir中.

    innodb_data_home_dir =

  • 用来同步IO操作的IO线程的数量. This value is .此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.

    innodb_file_io_threads = 4

  • 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.从1开始并且增加此值知道你能够成功的导出表.

    innodb_force_recovery=1

  • 在InnoDb核心内的允许线程数量.最优值依赖于应用程序,硬件以及操作系统的调度方式. 过高的值可能导致线程的互斥颠簸.

    innodb_thread_concurrency = 16

  • 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,这提供了完整的ACID行为.如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O .0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.

    innodb_flush_log_at_trx_commit = 2

    (说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1;设置为0性能最高,但如果发生故障,数据可能会有丢失的危险!默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。)

  • 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.

    innodb_fast_shutdown

  • 用来缓冲日志数据的缓冲区的大小.当此值快满时, InnoDB将必须刷新数据到磁盘上.由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)

    innodb_log_buffer_size = 16M

  • 在日志组中每个日志文件的大小.你应该设置日志文件总合大小到你缓冲池大小的25%~100%,来避免在日志文件覆写上不必要的缓冲池刷新行为.不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.

    innodb_log_file_size = 512M

  • 在日志组中的文件总数.通常来说2~3是比较好的.

    innodb_log_files_in_group = 3

  • InnoDB的日志文件所在位置. 默认是MySQL的datadir.你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能

    innodb_log_group_home_dir

  • 在InnoDB缓冲池中最大允许的脏页面的比例.如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.这是一个软限制,不被保证绝对执行.

    innodb_max_dirty_pages_pct = 90

  • InnoDB用来刷新日志的方法.表空间总是使用双重写入刷新方法默认值是 “fdatasync”, 另一个是 “O_DSYNC”.

    innodb_flush_method=O_DSYNC

  • 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎那么一个死锁可能发生而InnoDB无法注意到.这种情况下这个timeout值对于解决这种问题就非常有帮助.

    innodb_lock_wait_timeout = 120

2.5 某公司生产环境InnoDB配置

#InnoDB

innodb_data_home_dir = /

innodb_log_group_home_dir = /

innodb_data_file_path = ibdata1:1G:autoextend

 

innodb_buffer_pool_size = 4G

 

innodb_buffer_pool_instances    = 8

#innodb_additional_mem_pool_size = 16M

innodb_log_file_size = 200M

innodb_log_buffer_size = 16M

innodb_log_files_in_group = 3

innodb_flush_log_at_trx_commit = 2

innodb_lock_wait_timeout = 10

innodb_sync_spin_loops = 40

innodb_max_dirty_pages_pct = 90

innodb_support_xa = 0

innodb_thread_concurrency = 0

innodb_thread_sleep_delay = 500

#innodb_file_io_threads    = 4

innodb_concurrency_tickets = 1000

log_bin_trust_function_creators = 1

innodb_flush_method = O_DIRECT

innodb_file_per_table

innodb_read_io_threads = 16

innodb_write_io_threads = 16

innodb_io_capacity = 2000

innodb_file_format = Barracuda

innodb_purge_threads=1

innodb_purge_batch_size = 32

innodb_old_blocks_pct=75

innodb_change_buffering=all

innodb_stats_on_metadata=OFF

2.6 InnoDB引擎调优精要

1、主键尽可能小,避免给secondary index带来更大的空间负担。

2、避免全表扫描,因为会使用表锁。

3、尽可能缓存所有的索引和数据,提高响应速度,较少磁盘I/O。

4、在大批量插入的数据,尽量自己控制事务而不要使用autocommit自动提交。有开关可以控制提交方式。

MysQL5.6版本

a)、查看当前数据库自动提交的状态,默认为ON

mysql> show variables like "%autocommit%" ;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

1 row in set (0.00 sec)

小结:mysql默认是自动提交的,oracle需要手动提交。

b)、设置自动提交的状态为OFF

mysql> set global autocommit=off;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show variables like "%autocommit%" ;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | OFF   |

+---------------+-------+

1 row in set (0.00 sec)

小结:创建一个表,如果自动提交的状态为OFF,就需要commit手动提交。

c)、回滚事务

mysql> rollback;

Query OK, 0 rows affected (0.00 sec)

5、合理设置innodb_flush_log_at_trx_commit参数的值,不要过度追求安全性。

如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。

如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去。

如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

6、避免主键更新,因为会带来大量的数据移动。

原文链接:https://blog.csdn.net/m0_37814112/article/details/78633136

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyISAMInnoDB最大的区别在于MyISAM不支持事务,而InnoDB支持事务。MyISAM支持全文索引,而InnoDB不支持全文索引。MyISAM支持表锁,而InnoDB支持行级锁定。MyISAM可以支持存储引擎,而InnoDB不支持存储引擎。MyISAM更适合静态数据,而InnoDB更适合动态数据。 ### 回答2: MyISAMInnoDB是MySQL数据库中两种不同的存储引擎。 首先,MyISAM是MySQL最常用的存储引擎,它是基于表的存储引擎。它的优点在于查询速度快,对于读取频繁的应用程序来说是一个不错的选择。它使用表级锁定来处理并发操作,这意味着同一时间只能有一个查询或修改操作。此外,MyISAM不支持事务处理和外键约束,这使得在处理大量并发操作和数据完整性方面比较薄弱。 而InnoDB是另一种存储引擎,它是基于行的存储引擎。它的优点在于提供了事务处理的支持,具备ACID(原子性、一致性、隔离性和持久性)特性,能够保证数据的完整性和一致性。此外,InnoDB支持外键约束,并且使用行级锁定来处理并发操作,允许多个查询或修改操作在同一时间进行。相比于MyISAMInnoDB对于处理大量并发操作和保证数据的完整性是更好的选择。 此外,MyISAM存储引擎的表文件、索引文件和数据文件是分离存储的,而InnoDB存储引擎的表数据和索引是存放在同一个文件中的。因此,对于InnoDB来说,文件的管理和维护相对更简单。 总的来说,选择使用MyISAM还是InnoDB取决于具体的应用场景和需求。如果需要较快的读取速度,并且不需要支持事务处理和外键约束,可以选择MyISAM;如果需要支持事务处理、数据完整性和并发操作,优先考虑使用InnoDB。 ### 回答3: MyISAMInnoDB是MySQL数据库中两种不同的存储引擎。它们在功能、性能和适用场景等方面存在一些区别。 首先,MyISAM是MySQL的默认存储引擎,它被设计用于处理大量查询的环境。它以表为单位进行锁定,这意味着在进行写操作时需要锁定整个表,从而可能导致并发性能下降。但是,它对于读取密集型的应用程序来说速度较快。 而InnoDB是一个事务性的引擎,它支持事务、外键约束和行级锁定等高级特性。相比之下,InnoDB对于并发性能表现更好,因为它只锁定需要修改的行,而不是整个表。因此,InnoDB适用于有大量写操作的应用程序,例如在线事务处理系统。 另外,MyISAMInnoDB在数据安全性方面也存在差异。MyISAM不支持事务,也不支持崩溃恢复。如果在写操作期间发生硬件故障或其他问题,可能会导致数据丢失。而InnoDB支持事务和崩溃恢复,能够确保数据的一致性和持久性。 此外,MyISAMInnoDB在索引方面也有所不同。MyISAM使用B树索引,而InnoDB使用聚簇索引。聚簇索引将数据行存储在相同的物理页上,因此可以提高特定索引的查询性能。 总之,MyISAM适用于读取密集型的应用程序,而InnoDB适用于写入密集型的应用程序。根据应用的需求和性能要求,选择合适的存储引擎可以提高数据库的效率和数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值