且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Icc编译MySQL性能调研(二)

更新时间:2022-09-29 12:53:10

SQL1(select customerd, customername, companyname, realcompanyname from tb_shifen_customerwhere urldomain like "%.cn" and status=3 and accountm>0 limit 10) union (select customerd, customername, companyname, realcompanyname from tb_shifen_customer where urldomain like "%.cn" and status in (1,4,6) and status=3 and accountm<=0 and invalidate>=date_sub(curdate(),interval ? day) limit 10) union (select customerd, customername, companyname, realcompanyname from tb_shifen_customer where urldomain like "%.cn" and status in (1,4,6) and accountm>0 limit 10) union (select customerd, customername, companyname, realcompanyname from tb_shifen_customer where urldomain like "%.cn" and status=2 limit 10);

 

SQL1

执行时间

Concurrency=1

Concurrency=10

Concurrency=100

Icc编译的mysql

36.01s

31.20s

162.78s

Gcc编译的mysql

41.02s

40.30s

181.83s

Icc较gcc的提升

12.6%

22.0%

10.5%

 

表8

SQL2select count(*) from tb_customer where urldomain like "%.cn";

 

 

SQL2

执行时间

Concurrency=1

Concurrency=10

Concurrency=100

Icc编译的mysql

0.014s

0.014s

0.029s

Gcc编译的mysql

0.026s

0.027s

0.035s

Icc较gcc的提升

41.2%

48.1%

17.1%

 

表9

SQL3select cust.cust_id,cust.cust_stat_1,cust.cust_stat_2,cust.cust_name, cust.cust_branch_name,cust.cust_input_type,cust.add_time,cust.cust_follow_num, cust.cust_trade_1,cust.cust_trade_2,dis.distribute_time from tb_customer cust left join tb_cust_distribute dis on cust.cust_id=dis.cust_id and dis.state=1 where cust.cust_id>0 and cust.cust_stat_1 in(8) and cust.pose_id=157 order by cust.cust_id desc limit 1170 , 15;


SQL2

执行时间

Concurrency=1

Concurrency=10

Concurrency=100

Icc编译的mysql

2.839s

3.631s

9.554s

Gcc编译的mysql

2.828s

3.740s

10.867s

Icc较gcc的提升

-0.3%

2.91%

12.1%

 

表10

上述3个类型的SQL是从测试库上执行的读操作中挑选出来的,相应的表的引擎改成了MyISAM引擎。这3个SQL涉及了扫表,索引扫描,排序等操作。从测试的结果上看,icc编译的mysql对MyISAM引擎读操作的优化效果明显。从执行时间上看(QPS)减少大概在10%-20%之间(QPS增加10%-20%)。

SQL4:update tb_cust_app tc left join (select count(distinct f.cust_id) num, follow_id from tb_follow_assignf, tb_customer c where f.cust_id=c.cust_id and c.cust_stat_1<>5 group by follow_id) tf on tc.user_id = tf.follow_id set tc.ownered_size=ifnull(tf.num,0) ;

 

SQL2

执行时间

Concurrency=1

Concurrency=10

Concurrency=100

Icc编译的mysql

31.279s

42.290s

342.80s

Gcc编译的mysql

33.274s

53.731s

566.374s

Icc较gcc的提升

6.0%

21.23%

39.5%

 

表11

SQL4同上一节的SQL3。在上一节InnoDB引擎下,icc编译的mysql对于此SQL在执行时间上明显慢于gcc编译的mysql,也主要是因为该SQL导致innodb全脚本测试icc编译的mysql慢于gcc编译的mysql。但是对于MyISAM引擎,从测试结果上看,icc编译的mysql明显优于gcc编译的mysql。从测试可以看出icc编译的mysql对MyISAM写操作也有优化效果,从执行时间上看(QPS)减少大概在10%-20%之间(QPS增加10%-20%)。

 

测试结论

从两个维度上总结测试结论:1存储引擎维度;2CPU,IO负载。

从存储引擎维度:对于MyISAM引擎,从sql-bench,mysqlslap使用某数据库数据测试结果上看,icc编译的mysql无论从读操作还是写操作都有优化效果,SQL执行时间平均减少10%-20%。对于一些比较消耗CPU的SQL(比如排序等,执行时间较长的SQL),在一定的并发下优化效果更明显。

对于InnoDB引擎,从sql-bench,mysqlslap使用全脚本测试结果上看,icc编译的mysql较gcc编译的mysql从QPS(SQL执行时间)没有优势,甚至是劣势。同时从sql-bench,全脚本中的逐个SQL分析来看:对于利用primary key或者全表扫描的SQL,icc编译的mysql有一些优化效果;对于利用辅助索引的SQL,icc编译的mysql在执行时间上比gcc编译的mysql慢。分析原因,InnoDB使用聚簇索引存储数据,利用辅助索引时,还需要走一遍primary key,这中间会有比较多的随机读等操作。

从IO,CPU负载维度:通过测试中对于资源的统计和对比,icc编译的mysql在用户态cpu开销上较gcc编译的mysql小(相差不大);在内核态cpu开销要比gcc编译的mysql多;在内存上开销上icc编译的mysql稍小。Icc对于CPU密集,IO负载不重的场景,优化效果明显;对于IO负载较重的场景,icc编译的mysql优化效果可能不明显。

综上所述:icc编译的mysql用于MyISAM引擎,较gcc编译的mysql优化效果明显。对于InnoDB引擎,使用辅助索引等操作,icc编译的mysql比gcc编译的mysql在执行时间上要慢,存在劣势。对于使用全表扫描、primary key的InnoDB操作,在低并发下,icc编译的mysql在执行时间上不会慢,在高并发下icc编译的mysql具有优势。同时业务类型是CPU密集型,而不是IO密集型,有助于发挥icc编译器的优化效果。

 

【本文首发于:百度运维空间http://hi.baidu.com/ops_bd/blog/item/30d0c5d06c69cecea044df2a.html
关注百度技术沙龙









本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/748545,如需转载请自行联系原作者