MyISAM引擎和InnoDB引擎介绍及应⽤场景
MyISAM引擎和InnoDB引擎介绍及应⽤场景
⼀、MyISAM引擎介绍
1.1什么是MyISAM引擎?
MyISAM引擎是MySQL关系数据库管理系统的默认存储引擎(MySQL5.5版本以前)。这种MySQL
表存储结构从旧的ISAM代码扩展出许多有⽤的功能。在新版本的MySQL中,InnoDB引擎由于其对事物参照完整性,以及更⾼的并发性等优点开始逐步的取代MyISAM引
擎。
⼩结:事物参照完整性可理解为数据的⼀致性。
1.2 MyISAM引擎的特点
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]
linux认证有哪些培训机构[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)。
2、⾏级锁定:通过索引实现,全表扫描仍然是表锁。
3、读写阻塞与事务隔离级别相关。
4、具有⾮常⾼效的缓存特性:能缓存索引,也能缓存数据。
5、整个表和主键以cluster⽅式存储,组成⼀颗平衡树。
6、所有secondary inex都会保存主键信息。
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 信息
# 如果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%
# 来避免在⽇志⽂件覆写上不必要的缓冲池刷新⾏为.c语言流星雨代码简单的
# 不论如何, 请注意⼀个⼤的⽇志⽂件⼤⼩会增加恢复进程所需要的时间.
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
mysql语句的执行顺序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版本
1、查看当前数据库⾃动提交的状态,默认为ON
mysql> show variables like "%autocommit%" ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
⼩结:mysql默认是⾃动提交的,oracle需要⼿动提交。
2、设置⾃动提交的状态为OFF
mysql> set global autocommit=off;
怎么打开php网站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)
⼩结:
1、创建⼀个表,如果⾃动提交的状态为OFF,就需要commit⼿动提交。
3、回滚事务
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、避免主键更新,因为会带来⼤量的数据移动。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论