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)。
测试代码使用单条事物循环,事物内容仅仅是向用户表中插入一行记录。

解决方案 »

  1.   

    自动提交开启innodb_flush_log_at_trx_commit=1C 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);
      

  2.   

    自动提交开启innodb_flush_log_at_trx_commit=1C 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);
      

  3.   

    建议你先把 innodb_flush_log_at_trx_commit 的几个值的含义弄清楚。
      

  4.   

    auto_flush_log_at_trx_commit
    =0:关闭日志硬盘写入
    =1:每条事物日志都写入硬盘后才返回
    =2延缓日志硬盘写入但是,设置为2和0的确可以提高性能,但是会存在安全隐患啊。可能因为日志没有及时的写入硬盘,儿造成数据库损坏的无法恢复。
      

  5.   

    设置成0和2都是不安全的,违反安全逻辑的啊。但是设置成1,却只有30TPS。
      

  6.   

    估计是免费的和商业的产品之间的差别了。免费是MYSQL最大的优势。 选择MYSQL后再选择 innodb则是需要事务的支持。否则可以用 myisam
      

  7.   

    这么低确实有问题,我记得我用tpcc从来没跑出过这么低的数值。
    要不你试试找个Linux装个tpcc,然后把你的windows数据库压一下看看。
    这个配置Linux,我记得用tpcc测试400-500还是能跑到的,那个事务可比你这个复杂多了,可以百度一下tpcc。
    是不是环境不够干净
      

  8.   


    换了几台机器都是这个样子。mysql是5.6.22.0,绿色版,安装版的都试过了。linux上如果能跑400~500TPS,那比mssql还是低了点儿啊。另外,看到mssql有checkpoint和lazy writer,负责将日志写入磁盘的,用的好像是线程,当触发特定事件,比如日志队列缓冲区已满或者是退出数据库等等,会写数据,那么innodb是否是每一次都会等待日志写入磁盘完成才返回呢,如果是这样,那微软的SQL Server岂不是有安全问题,比如在日志队列中的日志还没写入系统的时候,突然断电,日志没有持久化,这个怎么解决的呢?
      

  9.   


    换了几台机器都是这个样子。mysql是5.6.22.0,绿色版,安装版的都试过了。linux上如果能跑400~500TPS,那比mssql还是低了点儿啊。另外,看到mssql有checkpoint和lazy writer,负责将日志写入磁盘的,用的好像是线程,当触发特定事件,比如日志队列缓冲区已满或者是退出数据库等等,会写数据,那么innodb是否是每一次都会等待日志写入磁盘完成才返回呢,如果是这样,那微软的SQL Server岂不是有安全问题,比如在日志队列中的日志还没写入系统的时候,突然断电,日志没有持久化,这个怎么解决的呢?

    对SQL Server没有研究,不知道怎么样。InnoDB什么时候写日志是你自己配的,比如每次事务结束或者写到系统缓存由系统缓存刷入,再底层的知识我也不了解。
      

  10.   

    大家平时对innodb_auto_flush_at_trx_commit这个参数怎么配置的呢?
      

  11.   

    innodb_auto_flush_at_trx_commit 配置为2 除非你对数据准确性要求非常高
      

  12.   

    刚去查了资料,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并非是实时写入的???困惑!!!
      

  13.   

    SQL server 与 windows 是在底层上就结合的。而MYSQL则必须通过WINDOWS OD 层提供的API接口进行操作。
      

  14.   

    那mysql在linux上,每秒钟的事物处理量也只有几百啊,但是SQL Server每秒钟可以达到5000多(在我的机器上:CPU I5 3230M 2.6ghz RAM 4G 硬盘5400转),那么那么即使在linux上,每秒事物处理量也没有SQL Server快啊。为什么吧SQL Server和linux的REDO LOG都实时FLUSH到硬盘,可为什么会有这么大的差距呢?我的意思是分别在他们各自擅长的Windows和linux平台上跑,还是会有这么大的差距呢?
      

  15.   

    我在云服务器上试了下,centos单核CPU2.6ghz,2G内存,mysql5.6,结果是一秒钟3000次左右。和在Windows上的差距太大了。
      

  16.   

    0不是关闭硬盘写入,而是硬盘写入由操作系统决定。也就是说MySQL把写入硬盘的日志发给操作系统缓冲区,并不等待操作系统操作成功,但操作系统一般都是能操作成功的,除非操作系统和硬盘出错,不然不会失败。
    2是每次日志写入MySQL缓冲区,MySQL缓决区再向硬盘上批量写。除非MySQL服务挂掉,否则不会失败。所以0是操作系统级的成功,失败一次丢的是一批,2是MySQL服务级成功,失败也是丢一批,1是每条成功,失败丢一条。