zoukankan      html  css  js  c++  java
  • MySQL 优化--持续整理

    一、innodb体系结构优化:

    1、IO优化

    IO能力不足时

    innodb_io_capacity 应该降低

    innodb_max_dirty_pages_pct 应该降低

    innodb_max_dirty_pages_pct_lwm 如果设置了应该考虑降低

    innodb_read_io_threads

    innodb_write_io_threads

    2、Purge Thread

    innodb_purge_threads   设置purge线程个数,用于undo页回收

    innodb_purge_batch_size   设置Purge undo 的页数量,默认300

    innodb_max_purge_lag       

    控制undo log history list的长度,0表示不对history list 做任何限制。当大于0时,就会

    延缓DML的操作。延缓对象是行。

    innodb_max_purge_lag_delay     用来控制delay的最大毫秒数。

    3、内存池buffer pool

    innodb_buffer_pool_size          内存池大小设置

    innodb_buffer_pool_instances  多内存池设置

    4、LRU List、Free List和Flush List

    innodb_old_blocks_pct       设置新页放到LRU List位置   mid位置

    innodb_old_blocks_time      mid位置后的页,要多久能被加入到LRU列表的热端

    5、Redo Log

    innodb_log_buffer_size        redo buffer 的大小

    三种情况刷新日志缓冲

    1)master thread 每秒刷

    2)事务提交时刷

    3)日志空间小于1/2刷

    6、Page Cleaner

    innodb_io_capacity  

    合并插入缓冲时,合并的数量为innodb_io_capacity的5%

    刷新脏页时,刷新的数量为innodb_io_capacity

    innodb_max_dirty_pages_pct

    innodb_max_dirty_pages_pct_lwm 

    innodb_adaptive_flushing  自适应刷新

    InnoDB刷新脏页的规则是在如下三种情况下才会把InnoDB_Buffer_Pool的脏页刷入磁盘:

    当超过innodb_max_dirty_pages_pct设定的值时。

    重做日志ib_logfile文件写满了以后。

    机器空闲的时候。

    当写操作很频繁的时候,重做日志ib_logfile切换的次数就会很频繁,只要有一个写满了,就会将脏页大批量地刷入磁盘,而这会对系统的整体性能造成不小的影响。为了避免过大的磁盘I/O,innodb_adaptive_flushing会自适应刷新,它使用了一个全新的算法,以便根据重做日志ib_logfile生成的速度和刷新频率来将脏页刷入磁盘,这样重做日志ib_logfile还没有写满时,也可以刷新一定的量。

    7、insert buffer(change buffer)

    innodb_change_buffering                 changebuffer 支持的类型 insert、update、delete等

    innodb_change_buffer_max_size     insert buffer 的大小,占innodb_buffer_pool的百分比(默认25%,最大50%)

    8、double write 两次写

    show status like 'innodb_dblwr%';

    如果Innodb_dblwr_pages_written:Innodb_dblwr_writes远小于64:1说明系统压力很小

     

    9、自适应哈希索引

    10、异步IO(AIO)

    innodb_use_native_aio    应打开异步IO

    用户发布一个IO请求后,可以立即再发出另一个IO请求,当全部IO请求发送完毕,等待所有

    IO操作完成。

    AIO还可以进行IO Merge 操作。

    11、刷新临近页

    innodb_flush_neighbors    根据系统IO能力调整,如果是IO处理能力和高,需要关闭

    12、

    二、索引优化:

    1、打开Multi-Range Read功能(5.6新功能)

    它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO,提高查询效率。

    1)打开

    set optimizer_switch='mrr=on mrr_cost_based=on'; #mrr_cost_based表示开启mrr后,优化器是否根据cost来决定是否使用mrr

    set oprimizer_switch='mrr=off';

    2)MRR内存设置

    对于MRR,参数read_rnd_buffer_size用来控制键值缓冲区的大小。

    2、打开Index Condition Pushdown功能(5.6新功能)

    set optimizer_switch = 'index_condition_pushdown=off';

    set optimizer_switch = 'index_condition_pushdown=on';

    2、Index Condition Pushdown(ICP)

    Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法。
    ICP(index condition pushdown)是mysql利用索引(二级索引)元组和筛字段在索引中的where条件从表中提取数据记录的一种优化操作。ICP的思想是:存储引擎在访问索引的时候检查筛选字段在索引中的where条件(pushed index condition,推送的索引条件),如果索引元组中的数据不满足推送的索引条件,那么就过滤掉该条数据记录。ICP(优化器)尽可能的把index condition的处理从server层下推到storage engine层。storage engine使用索引过过滤不相关的数据,仅返回符合index condition条件的数据给server层。也是说数据过滤尽可能在storage engine层进行,而不是返回所有数据给server层,然后后再根据where条件进行过滤。
    三、文件
    1、binlong(二进制日志)
    首先,我们知道在MySQL中,二进制日志是server层的
    max_binlog_size                binlog最大值,默认1G
    binlog_cache_size             binlog缓存大小,默认32K,基于绘画的参数
    查看binglog_cache设置是否合理

    sync_binlog

    sync_binlog=1,表示提交一次写一次binlog。

    当一个事务发出commit动作之前,由于sync_binlog=1,因此会将二进制日志立即写入磁盘。

    如果这时已经写入了二进制日志,但是提交没有发生,并且此事发生了宕机,那么在Mysql

    数据库下次启动时,由于commit操作并没有发生,这个事务会被回滚掉。但是,二进制日志

    已经记录了该事务信息,不能被回滚。这个问题由参数innodb_support_xa 来解决,

    innodb_support_xa= 1 保证二进制日志和InnoDB 存储引擎数据文件同步。

    binlog-do-db/binlog-ignore-db

    log-slave-update

    binlog_format

    expire_logs_days

    innodb_support_xa = 1 保证二进制日志和InnoDB 存储引擎数据文件同步
     
    四、表优化
     
  • 相关阅读:
    计算机的运算方法
    干货 Elasticsearch 知识点整理 一
    深入理解 Spring finishBeanFactoryInitialization
    Git 学习笔记
    深入理解 Mybatis
    深入理解 MyBatis 启动流程
    MyBatis 开发手册
    深入理解SpringMvc 启动流程
    深度长文回顾web基础组件
    快速排序
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/10796146.html
Copyright © 2011-2022 走看看