测试mysql的sql语句预编译效果
玩Oracle的都比较关注shared pool,特别是library cache,在使用了绑定变量(预编译sql)之后确实能得到很大的性能提升。现在在转Mysql之后特别是innodb很多东西都还能和Oracle对得上号的,就像innodb_buffer_pool_size类似于Oracle的database buffer cache,innodb_log_buffer_size类似于redo log buffer,但是innodb_additional_mem_pool_size仅仅类似于shared pool的Data dictionary cache,似乎还缺少和library cache相对应的东西。那就有一个问题了,在Mysql里面使用预编译的sql还会有性能提升吗?
这里我用Java的jdbc做了一下测试,分别用Statement和PreparedStatement执行1000个sql,并运行10次
1.使用Statement做硬解析:
package exmysql; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date; public class adddata { private static long worker(){
Date begin = new Date(); String driver="com.mysql.jdbc.Driver"; String url="jdbc:mysql://172.16.2.7:3306/testdb"; Connection conn=null;
Statement stmt=null;
ResultSet rs=null; try{
Class.forName(driver);
conn=DriverManager.getConnection(url,"dbaadmin","123456");
stmt=conn.createStatement();
String sql;
for (int i=1;i<=5000;i++){
sql="select * from test1 where id="+i;
rs=stmt.executeQuery(sql);
}
}
catch(SQLException | ClassNotFoundException e){
e.printStackTrace();
} if(stmt!=null){
try{
stmt.close();
}
catch(SQLException e){
e.printStackTrace();
}
} if(conn!=null){
try{
conn.close();
}
catch(SQLException e){
e.printStackTrace();
}
} Date end = new Date();
return end.getTime()-begin.getTime();
} public static void main(String[] args) {
// TODO Auto-generated method stub long elapsed,average;
average=0;
for (int i=1;i<=10;i++){
elapsed=worker();
System.out.println("elapsed time(ms):"+elapsed);
average=average+elapsed;
}
System.out.println("average time(ms):"+average/10);
} }
结果如下:
elapsed time(ms):24652
elapsed time(ms):13380
elapsed time(ms):13250
elapsed time(ms):13877
elapsed time(ms):13275
elapsed time(ms):13193
elapsed time(ms):19022
elapsed time(ms):13558
elapsed time(ms):14138
elapsed time(ms):13364
average time(ms):15170
2.同样的sql用PreparedStatement预编译执行
package exmysql; import java.sql.*;
import java.util.Date; public class insert_data { private static long worker(){
Date begin = new Date(); String driver="com.mysql.jdbc.Driver"; String url="jdbc:mysql://172.16.2.7:3306/testdb"; Connection conn=null;
PreparedStatement pstm=null;
ResultSet rs=null; try{
Class.forName(driver);
conn=DriverManager.getConnection(url,"dbaadmin","123456");
String sql="select * from test1 where id=?";
pstm=conn.prepareStatement(sql);
for(int i=1;i<=5000;i++){
pstm.setInt(1, i);
rs=pstm.executeQuery();
} }
catch(SQLException | ClassNotFoundException e){
e.printStackTrace();
} if(pstm!=null){
try{
pstm.close();
}
catch(SQLException e){
e.printStackTrace();
}
} if(conn!=null){
try{
conn.close();
}
catch(SQLException e){
e.printStackTrace();
}
} Date end = new Date();
return end.getTime()-begin.getTime();
} public static void main(String[] args) {
// TODO Auto-generated method stub long elapsed,average;
average=0;
for (int i=1;i<=10;i++){
elapsed=worker();
System.out.println("elapsed time(ms):"+elapsed);
average=average+elapsed;
}
System.out.println("average time(ms):"+average/10);
} }
结果如下:
elapsed time(ms):14773
elapsed time(ms):16352
elapsed time(ms):14797
elapsed time(ms):15800
elapsed time(ms):12069
elapsed time(ms):14953
elapsed time(ms):13238
elapsed time(ms):12366
elapsed time(ms):15263
elapsed time(ms):13089
average time(ms):
可以看出两种方式执行的结果几乎相同,不像Oracle差距那么大。而且就算是用PreparedStatement的方式,在Mysql数据库端抓出来的sql语句也不是以变量id=?的形式出现的,而是实际的数值。后来在网上看到在连接字符串上加上useServerPrepStmts=true可以实现真正的预编译
String url="jdbc:mysql://172.16.2.7:3306/testdb";
url=url+"?useServerPrepStmts=true";
加上这段后可以在数据库端可以看到明确的结果:
mysql> show global status like 'Com_stmt_prepare';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Com_stmt_prepare | 11 |
+------------------+-------+
1 row in set (0.00 sec)
但是实际的运行结果和上面几乎一样,性能上也没有任何的提升。由此可以推断出Mysql由于缺少类似于Oracle的library cache的部件,因此采用预编译方式执行sql是没有性能上的提升的。
测试mysql的sql语句预编译效果的更多相关文章
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- Mysql常用sql语句(16)- inner join 内连接
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 利用条件表达式来消除交叉连接(cross joi ...
- Mysql常用sql语句(18)- union 全连接
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 其实Mysql并没有全连接,Oracle才有全连 ...
- MySQL 数据库SQL语句——高阶版本2
MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...
- 29.MySQL高级SQL语句
MySQL高级SQL语句 目录 MySQL高级SQL语句 创建两个表 SELECT DISTINCT WHERE AND OR IN BETWEEN 通配符 LIKE ORDER BY 函数 数学函数 ...
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- MySQL数据库sql语句的一些简单优化
1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...
- MySQL数据库SQL语句基本操作
一.用户管理: 创建用户: create user '用户名'@'IP地址' identified by '密码'; 删除用户: drop user '用户名'@'IP地址'; 修改用户: renam ...
随机推荐
- js-异常处理语句
程序运行过程中难免会出错,出错后的运行结果往往是不正确的,因此运行时出错的程序通常被强制中止.运行时的错误统称为异常,为了能在错误发生时得到一个处理的机会,JavaScript提供了异常处理语句.包含 ...
- ActiveMQ学习(四)——应用程序接口
在 Java 里有 JMS的多个实现.其中 apache 下的 ActiveMQ就是不错的选择. 用 ActiveMQ最好还是了解下 JMS JMS 公共 点对点域 发布/订阅域 Connection ...
- 轻松认识JVM运行时数据区域(使用思维导图)
下面是个人阅读周志明编写的深入浅出Java虚拟机做成思维导图的笔记,线条.颜色和图片的视觉印象比起单纯文字笔记好得太多了,文字笔记的枯燥以及硬性记忆我就不再多说,特别对于JVM这块略微有点枯燥的知识, ...
- jQuery的 delegate问题
习惯了bind,用惯了live,就不习惯delegate了呀有木有... 支持为动态生成的标签元素绑定事件也许就live和delegate了吧,不过新版本已经不支持live了,只有delegate d ...
- C#多态--虚方法实现多态
1.虚方法提供一种默认实现,子类可以选择是否重写,如果不重写,那么就使用父类已经实现的方法.(重写可以改变方法的指针) 如果需要改变类型指针,那么需要做方法的重写: 1.如果子类方法是重写方法,那么系 ...
- Silverlight开源项目与第三方控件收集
http://easysl.codeplex.com/ http://compositewpf.codeplex.com/ http://silverlight.codeplex.com/releas ...
- ASP.NET和MSSQL高性能分页
首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ======= ...
- SQL SERVER实例解析
什么是SQL SERVER实例 ------------ SQL SERVER实例的概念和“类与对象”的概念很相似.可以把SQL SERVER的安装程序看做是一个类,安装过程则是创建对象的过程,创建出 ...
- Js中各类型数据到bool的转换
在返回Json字符串给前台时遇到的问题,返回的bool数据总是为TRUE 特意查了一下,发现了Js中各类数据转换到bool型是的结果. 希望能给遇到同样问题的人一点帮助. 数据类型 转换为bool ...
- 获取datatable更新之前的数据
string dd = ds.Tables[0].Rows[0][0, DataRowVersion.Original].ToString() ;