April 2013

[MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程

尽管Mariadb以及Facebook在long long time ago就fix掉了这个臭名昭著的问题,但官方直到 MySQL5.6 版本才Fix掉,本文主要关注三点: 1.MySQL 5.6的性能如何 2.在5.6中Group commit的三阶段实现流程   新参数 MySQL 5.6提供了两个参数来控制binlog group commit: binlog_max_flush_queue_time 单位为微妙,用于从flush队列中取事务的超时时间,这主要是防止并发事务过高,导致某些事务的RT上升。 可以阅读函数MYSQL_BIN_LOG::process_flush_stage_queue 来理解其功能   binlog_order_commits 当设置为0时,事务可能以和binlog不相同的顺序被提交,从下面的测试也可以看出,这会稍微提升点性能,但并不是特别明显.   性能测试 老规矩,先测试看看性能 sysbench, 全内存操作,5个sbtest表,每个表1000000行数据   基本配置: innodb_flush_log_at_trx_commit=1 table_open_cache_instances=5 metadata_locks_hash_instances = 32 metadata_locks_cache_size=2048 performance_schema_instrument = ‘%=on’ performance_schema=ON innodb_lru_scan_depth=8192 innodb_purge_threads = 4   关闭Performance Schema consumer: mysql> update setup_consumers set ENABLED = ‘NO’; […]

[MySQL 5.6] 5.6新参数 (完全版)

以下列出了MySQL 5.6的一些新参数 || 老参数新功能,有一些的说明只是参照的文档,还没有从代码求证。 这些参数的分类也显示了5.6在不同层面的改进(or regression?) 不定期更新Ing… ///////////////////////////////////////// Server 层参数 Table cache table_open_cache_instances #对table cache进行划分,减少table cache的锁竞争 Meta data lock metadata_locks_hash_instances  # 对server层的metalock hash进行划分 metadata_locks_cache_size   #metadata lock cache的大小,这是总的大小,可以适当调大来提升并发度 Slow_log log_throttle_queries_not_using_indexes  #当打开log_queries_not_using_indexes 时,该变量用于限制每分钟写入slow log的日志条数 控制项 default_tmp_storage_engine  #用于控制在创建临时表时使用的存储引擎,默认为innodb disconnect_on_expired_password #用于控制客户端如何处理失效的密码,默认打开 explicit_defaults_for_timestamp   #影响timestamp类型column的行为,具体见文档中的参数说明 host_cache_size  #存储host名字与iP的cache size ignore_db_dirs  #使用,分割,用于控制是否忽略DATA目录下的db目录 Server id server_uuid    #由系统自动生成的id,记录在data_dir/auto.cnf文件中,最好不要去尝试修改它 优化器 optimizer_switch  #用于控制优化器的行为,5.5也有该参数,但5.6能够控制更多的优化器行为,具体见文档 eq_range_index_dive_limit   #用于优化in(),以确认是否直接使用索引统计,在where条件中列的等值条件个数小于这个值时,使用index dive来估算行数,否则使用index statistics来估算;设置为0则禁用index statistics, […]

[MySQL 5.6] mysql 5.6 timestamp类型列的改变

在5.5及之前的版本中,timestamp列的行为比较特殊: * TIMESTAMP columns not explicitly declared with the NULL attribute are assigned the NOT NULL attribute. * The first TIMESTAMP column in a table, if not declared with the NULL attribute or an explicit DEFAULT or ON UPDATE clause, is automatically assigned the DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP attributes. * TIMESTAMP columns following […]

[MySQL 5.6] Innodb page cleaner线程刷新策略

这部分内容是从http://mysqllover.com/?p=512 剥离出来,原文中为了保持整洁,将这些内容删除。   有以下几个参数会影响到Page cleaner的行为:   innodb_lru_scan_depth innodb_adaptive_flushing_lwm innodb_max_dirty_pages_pct_lwm innodb_io_capacity_max innodb_flushing_avg_loops   在函数page_cleaner_flush_pages_if_needed中会确定三个影响刷脏页行为的变量 1.    根据redo log计算比例(pct_for_lsn),当小于innodb_adaptive_flushing_lwm时,pct_for_lsn值为0,当小于异步刷redo的比例(log_sys->max_modified_age_async)时且关闭选项innodb_adaptive_flushing时,pct_for_lsn也为0,否则,计算: ((innodb_io_capacity_max/innodb_io_capacity) *(lsn_age_factor * sqrt((double)lsn_age_factor)))/7.5 其中lsn_age_factor为当前的(redo比例*100)/max_modified_age_async 2.    根据脏页计算比例(pct_for_dirty),当innodb_max_dirty_pages_pct_lwm设置为0时,和以前的行为类似,如果脏页比例大于innodb_max_dirty_pages_pct时,pct_for_dirty设置为100,否则如果脏页比大于innodb_max_dirty_pages_pct_lwm,pct_for_dirty值为 (dirty_pct * 100)/( innodb_max_dirty_pages_pct+1) 3.    最近innodb_flushing_avg_loops次平均刷脏页的数量,同时还考虑上次统计时候的平均数量,再除以2 avg_page_rate= ((sum_pages / srv_flushing_avg_loops) + avg_page_rate) / 2 另外也会计算lsn的刷新速率 lsn_rate= (cur_lsn – prev_lsn) / srv_flushing_avg_loops; lsn_avg_rate= (lsn_avg_rate + lsn_rate) / 2;   然后根据上述两个值计算要刷新的page数: pct_total = ut_max(pct_for_dirty, pct_for_lsn); n_pages = (PCT_IO(pct_total) + […]

[MySQL 5.6] MySQL 5.6 online ddl 使用、测试及关键函数栈

本文主要分为三个部分,第一部分是看文档时的笔记;第二部分使用sysbench简单测试了下性能损耗;第三部分阐述了关键函数栈,但未做深入 前言 Online DDL是MySQL 5.6的重要特性之一,特别是对于不可间断的互联网服务而言意义非凡。尽管我们已经通过工具来实现了在线DDL,但由于借助了触发器来获取增量数据,很难保证不会触发BUG,我们在5.1版本上广泛使用了内部开发的myddl,曾经触发了mysql6个以上的bug。 Innodb允许你通过设置LOCK=EXCLUSIVE | SHARED | DEFAULT/NONE 来进行完全阻塞的DDL、只阻塞DML不阻塞查询、以及完全在线DDL,这有助于你能够在性能和速度之间进行权衡 以下是从官方文档拷贝的一张关于Online ddl对于当前ddl操作的支持: Operation In-Place? Copies Table? Allows Concurrent DML? Allows Concurrent Query? Notes CREATE INDEX,ADD INDEX Yes* No* Yes Yes Some restrictions for FULLTEXT index; see next row. Currently, the operation is not in-place (that is, it copies the table) if the same index being created […]