mysql中的预编译语句

来源:互联网 发布:多益网络客户端 编辑:程序博客网 时间:2024/06/05 02:35

在oracle中,都是强制开发使用绑定变量的,如果不使用绑定变量,那么系统没有扩展性,并发稍微多些后,cpu基本就满了,但是在mysql中还没有看到过说一定要使用绑定变量的说法,即使有使用绑定变量的说法也是从安全的角度去建议使用绑定变量。下面测试一下mysql中使用绑定变量和不使用绑定变量的条件下,对于cpu的消耗有哪些区别。
测试数据如下,在测试的过程中,100线程情况下,使用和不适用预编译消耗的cpu是差不多的,执行时间上,使用预编译的情况会好些,但是提升的效果不是很明显,可能是我的测试用例比较简单只有单个语句,3%的提升。
在500用户的测试情况下,cpu有接近10%的减少。时间上也是有3%的提升。

使用Statment耗时:138337donw使用Statment耗时:138872donw使用Statment耗时:139150donw使用Statment耗时:139139donw使用Statment耗时:139357donw使用Statment耗时:139369donw使用Statment耗时:139422donw使用Statment耗时:139460donw使用Statment耗时:139442donw使用Statment耗时:139529donw使用Statment耗时:139618donw使用Statment耗时:139698donw使用Statment耗时:139980donw使用Statment耗时:140000donw使用Statment耗时:140262donw使用Statment耗时:140316donw使用Statment耗时:140358donw使用Statment耗时:140359donw使用Statment耗时:140363donw使用Statment耗时:140362donw使用Statment耗时:140382donw使用Statment耗时:140407donw使用Statment耗时:140436donw使用Statment耗时:140475donw使用Statment耗时:140577donw使用Statment耗时:140599donw使用Statment耗时:140621donw使用Statment耗时:140612donw使用Statment耗时:140627donw使用Statment耗时:140676donw使用Statment耗时:140689donw使用Statment耗时:140678donw使用Statment耗时:140718donw使用Statment耗时:140717donw使用Statment耗时:140705donw使用Statment耗时:140847donw使用Statment耗时:140838donw使用Statment耗时:140847donw使用Statment耗时:140877donw使用Statment耗时:140858donw使用Statment耗时:140858donw使用Statment耗时:140944donw使用Statment耗时:140966donw使用Statment耗时:140948donw使用Statment耗时:140947donw使用Statment耗时:140975donw使用Statment耗时:140965donw使用Statment耗时:141001donw使用Statment耗时:141017donw使用Statment耗时:141037donw使用Statment耗时:141052donw使用Statment耗时:141068donw使用Statment耗时:141113donw使用Statment耗时:141178donw使用Statment耗时:141164donw使用Statment耗时:141186donw使用Statment耗时:141207donw使用Statment耗时:141264donw使用Statment耗时:141303donw使用Statment耗时:141380donw使用Statment耗时:141376donw使用Statment耗时:141391donw使用Statment耗时:141419donw使用Statment耗时:141392donw使用Statment耗时:141467donw使用Statment耗时:141515donw使用Statment耗时:141501donw使用Statment耗时:141517donw使用Statment耗时:141503donw使用Statment耗时:141522donw使用Statment耗时:141538donw使用Statment耗时:141639donw使用Statment耗时:141643donw使用Statment耗时:141662donw使用Statment耗时:141668donw使用Statment耗时:141754donw使用Statment耗时:141761donw使用Statment耗时:141782donw使用Statment耗时:141786donw使用Statment耗时:141789donw使用Statment耗时:141844donw使用Statment耗时:141853donw使用Statment耗时:141877donw使用Statment耗时:141889donw使用Statment耗时:141902donw使用Statment耗时:141997donw使用Statment耗时:142026donw使用Statment耗时:142190donw使用Statment耗时:142254donw使用Statment耗时:142280donw使用Statment耗时:142291donw使用Statment耗时:142380donw使用Statment耗时:142359donw使用Statment耗时:142470donw使用Statment耗时:142556donw使用Statment耗时:142562donw使用Statment耗时:142637donw使用Statment耗时:142714donw使用Statment耗时:142727donw使用Statment耗时:143405

使用预编译的情况

成功加载MySQL驱动程序使用prestment耗时:137333donw使用prestment耗时:137913donw使用prestment耗时:137943donw使用prestment耗时:137937donw使用prestment耗时:138191donw使用prestment耗时:138336donw使用prestment耗时:138362donw使用prestment耗时:138374donw使用prestment耗时:138411donw使用prestment耗时:138703donw使用prestment耗时:138889donw使用prestment耗时:138966donw使用prestment耗时:138972donw使用prestment耗时:138978donw使用prestment耗时:138961donw使用prestment耗时:138985donw使用prestment耗时:138980donw使用prestment耗时:139057donw使用prestment耗时:139040donw使用prestment耗时:139118donw使用prestment耗时:139153donw使用prestment耗时:139210donw使用prestment耗时:139228donw使用prestment耗时:139226donw使用prestment耗时:139309donw使用prestment耗时:139317donw使用prestment耗时:139431donw使用prestment耗时:139434donw使用prestment耗时:139558donw使用prestment耗时:139562donw使用prestment耗时:139556donw使用prestment耗时:139659donw使用prestment耗时:139661donw使用prestment耗时:139654donw使用prestment耗时:139726donw使用prestment耗时:139771donw使用prestment耗时:139826donw使用prestment耗时:139832donw使用prestment耗时:139850donw使用prestment耗时:139831donw使用prestment耗时:139876donw使用prestment耗时:139905donw使用prestment耗时:139914donw使用prestment耗时:139905donw使用prestment耗时:139916donw使用prestment耗时:139932donw使用prestment耗时:139929donw使用prestment耗时:139979donw使用prestment耗时:139991donw使用prestment耗时:140011donw使用prestment耗时:140007donw使用prestment耗时:140018donw使用prestment耗时:140111donw使用prestment耗时:140102donw使用prestment耗时:140108donw使用prestment耗时:140106donw使用prestment耗时:140102donw使用prestment耗时:140108donw使用prestment耗时:140119donw使用prestment耗时:140114donw使用prestment耗时:140119donw使用prestment耗时:140214donw使用prestment耗时:140236donw使用prestment耗时:140241donw使用prestment耗时:140213donw使用prestment耗时:140300donw使用prestment耗时:140300donw使用prestment耗时:140293donw使用prestment耗时:140305donw使用prestment耗时:140305donw使用prestment耗时:140301donw使用prestment耗时:140323donw使用prestment耗时:140318donw使用prestment耗时:140321donw使用prestment耗时:140403donw使用prestment耗时:140407donw使用prestment耗时:140409donw使用prestment耗时:140437donw使用prestment耗时:140452donw使用prestment耗时:140457donw使用prestment耗时:140501donw使用prestment耗时:140580donw使用prestment耗时:140647donw使用prestment耗时:140688donw使用prestment耗时:140718donw使用prestment耗时:140729donw使用prestment耗时:140735donw使用prestment耗时:140734donw使用prestment耗时:140904donw使用prestment耗时:140976donw使用prestment耗时:140970donw使用prestment耗时:141106donw使用prestment耗时:141183donw使用prestment耗时:141245donw使用prestment耗时:141255donw使用prestment耗时:141338donw使用prestment耗时:141414donw使用prestment耗时:141414donw使用prestment耗时:141866donw使用prestment耗时:141982

500并发的情况
无预编译的情况
cpu

03:02:14 PM 1893 5358 69.15 12.44 0.00 81.59 1 mysqld
03:02:16 PM 1893 5358 80.00 7.50 0.00 87.50 1 mysqld
03:02:19 PM 1893 5358 78.50 14.00 0.00 92.50 1 mysqld
03:02:21 PM 1893 5358 69.00 13.00 0.00 82.00 1 mysqld
03:02:23 PM 1893 5358 70.65 15.92 0.00 86.57 1 mysqld
03:02:25 PM 1893 5358 78.11 15.42 0.00 93.53 1 mysqld
03:02:27 PM 1893 5358 80.10 16.92 0.00 97.01 1 mysqld
03:02:29 PM 1893 5358 77.00 14.50 0.00 91.50 1 mysqld
03:02:31 PM 1893 5358 82.50 17.50 0.00 100.00 1 mysqld
03:02:33 PM 1893 5358 84.00 17.50 0.00 100.00 1 mysqld
03:02:35 PM 1893 5358 76.62 12.94 0.00 89.55 1 mysqld
03:02:37 PM 1893 5358 75.50 14.00 0.00 89.50 1 mysqld
03:02:39 PM 1893 5358 76.50 12.50 0.00 89.00 1 mysqld
03:02:41 PM 1893 5358 72.14 12.94 0.00 85.07 1 mysqld
03:02:43 PM 1893 5358 87.56 17.91 0.00 100.00 1 mysqld
03:02:45 PM 1893 5358 79.10 15.92 0.00 95.02 1 mysqld

使用prestment耗时:2549563donw使用prestment耗时:2549722donw使用prestment耗时:2550565donw使用prestment耗时:2550393donw使用prestment耗时:2550779donw使用prestment耗时:2551235donw使用prestment耗时:2551603donw使用prestment耗时:2552023donw使用prestment耗时:2552113donw使用prestment耗时:2552963donw使用prestment耗时:2554546donw使用prestment耗时:2554891donw使用prestment耗时:2556299donw使用prestment耗时:2556401donw使用prestment耗时:2559027donw使用prestment耗时:2559495donw使用prestment耗时:2562710donw使用prestment耗时:2574838

预编译的情况
cpu
3:46:01 PM UID PID %usr %system %guest %CPU CPU Command
03:46:03 PM 1893 5358 59.20 15.42 0.00 74.63 1 mysqld
03:46:05 PM 1893 5358 64.68 16.42 0.00 81.09 1 mysqld
03:46:07 PM 1893 5358 34.00 12.00 0.00 46.00 1 mysqld
03:46:09 PM 1893 5358 64.00 14.00 0.00 78.00 1 mysqld
03:46:11 PM 1893 5358 53.23 12.44 0.00 65.67 1 mysqld
03:46:13 PM 1893 5358 56.00 15.50 0.00 71.50 1 mysqld
03:46:15 PM 1893 5358 61.69 15.92 0.00 77.61 1 mysqld
03:46:17 PM 1893 5358 58.00 14.50 0.00 72.50 1 mysqld
03:46:19 PM 1893 5358 59.20 15.42 0.00 74.63 1 mysqld
03:46:21 PM 1893 5358 63.18 13.93 0.00 77.11 1 mysqld
03:46:23 PM 1893 5358 61.00 17.00 0.00 78.00 1 mysqld
03:46:25 PM 1893 5358 66.67 15.92 0.00 82.59 1 mysqld
03:46:27 PM 1893 5358 58.50 15.50 0.00 74.00 1 mysqld
03:46:29 PM 1893 5358 69.00 14.50 0.00 83.50 1 mysqld
03:46:31 PM 1893 5358 57.50 14.00 0.00 71.50 1 mysqld
03:46:33 PM 1893 5358 62.19 15.92 0.00 78.11 1 mysqld
03:46:35 PM 1893 5358 61.19 14.93 0.00 76.12 1 mysq

使用prestment耗时:2490864donw使用prestment耗时:2491155donw使用prestment耗时:2491443donw使用prestment耗时:2491444donw使用prestment耗时:2491969donw使用prestment耗时:2492106donw使用prestment耗时:2492403donw使用prestment耗时:2493323donw使用prestment耗时:2493960donw使用prestment耗时:2494412donw使用prestment耗时:2495219donw使用prestment耗时:2495254donw使用prestment耗时:2496365donw使用prestment耗时:2496218donw
  conn = DriverManager.getConnection(conn_str);            PreparedStatement pstmt = conn.prepareStatement("insert into bai(name) values( ?)");            for (int i = 0; i < 10000; i++) {                pstmt.setString(1,String.valueOf(i));                pstmt.executeUpdate();                //  ResultSet result = stmt.executeUpdate(sql);            }

MySQL 5.6提供了对服务器端准备语句的支持。 此支持利用高效的客户端/服务器二进制协议。 使用带有占位符的准备好的语句来获取参数值具有以下好处:

每次执行时都不用分析语句的开销。 通常情况下,数据库应用程序处理大量几乎完全相同的语句,只对WHERE查询和删除,SET更新和VALUES等子句中的文字或变量值进行更改。

防止SQL注入攻击。 参数值可以包含未转义的SQL引号和分隔符字符。
mysql预编译相关的参数
max_prepared_stmt_count
该变量限制了服务器中预备语句的总数。 (所有会话中已准备好的语句总数。)它可用于有可能发生拒绝服务攻击的环境,这种攻击是基于通过准备大量语句来运行服务器而造成的。 如果该值设置为低于当前准备好的语句数量,则现有语句不受影响并且可以使用,但是直到当前数字低于限制时才能准备新的语句。 默认值是16,382。 允许的值范围是从0到100万。 将该值设置为0会禁用预准备语句。

状态变量show global status like ‘Prepared%’;显示的是当前的预编译语句数量,连接执行完后,会被清0
jdbc中跟预编译相关的参数设置
useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=256&prepStmtCacheSqlLimit=256

这个参数如果不设置跟没有使用预编译的效果是一样的

原创粉丝点击