public?static?void?insert()?{?
//?开时时间?
Long?begin?=?new?Date().getTime();?
//?sql前缀?
String?prefix?=?"INSERT?INTO?tb_big_data?(count,?create_time,?random)?VALUES?";?
try?{?
//?保存sql后缀?
StringBuffer?suffix?=?new?StringBuffer();?
//?设置事务为非自动提交?
conn.setAutoCommit(false);?
//?Statement?st?=?conn.createStatement();?
//?比起st,pst会更好些?
PreparedStatement?pst?=?conn.prepareStatement("");?
//?外层循环,总提交事务次数?
for?(int?i?=?1;?i?=?100;?i++)?{?
//?第次提交步长?
for?(int?j?=?1;?j?=?10000;?j++)?{?
//?构建sql后缀?
suffix.append("("?+?j?*?i?+?",?SYSDATE(),?"?+?i?*?j?
*?Math.random()?+?"),");?
}?
//?构建完整sql?
String?sql?=?prefix?+?suffix.substring(0,?suffix.length()?-?1);?
//?添加执行sql?
pst.addBatch(sql);?
//?执行操作?
pst.executeBatch();?
//?提交事务?
conn.commit();?
//?清空上一次添加的数据?
suffix?=?new?StringBuffer();?
//?头等连接?
pst.close();?
conn.close();?
}?catch?(SQLException?e)?{?
e.printStackTrace();?
//?结束时间?
Long?end?=?new?Date().getTime();?
//?耗时?
System.out.println("cast?:?"?+?(end?-?begin)?/?1000?+?"?ms");?
}
Mysql的手册上说建议使用一个CONNECTION.
但是许多老手都是一般建议开了CONN用完一个就关.
你如果觉得有时间可以都时时.
你要速度快,我觉得先把MYSQL服务器设置的非常好再说吧.
毕竟你调用C的借口问题不会很大.
诊断思路
mpstat -P ALL 1,查看cpu使用情况,主要消耗在sys即os系统调用上
perf top,cpu主要消耗在_spin_lock
生成perf report查看详细情况
CPU主要消耗在mutex争用上,说明有锁热点.
采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上.
Pstack提供更详细的API调用栈
Innodb在读取数据记录时的API路径为
row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free.
而该表的记录更改很频繁,导致其undo history list比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存.
Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点.
当多条 SQL 并发执行时,会最终触发os层面的spinlock,导致上述情形.
解决方案
将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用.
修改my.cnf,添加如下参数并重启
[mysqld_safe]malloc-lib=tcmalloc
以下是修改前后cpu使用率对比
以上就是土嘎嘎小编为大家整理的mysql怎么写入频繁相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!