`
丁林.tb
  • 浏览: 797222 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

InnoDB中dict_update_statistics调用策略及问题

阅读更多

背景

         为了提供优化器支持,InnoDB维护了每个表的索引统计信息(index statistics)。在之前的一篇文章中作过介绍。

         文章里面介绍到索引统计信息有几个更新策略,并建议允许关闭动态更新。顺便提及,5.6已经提供了Persistent Statistics 选项,达到相同的目的。

         5.5版本还是必须动态更新。本文介绍在动态更新时的一个问题。

 

索引统计的动态更新策略

         这个策略是比较简单的。每个表维护一个stat_modified_counter每次增、删、改一行时加1,当counter满足一下两个条件之一时,则进行依次动态统计,之后清0 5.5.29

1)             1) counter > 2000000000

2)             2) counter > 16 + table->stat_n_rows / 16

table->stat_n_rows表的总行数目(估计值)

 

row_update_statistics_if_needed(

/*============================*/

        dict_table_t*   table)  /*!< in: table */

{

        ulint   counter;

 

        counter = table->stat_modified_counter;

        table->stat_modified_counter = counter + 1;

 

        if (counter > 2000000000

            || ((ib_int64_t)counter > 16 + table->stat_n_rows / 16)) {

 

                dict_update_statistics(table, FALSE /* update even if stats

                                                    are initialized */);

        }   

 

执行索引统计的函数是dict_update_statistics,在执行统计期间,对stat加一个x锁。

 

存在问题

由于这个值不要求精确,因此在counter更新时并未加锁。这个问题并不大,但是未加锁导致另外一个问题:短时间内多次调用dict_update_statistics

         stat_modified_counter0是在dict_update_statistics中调用的,但若有多个线程同时判断后进入dict_update_statistics,则会导致多次调用。

         在一个测试场景我们从现场看到同一个时刻用11个用户线程调用dict_update_statistics。这意味着至少多调用了10次索引统计。而索引统计的方法是通过从表中取样本估算的,如果表数据较多,这个索引统计的浪费就很明显了。对查询和更新性能都会有影响。

 

简单修改

         dict_update_statistics的逻辑流程是

1)             1) x

2)             2) 索引统计

3)             3) stat_modified_counter 0

4)             4) 解锁

 

简单修改可以在加x锁之后再次判断stat_modified_counter是否需要进行索引统计,若不需要则解锁返回即可。

5.6已经提供了Persistent Statistics 选项,但若关闭,也会有这个问题。

 

0
0
分享到:
评论

相关推荐

    py_innodb_page_info工具

    总的来说,`py_innodb_page_info`是MySQL数据库管理员和开发者的得力助手,它提供了深入理解InnoDB存储引擎内部运作的工具,使我们能够更好地调试问题、优化性能和设计更高效的数据模型。通过学习和使用这个工具,...

    py_innodb_page_info.zip

    《MySQL技术内幕-InnoDB存储引擎》是一本深入探讨MySQL数据库InnoDB存储引擎的权威书籍,而`py_innodb_page_info.zip`则是该书中提到的一个实用工具,用于分析InnoDB存储引擎的数据页信息。这个Python工具帮助我们...

    使用innodb_force_recovery解决MySQL崩溃无法重启问题

    在设置这个参数后,应该尽快备份或导出所有重要数据,然后关闭MySQL服务,修复底层问题,最后清除`innodb_force_recovery`,按照常规流程重新启动数据库。如果可能,最好在测试环境中先验证这种方法,避免在生产环境...

    py_innodb_page_info工具类 包含python2,python3两个版本

    py_innodb_page_info工具为《INNODB存储引擎》作者姜承尧写的。 该工具用来分析表空间中的各页得类型和信息,用python编写。 网上多是python2版本的,这里给出python3版本的。

    py_innodb_page_info.py

    在实际操作中,`py_innodb_page_info.py`通常需要与`mysqldump`或`mysqlbinlog`结合使用,获取数据库的二进制日志或转储文件。这些文件包含了InnoDB存储引擎的原始页面数据,工具通过解析这些数据,提供了一种可视化...

    MySQL Innodb 参数详解与优化实践

    如果设置为空字符串,可以在`innodb_data_file_path`中指定绝对路径。 - **应用场景**:适用于需要自定义InnoDB表空间存放位置的情况,例如分离存储以提高性能或简化管理。 ##### 2. `innodb_data_file_path` - **...

    MySQL修改innodb_data_file_path参数的一些注意事项

    innodb_data_file_path用来指定innodb tablespace文件,如果我们不在My.cnf文件中指定innodb_data_home_dir和innodb_data_file_path那么默认会在datadir目录下创建ibdata1 作为innodb tablespace。 说明 在测试环境...

    InnoDB_Log_Structures

    - `innodb_log_files_in_group`:日志组中重做日志文件的数量。 - `innodb_log_file_size`:每个重做日志文件的大小。 - `innodb_log_files_group`:用于指定日志组。 - `innodb_flush_log_at_trx_commit`:决定日志...

    MySQL技术InnoDB存储引擎_姜承尧_第2版

    此外,书中会讨论InnoDB的崩溃恢复、性能优化策略,如索引的使用、查询优化、事务处理的最佳实践等。读者还将了解到如何通过监控和分析工具来诊断和解决问题,提升数据库的稳定性和效率。 总而言之,《MySQL技术...

    浅析在线调整 innodb_buffer_pool_size

    在innodb存储引擎中数据访问以page为单位,page也是innodb管理数据库的最小磁盘单位,每个page的默认大小为16KB(可以通过参数innodb_page_size进行调整,在5.7增加了对32KB和64KB的大小支持,在此之前的版本支持4KB,...

    innodb_force_recovery.zip

    `innodb_force_recovery`是MySQL中的一个服务器系统变量,其目的是在InnoDB引擎遇到问题时,尽可能地让数据库启动并允许用户备份数据。该参数有6个不同的级别(0-5),每个级别代表一种更激进的恢复策略。随着级别的...

    MYSQL innodb性能优化学习总结

    - **innodb_file_per_table**:该参数控制InnoDB是否为每个表使用独立的数据表空间,建议设置为1,以避免共享表空间(ibdata1)可能带来的问题,例如难以进行数据库的备份和恢复。 - **innodb_stats_on_metadata**...

    InnoDB存储引擎中有页(Page)的概念

    InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小: mysql&gt; show variables like 'innodb_page_size'; 而系统一个磁盘块的...

    MySQL的Innodb引擎配置说明.txt

    内容包括: 1.MySQL的Innodb引擎配置 1.如何配置MySQL服务器的最大连接数量 2.如何配置innodb_open_files,table_open_cache,innodb_file_io_threads和innodb_buffer_pool_size,innodb_log_file_size

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    MySQL 数据库中的 `innodb_flush_log_at_trx_commit` 和 `sync_binlog` 是两个非常重要的配置参数,它们直接影响到数据库的性能与数据安全性。理解并合理设置这两个参数对于优化数据库系统至关重要。 首先,`innodb...

    mysql 5.6 新特性-innodb

    InnoDB 是 MySQL 最常用的存储引擎之一,在 MySQL 5.6 中得到了显著的增强,特别是在性能和功能方面。 ##### 性能优化 1. **Read-Only Transactions(只读事务)**: - **第一层优化**:通过区分只读事务与更新...

    关于MySQL innodb_autoinc_lock_mode介绍

    MySQL的InnoDB存储引擎在处理带有`auto_increment`列的表时,会受到`innodb_autoinc_lock_mode`参数的影响。这个参数决定了插入数据时如何管理自动递增锁,从而在性能和数据安全性(主从数据一致性)之间取得平衡。 ...

Global site tag (gtag.js) - Google Analytics