mysql innodb 调优_MySQL innodb优化总结

本文介绍了MySQL InnoDB的三种插入模式:Simple, Bulk和Mixed-mode,以及innodb_autoinc_lock_mode参数的三种模式:0(传统锁模式),1(连续锁模式)和2(交错锁模式)。详细分析了每种模式下的并发性和对auto_increment ID的处理,特别提到了在主从复制中应注意的配置和可能产生的不一致问题。" 132009636,10974913,R语言:与的区别,['R语言'],"['R语言', '索引操作符', '子集选取', '元素选取']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySql插入有3中模式

Simple inserts

就是通过分析insert语句可以确定插入数量的insert语句, INSERT, INSERT … VALUES(),VALUES()

Bulk inserts

就是通过分析insert语句不能确定插入数量的insert语句, INSERT … SELECT, REPLACE … SELECT, LOAD DATA

Mixed-mode inserts

下面两种,不确定是否需要分配auto_increment id

INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');

INSERT … ON DUPLICATE KEY UPDATE

一、innodb_autoinc_lock_mode = 0 (“traditional” lock mode)

这种方式就和mysql5.1.22以前一样,为了向后兼容而保留了这种模式,如同前面介绍的一样,这种方式的特点就是“表级锁定”,并发性较差

二、innodb_autoinc_lock_mode = 1 (“consecutive” lock mode)

这种方式是新版本中的默认方式,推荐使用,并发性相对较高,特点是“consecutive”,即保证同一条insert语句中新插入的auto_increment id都是连续的。

这种模式下,对应MySQL的三种插入模式,会有三种不同的插入方法(见上面mysql的3种插入方式):

“Simple inserts”:直接通过分析语句,获得要插入的数量,然后一次性分配足够的auto_increment id,只会将整个分配的过程锁住。

“Bulk inserts”:因为不能确定插入的数量,因此使用和以前的模式相同的表级锁定。

“Mixed-mode inserts”:直接分析语句,获得最坏情况下需要插入的数量,然后一次性分配足够的auto_increment id,只会将整个分配的过程锁住。需要注意的是,这种方式下,会分配过多的id,而导致”浪费“。比如INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');会一次性的分配5个id,而不管用户是否指定了部分id;INSERT ... ON DUPLICATE KEY UPDATE一次性分配,而不管将来插入过程中是否会因为duplicate key而仅仅执行update操作。

注意:当master mysql版本<5.1.22,slave mysql版本>=5.1.22时,slave需要将innodb_autoinc_lock_mode设置为0,因为默认的innodb_autoinc_lock_mode为1,对于INSERT ... ON DUPLICATE KEY UPDATE和INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');的执行结果不同,现实环境一般会使用INSERT ... ON DUPLICATE KEY UPDATE。

三、innodb_autoinc_lock_mode = 2 (“interleaved” lock mode)

这种模式是来一个分配一个,而不会锁表,只会锁住分配id的过程,和innodb_autoinc_lock_mode = 1的区别在于,不会预分配多个,这种方式并发性最高。但是在replication中当binlog_format为statement-based时(简称SBR statement-based replication,就是那个只记录mysql语句的binglog模式)存在问题,因为是来一个分配一个,这样当并发执行时,“Bulk inserts”在分配的时会同时向其他的INSERT分配,会出现主从不一致(从库执行结果和主库执行结果不一样),因为binlog只会记录开始的insert id。

MySQL InnoDB是一种非常流行的关系型数据库存储引擎,但是在高并发、大数据量的情况下,需要对InnoDB进行适当的才能发挥出其最大的性能。 以下是一些常见的InnoDB方法: 1. 整缓冲池大小:InnoDB的缓冲池是用来存储数据和索引的,缓冲池越大,可以存储的数据和索引也就越多。可以通过设置innodb_buffer_pool_size参数来整缓冲池的大小。 2. 开启慢查询日志:慢查询日志可以记录执行时间超过指定阈值的SQL语句,以便进行分析和优化。可以通过设置slow_query_log和long_query_time参数来开启慢查询日志。 3. 整线程数:InnoDB使用多个线程来处理不同的任务,如读取数据、写入数据、刷新缓存等。可以通过设置innodb_thread_concurrency参数来InnoDB使用的线程数。 4. 分区表:如果表中的数据量很大,可以考虑将表进行分区,这样可以提高查询速度并减少锁的竞争。 5. 整日志文件大小:InnoDB使用redo日志和undo日志来保证数据的一致性和可恢复性。可以通过设置innodb_log_file_size参数来整日志文件的大小,以提高崩溃恢复速度。 6. 整缓存大小:InnoDB使用缓存来存储数据和索引,缓存大小可以通过设置innodb_buffer_pool_size参数来整。 7. 使用SSD硬盘:SSD硬盘相比传统机械硬盘有更高的读写速度和更低的访问延迟,可以显著提高InnoDB的性能。 8. 使用索引:在查询数据时,使用索引可以大大提高查询速度。可以通过使用explain命令来分析查询语句是否使用了索引。 以上是一些常见的InnoDB方法,需要根据具体情况进行选择和整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值