求救,InnoDB的性能疑问

槐荫飞龙 2015-01-08 10:37:41
InnoDB每秒开启自动提交的情况下,每秒处理事务数只有30/s
Sql Server却有2500/s。

1、网上有人说,InnoDB慢的主要原因是实时写入日志到硬盘导致的,建议修改innodb_flush_log_at_trx_commit=2,但是如此一来日志就不能实施写入,带来一定的隐患。儿SQL Server在实时写入日志的情况下却能达到2500/s的事务处理能力。这究竟是什么情况,是因为在Windows上运行mysql的原因吗?请教大家了!

2、如果MYSQL的InnoDB每秒中完成事务的TPS如此低,那选择InnoDB的理由又是什么呢?它又相比SQL Server有什么样的优势呢?

3、在2.6gHZ双核的CPU上,4G内存,5400转硬盘,InnoDB在linux上的TPS能达到多少呢?

坐等大家解答啊!搞了几天了,无果!!!

附:测试说明
一个包含三个字段的表,用户ID,用户名,用户密码,用户ID自增、主键,用户名和密码mysql下varchar(16),SQL Server下nvarchar(16)。
测试代码使用单条事物循环,事物内容仅仅是向用户表中插入一行记录。
...全文
314 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
商科程序员 2015-01-12
  • 打赏
  • 举报
回复
引用 5 楼 huaiyinfeilong 的回复:
auto_flush_log_at_trx_commit =0:关闭日志硬盘写入 =1:每条事物日志都写入硬盘后才返回 =2延缓日志硬盘写入 但是,设置为2和0的确可以提高性能,但是会存在安全隐患啊。可能因为日志没有及时的写入硬盘,儿造成数据库损坏的无法恢复。
0不是关闭硬盘写入,而是硬盘写入由操作系统决定。也就是说MySQL把写入硬盘的日志发给操作系统缓冲区,并不等待操作系统操作成功,但操作系统一般都是能操作成功的,除非操作系统和硬盘出错,不然不会失败。 2是每次日志写入MySQL缓冲区,MySQL缓决区再向硬盘上批量写。除非MySQL服务挂掉,否则不会失败。 所以0是操作系统级的成功,失败一次丢的是一批,2是MySQL服务级成功,失败也是丢一批,1是每条成功,失败丢一条。
槐荫飞龙 2015-01-11
  • 打赏
  • 举报
回复
我在云服务器上试了下,centos单核CPU2.6ghz,2G内存,mysql5.6,结果是一秒钟3000次左右。和在Windows上的差距太大了。
槐荫飞龙 2015-01-09
  • 打赏
  • 举报
回复
引用 15 楼 ACMAIN_CHM 的回复:
SQL server 与 windows 是在底层上就结合的。而MYSQL则必须通过WINDOWS OD 层提供的API接口进行操作。
那mysql在linux上,每秒钟的事物处理量也只有几百啊,但是SQL Server每秒钟可以达到5000多(在我的机器上:CPU I5 3230M 2.6ghz RAM 4G 硬盘5400转),那么那么即使在linux上,每秒事物处理量也没有SQL Server快啊。为什么吧SQL Server和linux的REDO LOG都实时FLUSH到硬盘,可为什么会有这么大的差距呢?我的意思是分别在他们各自擅长的Windows和linux平台上跑,还是会有这么大的差距呢?
ACMAIN_CHM 2015-01-09
  • 打赏
  • 举报
回复
SQL server 与 windows 是在底层上就结合的。而MYSQL则必须通过WINDOWS OD 层提供的API接口进行操作。
槐荫飞龙 2015-01-09
  • 打赏
  • 举报
回复
刚去查了资料,SQL Server的write-aheader transaction log默认是开启的,而且应该是类似于innodb_flush_at_trx_commit=1。在这种情况下,SQL Server的TPS可以达到2500左右,但MYSQL在linux下,设置了innodb_flush_at_trx_commit=1却只能达到几百次(我这里是30多次),这个性能差距真的会有这么大吗?会不会是SQL Server并非是实时写入的???困惑!!!
槐荫飞龙 2015-01-08
  • 打赏
  • 举报
回复
自动提交开启 innodb_flush_log_at_trx_commit=1 C code: lock_t begin_time = lock(); for (int i = 0; i < 100; ++i) { mysql_query(mysql_handle, "begin; insert into user(username, password) values('admin', '1234qwer4321rewq'); commit;"); } lock_t end_time = lock(); double (end_time-begin_time)/1000.00; printf("const time: %.3lf seconds.\n", const_time);
槐荫飞龙 2015-01-08
  • 打赏
  • 举报
回复
自动提交开启 innodb_flush_log_at_trx_commit=1 C code: lock_t begin_time = lock(); for (int i = 0; i < 100; ++i) { mysql_query(mysql_handle, "begin; insert into user(username, password) values('admin', '1234qwer4321rewq'); commit;"); } lock_t end_time = lock(); double (end_time-begin_time)/1000.00; printf("const time: %.3lf seconds.\n", const_time);
benluobo 2015-01-08
  • 打赏
  • 举报
回复
每秒处理事务数只有30/s 这个是怎么测试出来的?
benluobo 2015-01-08
  • 打赏
  • 举报
回复
innodb_auto_flush_at_trx_commit 配置为2 除非你对数据准确性要求非常高
槐荫飞龙 2015-01-08
  • 打赏
  • 举报
回复
大家平时对innodb_auto_flush_at_trx_commit这个参数怎么配置的呢?
zhu19774279 2015-01-08
  • 打赏
  • 举报
回复
引用 10 楼 huaiyinfeilong 的回复:
[quote=引用 9 楼 zhu19774279 的回复:] 这么低确实有问题,我记得我用tpcc从来没跑出过这么低的数值。 要不你试试找个Linux装个tpcc,然后把你的windows数据库压一下看看。 这个配置Linux,我记得用tpcc测试400-500还是能跑到的,那个事务可比你这个复杂多了,可以百度一下tpcc。 是不是环境不够干净
换了几台机器都是这个样子。mysql是5.6.22.0,绿色版,安装版的都试过了。linux上如果能跑400~500TPS,那比mssql还是低了点儿啊。另外,看到mssql有checkpoint和lazy writer,负责将日志写入磁盘的,用的好像是线程,当触发特定事件,比如日志队列缓冲区已满或者是退出数据库等等,会写数据,那么innodb是否是每一次都会等待日志写入磁盘完成才返回呢,如果是这样,那微软的SQL Server岂不是有安全问题,比如在日志队列中的日志还没写入系统的时候,突然断电,日志没有持久化,这个怎么解决的呢? [/quote] 对SQL Server没有研究,不知道怎么样。InnoDB什么时候写日志是你自己配的,比如每次事务结束或者写到系统缓存由系统缓存刷入,再底层的知识我也不了解。
槐荫飞龙 2015-01-08
  • 打赏
  • 举报
回复
引用 9 楼 zhu19774279 的回复:
这么低确实有问题,我记得我用tpcc从来没跑出过这么低的数值。 要不你试试找个Linux装个tpcc,然后把你的windows数据库压一下看看。 这个配置Linux,我记得用tpcc测试400-500还是能跑到的,那个事务可比你这个复杂多了,可以百度一下tpcc。 是不是环境不够干净
换了几台机器都是这个样子。mysql是5.6.22.0,绿色版,安装版的都试过了。linux上如果能跑400~500TPS,那比mssql还是低了点儿啊。另外,看到mssql有checkpoint和lazy writer,负责将日志写入磁盘的,用的好像是线程,当触发特定事件,比如日志队列缓冲区已满或者是退出数据库等等,会写数据,那么innodb是否是每一次都会等待日志写入磁盘完成才返回呢,如果是这样,那微软的SQL Server岂不是有安全问题,比如在日志队列中的日志还没写入系统的时候,突然断电,日志没有持久化,这个怎么解决的呢?
zhu19774279 2015-01-08
  • 打赏
  • 举报
回复
这么低确实有问题,我记得我用tpcc从来没跑出过这么低的数值。 要不你试试找个Linux装个tpcc,然后把你的windows数据库压一下看看。 这个配置Linux,我记得用tpcc测试400-500还是能跑到的,那个事务可比你这个复杂多了,可以百度一下tpcc。 是不是环境不够干净
dujie4752041 2015-01-08
  • 打赏
  • 举报
回复
引用 7 楼 ACMAIN_CHM 的回复:
引用
1、网上有人说,InnoDB慢的主要原因是实时写入日志到硬盘导致的,建议修改innodb_flush_log_at_trx_commit=2,但是如此一来日志就不能实施写入,带来一定的隐患。儿SQL Server在实时写入日志的情况下却能达到2500/s的事务处理能力。这究竟是什么情况,是因为在Windows上运行mysql的原因吗?请教大家了!
估计是免费的和商业的产品之间的差别了。
引用
2、如果MYSQL的InnoDB每秒中完成事务的TPS如此低,那选择InnoDB的理由又是什么呢?它又相比SQL Server有什么样的优势呢?
免费是MYSQL最大的优势。 选择MYSQL后再选择 innodb则是需要事务的支持。否则可以用 myisam
楼上说的在理, 最简单的理解, 一个免费, 一个要钱.. 又想马儿跑的好, 又让马儿不吃草, 哪里来的道理呢?
ACMAIN_CHM 2015-01-08
  • 打赏
  • 举报
回复
引用
1、网上有人说,InnoDB慢的主要原因是实时写入日志到硬盘导致的,建议修改innodb_flush_log_at_trx_commit=2,但是如此一来日志就不能实施写入,带来一定的隐患。儿SQL Server在实时写入日志的情况下却能达到2500/s的事务处理能力。这究竟是什么情况,是因为在Windows上运行mysql的原因吗?请教大家了!
估计是免费的和商业的产品之间的差别了。
引用
2、如果MYSQL的InnoDB每秒中完成事务的TPS如此低,那选择InnoDB的理由又是什么呢?它又相比SQL Server有什么样的优势呢?
免费是MYSQL最大的优势。 选择MYSQL后再选择 innodb则是需要事务的支持。否则可以用 myisam
槐荫飞龙 2015-01-08
  • 打赏
  • 举报
回复
设置成0和2都是不安全的,违反安全逻辑的啊。但是设置成1,却只有30TPS。
槐荫飞龙 2015-01-08
  • 打赏
  • 举报
回复
auto_flush_log_at_trx_commit =0:关闭日志硬盘写入 =1:每条事物日志都写入硬盘后才返回 =2延缓日志硬盘写入 但是,设置为2和0的确可以提高性能,但是会存在安全隐患啊。可能因为日志没有及时的写入硬盘,儿造成数据库损坏的无法恢复。
商科程序员 2015-01-08
  • 打赏
  • 举报
回复
建议你先把 innodb_flush_log_at_trx_commit 的几个值的含义弄清楚。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧