索引对DML日志量的影响

1      对时间列进行DML操作的例子1.1     没有索引的情况下更新产生的日志量

SQL> conn BYF/123423

已连接。

SQL> --查询SID

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM=1;

 

       SID

----------

        41

 

已用时间:  00: 00: 00.00

SQL> --更新记录

SQL> UPDATE CAM106 SET rtime=sysdate

  2  WHERE vseq=54183;

 

已更新995行。

 

已用时间:  00: 00: 00.00

SQL> --查看日志量

SQL> SELECT VALUE

  2  FROM v$mystat v1,v$statname v2

  3  WHERE v1.STATISTIC#=v2.STATISTIC#

  4  AND   NAME='redo size';

 

     VALUE

----------

    265368

 

已用时间:  00: 00: 00.00

SQL> --rollback

SQL> rollback;

 

回退已完成。

 

已用时间:  00: 00: 00.02

--创建索引看下更新后产生的日志量

SQL> conn BYF/123423

已连接。

SQL> create index i_CAM106_rtime on CAM106(rtime) ;

 

索引已创建。

 

已用时间:  00: 01: 59.08

1.2     创建索引后DML的日志量

SQL> conn BYF/123423

已连接。

SQL> --查询SID

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM=1;

 

       SID

----------

        41

 

已用时间:  00: 00: 00.00

SQL> --更新记录

SQL> UPDATE CAM106 SET rtime=sysdate

  2  WHERE vseq=54183;

 

已更新995行。

 

已用时间:  00: 00: 00.01

SQL> --查看日志量

SQL> SELECT VALUE

  2  FROM v$mystat v1,v$statname v2

  3  WHERE v1.STATISTIC#=v2.STATISTIC#

  4  AND   NAME='redo size';

 

     VALUE

----------

    441284

 

已用时间:  00: 00: 00.00

SQL> --rollback

SQL> rollback;

 

回退已完成。

已用时间:  00: 00: 00.00

SQL> select (441284-265368)/265368*100 from dual;

 

(441284-265368)/265368*100

--------------------------

                66.2913388有索引的情况下比没有索引的情况下新增了66.3%的日志量

 

已用时间:  00: 00: 00.00

SQL>

2      对字符串列DML操作的例子2.1     没有索引的情况下

SQL> conn BYF/123423

已连接。

SQL> --查询SID

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM=1;

 

       SID

----------

        81

 

SQL> --更新记录

SQL> UPDATE CAM106 SET remark='改3379500:20110315_数据是由系统生成的--原值:3379500:

20110315_数据是由系统生成的'

  2  WHERE seq=391114;

 

已更新 1 行。

 

SQL> --查看日志量

SQL> SELECT VALUE

  2  FROM v$mystat v1,v$statname v2

  3  WHERE v1.STATISTIC#=v2.STATISTIC#

  4  AND   NAME='redo size';

 

     VALUE

----------

      1012

 

SQL> --rollback

SQL> rollback;

 

回退已完成。

 

2.2     有索引的情况下

SQL> conn BYF/123423

已连接。

SQL> conn db40/db40_aa@216

已连接。

SQL> --查询SID

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM=1;

 

       SID

----------

       331

 

SQL> --更新记录

SQL> UPDATE CAM106 SET remark='改3379500:20110315_数据是由系统生成的--原值:3379500:

20110315_数据是由系统生成的'

  2  WHERE seq=391114;

 

已更新 1 行。

 

SQL> --查看日志量

SQL> SELECT VALUE

  2  FROM v$mystat v1,v$statname v2

  3  WHERE v1.STATISTIC#=v2.STATISTIC#

  4  AND   NAME='redo size';

 

     VALUE

----------

      4196—没有索引的情况下只有1012,两者相差4倍

 

SQL> --rollback

SQL> rollback;

 

回退已完成。

 

SQL>

3      分析:

问题:DML操作时有索引相对没有索引多出的日志到底是哪里来的?

我们先来看下索引的物理结构,这里可以简单的分为两种,一种是叶子块,一种是枝节点

叶子块:

枝节点:

无论是叶子节点还是枝节点,都可以看成一个由5个列组成的表,索引块里的每个条路类似于记录,在DML操作的时候,可以把它看成普通的数据块的DML操作,而普通块的DML

对于update语句,典型情况下会包含3change vector. before image、改动的数据块、事务表本身的操作。

那么还有没有呢?当然还有,包括枝节点的分裂、重组、叶子节点的重组等等都会产生额外的日志。

4      结论:

从上述的试验和分析可以得出简单的结论,DML操作是会比没有索引的时候多出额外的日志!当然索引列越多,产生的额外日志量也就越大!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/751051/viewspace-731759/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/751051/viewspace-731759/

<think>好的,用户想查看MySQL在执行大DML操作时的刷盘速度,也就是监控DML的刷盘速度。首先,我需要回忆一下MySQL中与刷盘相关的机制和监控方法。 首先,刷盘(flush)通常指的是将内存中的数据写入磁盘的过程,这在InnoDB存储引擎中尤其重要。InnoDB使用缓冲池(buffer pool)来缓存数据页,当执行DML操作(如INSERT、UPDATE、DELETE)时,修改的数据页首先在缓冲池中进行,之后通过后台线程刷到磁盘。刷盘的性能直接影响到数据库的I/O负载和整体性能。 接下来,用户需要监控这个刷盘速度。根据已有的知识,MySQL的Performance Schema提供了很多监控指标。比如,在Performance Schema中,可以查看与InnoDB缓冲池相关的状态变,例如Innodb_buffer_pool_pages_flushed,这个变记录了从缓冲池刷新到磁盘的页数。通过定期查询这个变的变化,可以计算出刷盘的速度。 另外,用户可能需要关注InnoDB的I/O性能。Performance Schema中的表如innodb_metrics和status变可能包含相关的信息。例如,使用SHOW GLOBAL STATUS LIKE 'Innodb_%';可以查看各种InnoDB的状态变,包括刷盘次数和I/O操作的情况。 此外,用户提到的引用中有提到performance_schema.clone_status,虽然这和克隆操作相关,但说明用户可能已经了解如何查询Performance Schema中的表。需要引导用户正确使用相关的表和变。 另外,自适应哈希索引(Adaptive Hash Index)和聚集索引(Clustered Index)虽然重要,但可能和刷盘速度的直接监控关系不大,不过InnoDB的整体性能优化可能会间接影响刷盘效率。 可能的监控步骤包括: 1. 使用SHOW GLOBAL STATUS获取Innodb_buffer_pool_pages_flushed的当前值,间隔一段时间再次获取,计算差值得到刷盘次数,再除以时间得到速度。 2. 查询Performance Schema中的表,比如innodb_metrics,寻找与flush相关的指标。 3. 监控磁盘I/O,使用操作系统工具如iostat或MySQL自带的I/O监控指标,结合刷盘次数来评估速度。 还需要考虑配置参数,如innodb_io_capacity和innodb_flush_method,这些参数会影响刷盘的速度和行为,调整这些参数可能优化性能,但用户当前的问题主要是监控。 最后,要确保用户理解这些监控方法的具体操作,比如如何执行SQL语句查询状态变,如何计算速度,以及如何解读结果。可能需要给出具体的SQL示例和计算方式,帮助用户实际应用。</think>### MySQL DML刷盘速度监控方法 要监控MySQL执行大DML操作时的刷盘速度,需结合**Performance Schema**和**InnoDB状态变**实现。以下是具体步骤: --- #### 1. **监控InnoDB缓冲池刷盘次数** 通过`Innodb_buffer_pool_pages_flushed`状态变统计刷盘次数,计算单位时间内的刷盘速度: ```sql -- 初始值 SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_flushed'; -- 间隔T秒后再次查询,计算差值 SELECT (VALUE_AFTER - VALUE_BEFORE) / T AS flush_pages_per_second; ``` 此指标反映缓冲池每秒刷新的数据页数,间接体现DML刷盘速度[^3]。 --- #### 2. **使用Performance Schema监控I/O操作** 启用Performance Schema的InnoDB I/O事件监控: ```sql -- 查看与刷盘相关的I/O事件统计 SELECT * FROM performance_schema.file_summary_by_event_name WHERE EVENT_NAME LIKE '%innodb%flush%'; ``` 重点关注`COUNT_WRITE`和`SUM_TIMER_WAIT`字段,分析写入频率和耗时[^2]。 --- #### 3. **操作系统级磁盘I/O监控** 通过系统工具(如`iostat`)观察磁盘吞吐: ```bash iostat -dx 1 # 每秒输出磁盘I/O统计 ``` 结合MySQL刷盘次数与磁盘写入,可验证刷盘是否成为瓶颈。 --- #### 4. **配置参数对刷盘速度的影响** 检查以下关键参数: - `innodb_io_capacity`: 控制每秒最大I/O操作数。 - `innodb_flush_log_at_trx_commit`: 事务提交时日志刷盘策略。 - `innodb_flush_method`: 刷盘方法(如`O_DIRECT`可减少OS缓存影响)。 --- #### 5. **示例:实时计算刷盘速度** ```sql -- 第一次查询 SET @start_flush = ( SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_flushed' ); -- 等待10秒 SELECT SLEEP(10); -- 第二次查询并计算 SELECT (VARIABLE_VALUE - @start_flush) / 10 AS avg_flush_pages_per_sec FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_flushed'; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值