全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

innodb_flush_method取值方法(实例讲解)

innodb_flush_method的几个典型取值

fsync: InnoDB uses the fsync() system call to flush both the data and log files. fsync is the default setting.

O_DSYNC: InnoDB uses O_SYNC to open and flush the log files, and fsync() to flush the data files. InnoDB does not use O_DSYNC directly because there have been problems with it on many varieties of Unix.

O_DIRECT: InnoDB uses O_DIRECT (or directio() on Solaris) to open the data files, and uses fsync() to flush both the data and log files. This option is available on some GNU/Linux versions,FreeBSD, and Solaris.

如何取值,mysql官方文档是这么建议的

How each settings affects performance depends on hardware configuration and workload. Benchmark
your particular configuration to decide which setting to use, or whether to keep the default setting.
Examine the Innodb_data_fsyncs status variable to see the overall number of fsync() calls for
each setting. The mix of read and write operations in your workload can affect how a setting performs.
For example, on a system with a hardware RAID controller and battery-backed write cache, O_DIRECT
can help to avoid double buffering between the InnoDB buffer pool and the operating system's file
system cache. On some systems where InnoDB data and log files are located on a SAN, the default
value or O_DSYNC might be faster for a read-heavy workload with mostly SELECT statements. Always
test this parameter with hardware and workload that reflect your production environment

也就是说,具体的取值跟硬件配置和工作负载相关,最好做一次压测来决定。不过通常来说,linux环境下具有raid控制器和write-back写策略,o_direct是比较好的选择;如果存储介质是SAN,那么使用默认fsync或者osync或许更好一些。

通常来说,貌似绝大部分人都取值o_direct,底层有raid卡,读写策略设置为write-back。在使用sysbench压测oltp类型时,我发现o_direct确实比fsync性能优秀一些,看来适用于大部分场景,但是最近碰到一个这样的sql,客户反馈很慢,而在相同内存的情况下,它自己搭建的云主机执行相对快很多,后来我发现主要就是innodb_flush_method的设置值不同带来的巨大性能差异。

测试场景1

innodb_flush_method为默认值,即fsync,缓存池512M,表数据量1.2G,排除缓存池影响,稳定后的结果

mysql> show variables like '%innodb_flush_me%';
+---------------------+-------+
| Variable_name    | Value |
+---------------------+-------+
| innodb_flush_method |    |
+---------------------+-------+
1 row in set (0.00 sec)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(outcome)-SUM(income) |
+--------------------------+
|        -191010.51 |
+--------------------------+
1 row in set (1.22 sec)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(outcome)-SUM(income) |
+--------------------------+
|        -191010.51 |
+--------------------------+
1 row in set (1.22 sec)
mysql> explain SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+
| id | select_type | table  | type | possible_keys | key    | key_len | ref  | rows  | Extra         |
+----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+
| 1 | SIMPLE   | journal | ref | account_id  | account_id | 62   | const | 161638 | Using index condition |
+----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+
1 row in set (0.03 sec)

测试场景2

innodb_flush_method改为o_direct,排除缓存池影响,稳定后的结果

mysql> show variables like '%innodb_flush_me%';
+---------------------+----------+
| Variable_name    | Value  |
+---------------------+----------+
| innodb_flush_method | O_DIRECT |
+---------------------+----------+
1 row in set (0.00 sec)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(outcome)-SUM(income) |
+--------------------------+
|        -191010.51 |
+--------------------------+
1 row in set (3.22 sec)


mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+--------------------------+
| SUM(outcome)-SUM(income) |
+--------------------------+
|        -191010.51 |
+--------------------------+
1 row in set (3.02 sec)


mysql> explain SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main';
+----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+
| id | select_type | table  | type | possible_keys | key    | key_len | ref  | rows  | Extra         |
+----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+
| 1 | SIMPLE   | journal | ref | account_id  | account_id | 62   | const | 161638 | Using index condition |
+----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+
1 row in set (0.00 sec)

结果比较:

两者执行计划一摸一样,性能却差距很大。在数据库第一次启动时的查询结果也差距很大,o_direct也差很多(测试结果略)。不是很懂为啥这种情况下多了一层操作系统缓存,读取效率就高了很多,生产环境设置一定要以压测结果为准,实际效果为准,不能盲目信任经验值。

改进措施:

不改变innodb_flush_method的情况下,其实这条sql还可以进一步优化,通过添加组合索引(account_id,outcome,income),使得走覆盖索引扫描,可大大地减少响应时间

以上这篇innodb_flush_method取值方法(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# innodb  # flush  # method  # 给大家  # 情况下  # 几个  # 我发现  # 还可以  # 而在  # 适用于  # 不是很  # 这条  # 希望能  # 比较好  # 经验值  # 这篇  # 设置为  # 高了  # 查询结果  # 很慢  # 小编  # 启动时  # 大家多多 


相关文章: 建站之星手机一键生成:多端自适应+小程序开发快速建站指南  微信推文制作网站有哪些,怎么做微信推文,急?  XML的“混合内容”是什么 怎么用DTD或XSD定义  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何快速搭建FTP站点实现文件共享?  如何获取上海专业网站定制建站电话?  javascript中对象的定义、使用以及对象和原型链操作小结  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  名字制作网站免费,所有小说网站的名字?  如何选择适配移动端的WAP自助建站平台?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何正确选择百度移动适配建站域名?  网站制作话术技巧,网站推广做的好怎么话术?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  如何构建满足综合性能需求的优质建站方案?  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  建站之星如何助力网站排名飙升?揭秘高效技巧  详解jQuery停止动画——stop()方法的使用  网站制作模板下载什么软件,ppt模板免费下载网站?  *服务器网站为何频现安全漏洞?  招贴海报怎么做,什么是海报招贴?  ,制作一个手机app网站要多少钱?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  建站之星会员如何解锁更多建站功能?  视频网站制作教程,怎么样制作优酷网的小视频?  如何快速查询网址的建站时间与历史轨迹?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  如何选择PHP开源工具快速搭建网站?  宝塔面板如何快速创建新站点?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站主机核心功能解析:服务器选择与网站搭建流程指南  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何在宝塔面板中创建新站点?  如何访问已购建站主机并解决登录问题?  招商网站制作流程,网站招商广告语?  如何设置并定期更换建站之星安全管理员密码?  重庆市网站制作公司,重庆招聘网站哪个好?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站之星代理如何优化在线客服效率?  如何用y主机助手快速搭建网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  红河网站制作公司,红河事业单位身份证如何上传?  已有域名如何快速搭建专属网站?  教程网站设计制作软件,怎么创建自己的一个网站?  如何获取PHP WAP自助建站系统源码?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何在阿里云通过域名搭建网站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何在Ubuntu系统下快速搭建WordPress个人网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。